TCP 缓冲区在使用 boost::asio::async_write 时发挥作用?



我从这个讨论中了解到boost::asio::async_write只将数据写入内核缓冲区。这并不意味着对等方已收到数据。但是,如果我发送大小的大数据包,假设每个数据包 200000 字节,然后我拉动网线突然终止连接。它是否还会继续报告,说每个async_write写入内核缓冲区的 200000 字节?我的测试表明它没有。它放弃了像 200000 字节这样的大缓冲区,并且不会报告发送的所有字节。但是,如果它是一个像 30-40 字节这样的小缓冲区,它会继续报告好吗?

问题
提出这个问题的主要要点是:是否有一个底层缓冲区大小在某一时刻被填满,async_write说现在它不能再写入了,因为之前计划的数据没有消失?如果是,那么这个基础缓冲区的大小是多少?我可以从boost::asio::ip::tcp::socket查询吗?

您可以使用套接字选项查询/更改底层系统套接字缓冲区大小send_buffer_size。

操作系统可以动态调整套接字缓冲区大小并限制其最大大小:

tcp_wmem (since Linux 2.4)
This is a vector of 3 integers: [min, default, max].  These
parameters are used by TCP to regulate send buffer sizes.  TCP
dynamically adjusts the size of the send buffer from the
default values listed below, in the range of these values,
depending on memory available.

最新更新