为什么开启TCP_NODELAY选项或TCP_QUICKACK选项都不能解决ACK延迟问题

skysky97 2018-08-29 05:42:21
问题:

客户端需要发送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));

然而测试结果并没有发生变化,是不是还有其他因素影响?
...全文
1986 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
adam1995mmm 2019-12-28
  • 打赏
  • 举报
回复
两边都设置一下
Evan_ZGYF丶 2018-09-03
  • 打赏
  • 举报
回复
等待大神,学习一下

感觉这里面涉及太多:物理链路、网卡驱动、协议栈、数据的拷贝和搬运等等...

4,358

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧