设置TCP_QUICKACK和TCP_NODELAY

时间:2011-09-02 16:36:36

标签: c linux sockets tcp

如果你在套接字上的每个调用上设置了TCP_QUICKACK设置,之前设置了TCP_NODELAY,QUICKACK选项是否会覆盖NODELAY调用?

连接时:

int i = 1;
setsockopt( iSock, IPPROTO_TCP, TCP_NODELAY, (void *)&i, sizeof(i));

每次写:

int i = 1;
setsockopt( iSock, IPPROTO_TCP, TCP_QUICKACK, (void *)&i, sizeof(i));

TCP_QUICKACK的调用是否会使之前的TCP_NODELAY调用无效?

3 个答案:

答案 0 :(得分:23)

这两个选项之间没有直接关系,它们仅用于不同目的。

TCP_NODELAY 旨在禁用/启用段缓冲,以便尽快将数据发送到对等方,因此通常用于提高网络利用率。 TCP_QUICKACK 用于尽早发送确认而不是在某些协议级别交换下延迟,并且它不稳定/永久,后续TCP事务(可能发生在幕后)可以忽略此选项,具体取决于实际协议级别处理或用户设置与堆栈行为之间的任何实际分歧。

注意 TCP_NODELAY是可移植的,而TCP_QUICKACK不可移植(仅适用于Linux 2.4.4 +)。

答案 1 :(得分:8)

使用TCP_QUICKACK,而不是TCP_NODELAY

  

启用TCP_NODELAY具有类似的效果,但可以提高吞吐量   小写的更糟糕。如果你写一个只发送一些的循环   字节(最坏情况,一个字节)到一个带有" write()"和Nagle的套接字   使用TCP_NODELAY禁用算法,每次写入成为一个IP   包。使用IP和TCP可将流量增加40倍   每个有效负载的标头。 Tinygram预防不会让你发送   第二个数据包,如果你有一个在飞行中,除非你有足够的数据   填充最大大小的数据包。它累积一轮的字节   行程时间,然后发送队列中的所有内容。这几乎总是如此   你想要什么。如果设置了TCP_NODELAY,则需要更多   意识到缓冲和冲洗问题。这些都不重要   单向传输,今天是大多数HTTP。 (我从来没有看过   这对SSL握手的影响可能很重要。)简短   version:设置TCP_QUICKACK。如果你找到一个可以制造东西的案例   更糟糕的是,让我知道。约翰纳格尔

https://news.ycombinator.com/item?id=10608356

答案 2 :(得分:3)

TCP_QUICKACK和TCP_NODELAY会影响TCP中的不同操作。 tcp(7)手册页描述了TCP的哪些套接字选项相互干扰,例如: TCP_CORK和TCP_NODELAY。