C - 如果MTU最大化,则仅发送TCP数据包

d.h*_*ill 0 c networking tcp mtu

有没有内置的功能(标志,参数,等等..)只有当它的MTU(几乎)满时才发送TCP数据包?

我希望我的假设是正确的,数据总是被发送,并且它包含多少有效载荷无关紧要(试图通过wireshark找到它).

最好的祝福

nos*_*nos 6

我希望我的假设正确,数据总是发送

不,TCP堆栈通常捆绑数据并发送大段(它不会永远等待,通常只是一段时间) - 通常使用Nagles算法或某些变体.

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

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

int ndelay = 1;
setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(char *)&ndelay ,sizeof(ndelay));
Run Code Online (Sandbox Code Playgroud)

Linux也通过TCP_CORK提供相应的,也许更接近你所要求的.

TCP_CORK如果设置,则不发送部分帧.再次清除该选项时,将发送所有排队的部分帧.这对于在调用sendfile(2)之前预先添加标头或用于吞吐量优化非常有用.正如目前实施的那样,TCP_CORK的输出时间上限为200毫秒.如果达到此上限,则自动发送排队的数据.自Linux 2.5.71起,此选项只能与TCP_NODELAY结合使用.此选项不应用于可移植的代码中.

  • 出于好奇,将TCP_CORK与TCP_NODELAY结合起来做了什么? (2认同)