tcp居然会数据延迟40ms被发送

Posted shuangyueliao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tcp居然会数据延迟40ms被发送相关的知识,希望对你有一定的参考价值。

tcpdump是很好的tcp分析工具,在此配合nc命令来学习tcpdump

  1. nc -l 8000
  2. tcpdump -S -n -i lo tcp and host 127.0.0.1 and port 8000
  3. nc localhost 8000

第一步是启动8000端口
第二步是启动抓包程序
第三步是建立一次握手连接,ctrl+c是退出客户端,能看到四次挥手
红色区域是三次握手,蓝色区域是一次数据发收,绿色区域是四次挥手(有一个ack包被合并了所以只有三行)
技术图片

tcpdump的参数解释
| 参数 | 解释 |
|------|------------|
| -n | 显示ip |
| -i | 抓取网卡lo |
| tcp and host 127.0.0.1 and port 8000 | 过滤表达式 |

tcp的标示位在[]中,[S]表示SYN,[F.]表示FIN,而.表示ACK

为什么服务端收到数据后有时要等40ms后才会ack?
这是因为Delay ACK的原因(Linux上默认是关闭delay ack)。delay ack的累积确认让多个报文的ack合成一个ack返回。而捎带确认就是如服务器有返回数据,那么会带上上一个ack。

Nagle
它是Delay ACK的另一种相对的算法,它旨在减少网络中的tcp报文数量,Nagle默认是开启的。

Nagle原理

  • 一个TCP连接上最多只有一个未确认的未完成的小分组,在它到达目的地前不能发送其它分组
  • 未收到上一个小分组ack前,tcp会收集其它小分组组成一个大分组待收到ack后发送出去

如果同时开启Delay ACK和Nagle将会导致每次数据请求都会延迟40ms,如果对实时性有很高要求,可同时关闭delay ack和nagle,它们都会导致ack包延迟发送

以上是关于tcp居然会数据延迟40ms被发送的主要内容,如果未能解决你的问题,请参考以下文章

TCP Nagle算法以及延迟确认(即延迟回复ACK)的学习

神秘的40毫秒延迟与 TCP_NODELAY

TCP/IP之TCP_NODELAY与TCP_CORK

TCP之Nagle算法&&延迟ACK

如何避免 UWP TCP 客户端的延迟?

TCP连接TIME-WAIT解决方案