问题:
客户端需要发送2062字节数据,然后从服务器读取响应。
通过wireshark抓包,数据分成了1460字节和602字节两段发送。
如图所示:发送第一段1460字节后,服务器等待40ms后才发送ACK;客户端也是收到ACK后才发送第二段的602字节。
现象看起来跟Nalge算法和ACK延迟确认机制相符。客户端发送的第一段数据大小满足MSS,立即发送。服务器收到后因为要等待接收剩下的602个字节,所以没有发送响应数据,也就不能携带ACK,导致ACK延迟。客户端第二段602字节数据因为第一段数据没有确认而被延迟发送,直到40ms后收到ACK。
于是,客户端参照网上的教程设置了TCP_NODELAY选项:
int flag = 1;
result = setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));
服务器在每次recv后设置TCP_QUICKACK选项:
int quickack = 1;
result = setsockopt(sockset[socknr].sockfd, IPPROTO_TCP, TCP_QUICKACK, &quickack, sizeof(int));
然而测试结果并没有发生变化,是不是还有其他因素影响?