最小的TCP接收窗口大小

时间:2019-03-22 12:40:39

标签: sockets tcp network-programming

Linux内核TCP / IP堆栈impl可以宣布最小的TCP接收窗口大小,我如何配置使其宣布这样的大小?我的目标是实现低延迟并牺牲吞吐量吗?

1 个答案:

答案 0 :(得分:1)

  

现在,我的测试客户端应用程序每秒从缓冲区读取大约128个字节,TCP堆栈等待,直到有可用的SO_RCVBUF / 2个字节的空间,然后再通知服务器新的窗口大小。如果可能的话,我想让客户宣布的窗口尺寸小于SO_RCVBUF / 2。

我认为更改接收窗口大小不会对延迟产生任何影响。

但是,由于您的消息很小(128字节),因此您可能想禁用发件人中的Nagle algorithm ,这会使发件人在发送小于MSS的TCP有效载荷时会等待:

  

期望实时响应和低延迟的应用程序对Nagle的算法反应较差。诸如网络多人视频游戏或远程控制操作系统中的鼠标移动之类的应用程序期望立即发送动作,而该算法则有目的地延迟传输,以延迟为代价提高带宽效率。因此,具有低带宽时间敏感传输的应用程序通常使用TCP_NODELAY绕过Nagle延迟。

在接收器上,您可能想禁用TCP delayed acknowledgements

  

与某些应用程序和配置进行交互时,延迟的ACK引入的额外等待时间可能导致进一步的延迟。如果发送方正在使用Nagle的算法,则发送方会将数据排队,直到接收到ACK。如果发送方没有发送足够的数据来填充最大段大小(例如,如果执行两次小写,然后进行阻塞读取),则传输将暂停直至ACK延迟超时。 Linux 2.4.4+支持TCP_QUICKACK套接字选项,该选项可禁用延迟的ACK。

C ++代码:

void disableTcpNagle(int sock) {
    int value = 1;
    if(::setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &value, sizeof value)) 
        throw std::system_error(errno, std::system_category(), "setsockopt(TCP_NODELAY)");
}

void enableTcpQuickAck(int sock) {
    int value = 1;
    if(::setsockopt(sock, IPPROTO_TCP, TCP_QUICKACK, &value, sizeof value)) 
        throw std::system_error(errno, std::system_category(), "setsockopt(TCP_QUICKACK)");
}