tcp-tcpdump抓包第三次握手ack数值为1

19次阅读

共计 1526 个字符,预计需要花费 4 分钟才能阅读完成。

在用 tcpdump 抓包时,发现前面两次握手的 seq 和 ack 能对应起来,但是第三次由客户端发起的确认 ack 值为 1,熟悉 tcp 三次握手的都知道,ack 的值是对方的 seq+1,第三次握手的 ack 值不应该是 1,测试抓了各种端口的 tcp 包发现都是这样,难道是因为 tcp 协议改动了?

tcpdump 抓包复现

直接 tcpdump 命令即可,如果更详细点的信息,可加 - v 不过跟当前复现内容没有太多关系

14:29:06.049398 IP 100.116.251.137.53686 > 10.0.0.15.81: Flags [S], seq 413886776, win 29130, options [mss 1942,sackOK,TS val 2047175890 ecr 0,nop,wscale 9], length 0
14:29:06.049406 IP 10.0.0.15.81 > 100.116.251.137.53686: Flags [S.], seq 1511062036, ack 413886777, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
14:29:06.049711 IP 100.116.251.137.53686 > 10.0.0.15.81: Flags [.], ack 1, win 57, length 0
14:29:06.050075 IP 100.116.251.137.53686 > 10.0.0.15.81: Flags [P.], seq 1:20, ack 1, win 57, length 19
14:29:06.050087 IP 10.0.0.15.81 > 100.116.251.137.53686: Flags [.], ack 20, win 115, length 0
14:29:06.050107 IP 10.0.0.15.81 > 100.116.251.137.53686: Flags [P.], seq 1:184, ack 20, win 115, length 183
14:29:06.050118 IP 10.0.0.15.81 > 100.116.251.137.53686: Flags [F.], seq 184, ack 20, win 115, length 0

第一行 100.116.251.137 端口 53686 向 10.0.0.15 端口 81 发起了 SYN 主动连接的请求,seq 为 413886776

第二行 10.0.0.15.81 端口 81 向 100.116.251.137 端口 53686 发起了 SYN 请求,seq 为 1511062036,注意 ack 是 413886776+1=413886777
那么以上两次都没什么问题,正常的握手

问题出在第三行,本来按照三次握手,最后确认,ack 应该是第二次握手的 seq+1,也就是 1511062036+1=1511062037,这才是正确的 ack,但 tcpdump 抓包的显示是 1

利用 wireshark 分析

于是将 tcp 包抓到本地,利用 wireshark 来分析下看看能否找到答案

抓包命令
tcpdump -w test.cap

上面这张图就是三次握手的包在 wireshark,前三行封包就是三次握手,发现在 wireshark 里面 seq 从 0 开始,其实 seq 也不是 0,可以看下面的具体值。不过第三次握手依然显示 ack=1

通过 wireshark 逐行分析
第一行

seq:82 dc ee f2
ack:0

第二行
seq

ack

seq:7c d5 55 21
ack:82 dc ee f3
ack 的值刚好是第一行的 seq+1

第三行

ack:7c d5 55 22

结语
看到这里就明白了,第三次握手的 ack 虽然在 tcpdump 显示为 1,但是值是第二行的 seq+1
因此不是 tcp 三次握手协议变了,应该是 tcpdump 简化了显示

正文完
 0