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

时间:2011-02-07 18:11:06

标签: c networking tcp mtu

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

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

最好的问候

3 个答案:

答案 0 :(得分:6)

  

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

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

可能还有其他问题影响如何缓冲和发送数据,例如:网络是多么拥挤。通常,TCP堆栈非常适合实现最大吞吐量,通常你不应该试图超越它。

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

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

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

  

TCP_CORK 如果设置,请不要发送   部分帧。所有排队部分   选项是时发送帧   再次清除。这很有用   在调用前添加标题   sendfile(2),或吞吐量   优化。目前   实施后,有一个200   毫秒上限的时间   哪个输出被TCP_CORK塞住。如果   达到这个上限,然后排队   数据自动传输。   此选项可以与   TCP_NODELAY仅在Linux 2.5.71之后。   不应在代码中使用此选项   打算携带。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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