首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只发送TCP数据包,如果MTU最大限度地用完了

只发送TCP数据包,如果MTU最大限度地用完了
EN

Stack Overflow用户
提问于 2011-02-07 18:11:06
回答 3查看 682关注 0票数 0

是否有内置于功能中的(标志、参数等)只有在MTU (几乎)满的时候才发送TCP数据包?

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

诚挚的问候

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-07 18:16:11

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

不,TCP堆栈通常会打包数据并发送大段(虽然它不会永远等待,通常只是一段时间)--通常使用Nagles算法或某种变体。

还可能存在其他一些影响数据缓冲和发送方式的问题,例如网络有多拥挤。通常,TCP堆栈在实现最大吞吐量方面非常出色,通常您不应该试图超过它。

如果需要较低的延迟时间,则可以通过设置TCP_NODELAY套接字选项禁用Nagle的algoritm

代码语言:javascript
复制
int ndelay = 1;
setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(char *)&ndelay ,sizeof(ndelay));

Linux也通过TCP_CORK提供了oposite,也许更接近您所要求的内容。

如果设置了TCP_CORK,则不要发送部分帧。当再次清除选项时,将发送所有排队的部分帧。这对于调用sendfile(2)之前的前置标头或吞吐量优化非常有用。正如目前所实现的,在输出被TCP_CORK塞住的时间上有200毫秒的上限。如果达到了这个上限,那么排队的数据就会自动传输。只有在Linux2.5.71之后,这个选项才能与TCP_NODELAY结合。此选项不应用于打算可移植的代码中。

票数 6
EN

Stack Overflow用户

发布于 2011-02-07 18:14:42

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

票数 0
EN

Stack Overflow用户

发布于 2011-02-07 18:16:05

TCP有一个接近您想要的SO_SNDLOWAT选项。不过,它没有在Linux上实现,也没有以任何方式保证分组化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4924808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档