2011-02-07 28 views
0

是否有内置功能(标志,参数,无论..)只有当MTU(接近)满时才发送TCP数据包?C - 只有在MTU超出时发送TCP数据包

我希望我对自己的假设是正确的,即数据总是被发送出去,并且无论它包含多少有效载荷(试图通过wireshark发现)都无关紧要。

最好的问候

+0

它确实很重要。谷歌“Nagle的算法”。 – 2011-02-07 18:12:49

回答

6

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

不,TCP堆栈通常捆绑了数据和发送大段(它不会永远等下去虽然,经常只是一会儿) - 通常使用Nagles algorithm或某些变体。

也可能有其他一些问题影响数据如何缓冲和发送,例如,网络如何拥塞。一般来说,TCP堆栈非常适合最大吞吐量,通常你不应该试图超越它。

如果需要更低的延迟,虽然,你可以禁止使用Nagle algoritm,通过设置TCP_NODELAY套接字选项

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

Linux提供了oposite为好,也许更接近你的要求,通过的手段TCP_CORK。

TCP_CORK如果设置,不发送 部分帧。当选项 再次被清除时,所有排队的部分 帧被发送。在调用 sendfile(2)或优化吞吐量 之前,这对于 预先标头非常有用。由于目前执行了 ,所以 的输出被TCP_CORK锁定的时间最长为200毫秒。如果 达到此上限,则排队的 数据会自动传输。 该选项仅可用于Linux 2.5.71以后的TCP_NODELAY,可与 结合使用。 此选项不应在代码 中使用,以便携带。

+0

非常有帮助。坦克很多。 – 2011-02-07 18:43:17

0

不,没有。你必须编译一个自定义的网络驱动程序来实现类似的东西。 由于在当今的网络中,MTU不再扮演重要角色(如果有的话)。

0

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