0%

Wireshark 中常见的 TCP Info

wireshark 抓包分析 TCP 常见信息

TCP Previous segment not captured

前一个 TCP 分段没有抓到。 在 TCP 连接建立的时候,SYN 包里面会把彼此 TCP 最大的报文段长度,即 MSS 标志,一般都是 1460。如果发送的包比最大的报文段长度长的话就要分片了,被分片出来的包,就会被标记了TCP segment of a reassembled PDU这些包分片存在同样的ack number,且每个分片的seq number不同

这些分片正常应该是连续接收的,即前一个分片指示的next seq number即为下一个收到的分片的seq number。假如收到的下一个分片的seq number与上一个比不连续的话,wireshark 就会将该分片标记为TCP Previous segment not captured。如下图,ack number为 500 的 TCP 包被分为多个分片发送,在1346后应该收到一个seq=60817 ack number=500的包,但是1347seq=62265 ack number=500

1553073720428

需要注意的是,前一个分片丢失,有可能是网络中确实丢失了,或者晚到了,也有可能是 wireshark 本身并没有抓到。

TCP out-of-order segment

Wireshark 判断TCP out-of-order是基于 TCP 包中 SEQ number 并非期望收到的下一个 SEQ number,则判断为 out-of-order。因此,出现 TCP out-of-order 时,很大可能是 TCP 存在乱序或丢包,导致接收端的 seq number 不连续。 如上图1349,在客户端已经收到服务端的 TCP 包seq=62265 ack number=500,服务端再次发送了 TCP 包seq=60817 ack number=500,wireshark 将此包标记为 out-of-order。

如果抓包中出现大量的 out-of-order 包,则说明网络存在较大的 TCP 乱序或丢包。

TCP Spurious Retransmission

TCP 虚假重传。 发送端重发了一个已经收到应答的报文段。
当抓到 2 次同一包数据时,wireshark 判断网络发生了重传,同时,wireshark 抓到初传包的反馈 ack,因此 wireshark 判断初传包实际并没有丢失,因此称为虚假重传。基于 wireshark 的判断机制,如果抓包点在客户端的话,虚假重传一般为下行包,因为这时,客户端在收到服务端的下行包后发送反馈 ack,并被 wireshark 抓到,但很有可能服务端未收到此反馈 ack,RTO 超时,触发服务端重传。如下图,红框内出现了 2 次虚假重传,其中绿色的两条为同一包数据,粉色的两条为同一包数据。

1553135965445

TCP Retransmission

TCP 重传。
当抓到 2 次同一包数据时,wireshark 判断发生了重传,同时 wireshark 没有抓到初传包的反馈 ack,因此,wireshark 判定重传有效,标记为 TCP Retransmission。基于软件的判定机制,如果抓包点在客户端的话,TCP 重传一般为上行包,因为这时,客户端并没有收到服务端的反馈 ack,无从知晓服务端是否收到了初传包,RTO 超时后触发客户端重传。此时存在 2 种情况:

  1. 服务端收到了初传包,只是下发的反馈 ack 丢包,客户端没有收到
  2. 服务端没有收到初传包,因此也就没有下发反馈 ack

如下图,红线的 TCP 包为重传包,wireshark 为该包添加了重传原因,是由于 TRO 超时导致,以及初传包序号 45,并给出了当前的 RTO 超时时间。

1553138137570

TCP fast Retransmission

TCP 快速重传。
TCP 协议设定了快速重传机制以避免过多的慢启动对传输速率的影响。快速重传通过接收到 3 个或 3 个以上重复的 ack 反馈触发。快速重传不需要等待 RTO 超时。如下图。
325 包,客户端向服务端反馈 ack=133251,说明下一个期望收到服务端 seq=133251 的包;
326 包,服务端向客户端发送了 seq=135771 的数据包,与客户端的期望不符,因此客户端在 327 包重传了 ack=133251 的包,再次申明期望收到 seq=133251 的包。Wireshark 将重复 ack 标记为 TCP Dup ACK,#后边指明为第几次重传。
328 包,服务端向客户端发送了 seq=137031 的数据包,仍然与客户端期望不符,客户端在 329 包再次重传 ack=133251 的包。
330 包,服务端收到 3 次重复 ack,触发快速重传,重传了 seq=133251 的 TCP 分片。

1553138255811

TCP Dup ACK

重复 ack。
当网络中存在乱序或者丢包时,将会导致接收端接收到的 seq number 不连续。此时接收端会向发送端回复重复 ack,ack 值为期望收到的下一个 seq number。重复 ack 数大于等于 3 次将会触发快速重传。如下图,
315 包,客户端向服务端发送 ack=126951 的反馈,期望下一包收到 seq=126951 的 TCP 包。但下一包接收到的却是 seq=128211 的 TCP 包,由于 seq 不连续,wireshark 将该报标记为 TCP Previous segment not captured。
317 包,客户端向服务端重复发送 ack=126951 的包,第一次重发,#后边带 1。
318 包,客户端收到 seq=126951 的 TCP 包。
319 包,截止到 seq=129471 的所有 TCP 包全部收到,因此客户端回复了 ack=129471 的反馈。

1553138354613

TCP window update

TCP 窗口更新。
当接收方的 TCP window 发生突变时,接收方通过 TCP window update 消息告知对方当前的接收窗口大小。如下图,TCP window Update 同时携带了反馈 ack,ack 序列号与前一个反馈 ack 序列号相同,但这并不是重复 ack。

1553138386419

TCP acked unseen segment

反馈 ACK 指向了一个未知的 TCP 片段。
这个意思是说 ACK 反馈的是一个 wireshark 上不存在的 TCP 包。很可能是 wireshark 漏抓了这个包,但却抓到了对端反馈的该报的 ack 包。如下图,标记为 ack unseen segment 的包反馈的 ack=2721,看着像是反馈的 seq=1361 的包,但其实这个 ack 还反馈了 seq=1 的包,由于 seq=1 的包没有抓到,因此 wireshark 将反馈 ack 标记为 ack unseen segment。从下面的图还可知,由于对端已经反馈了 ack=2721,说明发端发送的 seq=1 的包,对端也收到了,只不过 wireshark 可能漏抓了而已。

1553138458034

TCP ZeroWindow

TCP 滑动窗口为 0。
当发送端发包速率大于接收端的接收速率时,会造成接收端 TCP window 越来越小,当接收端在反馈 ack 时携带的 window size=0 时,wireshark 标记 TCP Zero window。此时发送端将暂停发送数据,直到收到接收端 window size!=0 的标志。

1553138431304

TCP window full

TCP window 满。
是指的发送端发送的数据已经达到的接受窗口的上限。发送端暂停发送,等待新的接收窗口的通告。
如下图,客户端向服务端发送的 ack 反馈,期望下一包收到的 seq=288961,但接收窗口仅有 960,服务端在收到 ack 后发送了 960 字节的数据,TCP window full。注意,len=1004 是整个 IP 包的长度,需要减去 IP 头 44 字节,即 960 字节。

1553138486481

TCP RST

TCP 重置。
是 TCP 协议结束异常连接的一种方式,通过 flog 中的 reset=1 标记。当 TCP 连接无法通过正常的 4 次挥手结束时,一方可以通过发送携带 reset 标志的 TCP 包结束 TCP 连接。
如下图,发送方通过 2 个 TCP 流发送数据,截图中,接收方首先向发送方反馈了 TCP window=0,让发送方暂缓发送数据,之后紧接着发送了 TCP RST 标记,释放了 TCP 连接。猜测可能接收方程序突然崩溃了,导致缓存区数据没法清空,之后接收方系统发送了 TCP reset 释放 TCP 连接。

1553145383560

Ref

  1. 抓包分析之 “TCP Previous segment not captured”
  2. Wireshark 中的”TCP Spurious Retransmission”
  3. Spurious Retransmissions