繁体   English   中英

C-仅在MTU达到最大值时才发送TCP数据包

[英]C - Only send TCP packet if MTU is maxed out

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

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

最好的祝福

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

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

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

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

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组合使用。 此选项不应在旨在可移植的代码中使用。

不,没有。 您必须编译一个自定义网络驱动程序才能实现类似的功能。 也没有必要这样做,因为在当今的网络中,MTU不再扮演重要角色(如果有的话)。

TCP具有接近您想要的SO_SNDLOWAT选项。 但是,它尚未在Linux上实现,并且不能以任何方式保证打包。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM