是否有内置于功能中的(标志、参数等)只有在MTU (几乎)满的时候才发送TCP数据包?
我希望我的假设是正确的,数据总是被发送,不管它包含多少有效载荷(试图通过wireshark找到它)。
诚挚的问候
发布于 2011-02-07 18:16:11
我希望我的假设是正确的,数据总是被发送
不,TCP堆栈通常会打包数据并发送大段(虽然它不会永远等待,通常只是一段时间)--通常使用Nagles算法或某种变体。
还可能存在其他一些影响数据缓冲和发送方式的问题,例如网络有多拥挤。通常,TCP堆栈在实现最大吞吐量方面非常出色,通常您不应该试图超过它。
如果需要较低的延迟时间,则可以通过设置TCP_NODELAY套接字选项禁用Nagle的algoritm
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结合。此选项不应用于打算可移植的代码中。
发布于 2011-02-07 18:14:42
不,没有。你必须编译一个自定义的网络驱动程序来实现类似的东西。也没有必要这样做,因为在今天的网络中,MTU不再扮演重要的角色(如果有的话)。
发布于 2011-02-07 18:16:05
TCP有一个接近您想要的SO_SNDLOWAT选项。不过,它没有在Linux上实现,也没有以任何方式保证分组化。
https://stackoverflow.com/questions/4924808
复制相似问题