0

是否有任何内置功能(标志、参数等)仅在其 MTU(几乎)已满时才发送 TCP 数据包?

我希望我的假设是正确的,即始终发送数据并且它包含多少有效负载并不重要(试图通过wireshark找到它)。

最好的祝福

4

3 回答 3

6

我希望我的假设是正确的,即始终发送数据

不,TCP 堆栈通常捆绑数据并发送大段(尽管它不会永远等待,通常只是一小会儿) - 通常采用 Nagles 算法或某种变体。

可能还有其他问题会影响数据的缓冲和发送方式,例如网络的拥塞程度。通常,TCP 堆栈非常擅长实现最大吞吐量,通常您不应该试图超越它。

如果你需要更低的延迟,你可以禁用 Nagle 的算法,通过设置 TCP_NODELAY 套接字选项

int ndelay = 1;
setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(char *)&ndelay ,sizeof(ndelay));

Linux 通过 TCP_CORK 也提供了相反的功能,可能更接近您的要求。

TCP_CORK如果设置,则不发送部分帧。再次清除该选项时,将发送所有排队的部分帧。这对于在调用 sendfile(2) 之前添加标头或吞吐量优化很有用。按照目前的实施,TCP_CORK 对输出进行软木塞的时间有 200 毫秒的上限。如果达到此上限,则自动传输排队的数据。只有从 Linux 2.5.71 起,此选项才能与 TCP_NODELAY 结合使用。此选项不应在旨在可移植的代码中使用。

于 2011-02-07T18:16:11.640 回答
0

不,没有。您必须编译一个自定义网络驱动程序来实现类似的东西。也没有必要这样做,因为在当今的网络中,MTU 不再发挥重要作用(如果有的话)。

于 2011-02-07T18:14:42.433 回答
0

TCP 有一个SO_SNDLOWAT接近您想要的选项。但它并未在 Linux 上实现,也不保证以任何方式进行打包。

于 2011-02-07T18:16:05.610 回答