TCP DUP ACK抓包分析

Posted 造夢先森

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP DUP ACK抓包分析相关的知识,希望对你有一定的参考价值。

vm client:172.18.21.57
vm server:172.18.42.13

在 vm client 执行 wget 从 server 下载大文件速度逐渐变为0 ,进行抓包分析:
在这里插入图片描述
分析:
1,
No.50 为server发送的数据,收到了Seq=113587,Ack=660, Len=2576。
那么client回复的Ack=113587+2576=116163. 即No.51, Seq=660,Ack=116163, Len=0

2,
同时116163也是期望的下一个数据的Seq. 即收到了No.52, Seq=116163,Ack=660, Len=2576;
再下一个收到了数据的Seq=116163+2576=118739. 即No.53,Seq=118739,Ack=660, Len=1288;

3,
再下一个期望收到数据的Seq=118739+1288=120027。在 No.55 client回复Ack=120027, Len=0
但No.54,收到了Seq=121315,Ack=660, Len=1288;

报文被标识为TCP Previous segment not captured,提示此报文之前的一个或多个报文没有被捕获到(即Seq=120027的包没收到)。

4,No.56,基于No.54收到了的Seq=121315+1288=122603, Ack=660,Len=2576

5,No.57, Ack=120027, Len=0
client发现预期的报文(即Seq=120027)迟迟没收到,便会发送重复的ack报文请求丢失的第一个报文,从而出现被标识为TCP dup ack的报文(重复应答),#前的表示报文到哪个序号丢失,#后面的是表示第几次丢失(可能由于乱序还没收到,也可能真的丢了)

6,
No.58 收到了期望的Seq=120027的报文,但是OutOf-Order

经分析这一次收到的Seq=120027只是由于乱序到达慢了,并不是由于前一个丢了,DUP ACK之后server再回的,因为server端抓包发现收到DUP ACK之后并没有回:
在这里插入图片描述
发送Seq=113587的数据在No.37. 连续发送了两个数据:
No.37,Seq=113587,Ack=660, Len=21896;
No.38,Seq=135483,Ack=660, Len=30912;
No.39,收到了client回的Ack=116163
No.40和No.41收到了client要求重传的Ack,但是并没有重传?

再往后看:
在这里插入图片描述
TCP Dup ACK 发送了多达47次都没有回,
而TCP Retransmission原因很明显是上面的超时引发的数据重传,并没有快速重传

虚拟机里sysctl有个配置项 net.ipv4.tcp_sack = 1, 经确认已经启用
#关闭tcp_sack
#启用有选择的应答(Selective Acknowledgment),
#这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);
#(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用。

最终确认问题导致原因如下:

问题现象
当出现这三个条件共存的情况下会出现scp速度变为0问题。
设置防火墙规则过滤掉sack-permitted、sack 报文头信息:
[root@EulerOS-BaseTemplate ~]# iptables -L -t mangle

Chain INPUT (policy ACCEPT)
target prot opt source destination
TCPOPTSTRIP tcp – anywhere anywhere TCPOPTSTRIP options mss,sack-permitted,sack,timestamp,md5

设置 tcp_sack = 1
[root@EulerOS-BaseTemplate ~]# sysctl -a | grep tcp_sack
net.ipv4.tcp_sack = 1
在链路上发生丢包。
原因分析
net.ipv4.tcp_sack与防火墙规则冲突导致。
tcp_sack 设置快速重传,但是防火墙规则把sack需要的信息给strip掉了,导致重传的数据失效,只能慢速传输,速度到最低。
在不发生丢包的情况下,没有触发重传场景,则不复现该问题。
解决方法
有两种修改方法,解决冲突问题:

打开sack功能,把防火墙过滤sack-permitted,sack规则去掉,在丢包场景下tcp性能较好。
关闭sack功能,设置net.ipv4.tcp_sack = 0,在丢包乱序场景下tcp性能较差。

以上是关于TCP DUP ACK抓包分析的主要内容,如果未能解决你的问题,请参考以下文章

TCP ------ 抓包分析

TCP三次握手与Tcpdump抓包分析过程

WireShark基本抓包数据分析

wireshark学习笔记:TCP协议抓包分析

基于wireshark抓包分析TCP的三次握手

wireshark抓包,异常数据分析常见RST介绍