网络数据包分析工作做久了,习惯性的就会存有一堆的跟踪文件,不及时整理的话,下次再看到有的跟踪文件就完全记不起来是什么情况了。😂 两眼墨黑
本次案例就是如此,跟踪文件名 client-fast-retrans.pcapng,乍看名字是关于快速重传的案例,准备分类重新存放的时候顺手打开了下,不瞅还好,一瞅还发现了一个 Wireshark TCP Analysis
的问题,故分享记录下。
数据包跟踪文件基本信息如下:
$ capinfos client-fast-retrans.pcapng
File name: client-fast-retrans.pcapng
File type: Wireshark/... - pcapng
File encapsulation: Ethernet
File timestamp precision: microseconds (6)
Packet size limit: file hdr: (not set)
Number of packets: 27
File size: 17 kB
Data size: 17 kB
Capture duration: 0.311468 seconds
First packet time: 2015-06-02 22:11:59.655051
Last packet time: 2015-06-02 22:11:59.966519
Data byte rate: 54 kBps
Data bit rate: 436 kbps
Average packet size: 629.70 bytes
Average packet rate: 86 packets/s
SHA256: 6ee7b5061a54bc22b44fe5bdbd10d7f0fcc2fdb63dd45f9bbf3327eefb15a191
RIPEMD160: cd8614df4aa3316508290308c4b875459b9a9419
SHA1: 42704ab0674942a2cfcd77404784c7409b67283c
Strict time order: True
Capture application: Editcap 2.6.13
Number of interfaces in file: 1
Interface #0 info:
Encapsulation = Ethernet (1 - ether)
Capture length = 65535
Time precision = microseconds (6)
Time ticks per second = 1000000
Number of stat entries = 0
Number of packets = 27
因为跟踪文件数据包数量总共就 27 个,专家信息所显示的一些问题像是重传或是快速重传的数量也就只 1 个。
实际数据包分析,TCP 三次握手主要如下
完整数据包信息如下
跟踪文件为一个 HTTP 交互,在 TCP 三次握手正常建立连接后,客户端进行了 HTTP GET 请求了一个大小为 100MB 的 bin 文件,服务器响应 HTTP 200 OK ,之后正常传输文件。
首先说到一个常谈的问题,如何判断该跟踪文件的捕获点是哪?
该跟踪文件最后只能判断是在客户端或靠近客户端的二层交换环境上所捕获。
关于如何判断跟踪文件的捕获点,有兴趣的同学可以查看之前一篇完整的文章《捕获点之 TCP 三次握手》。
回到数据包快速重传问题,主要信息如下
初看下来好像和普通的快速重传现象没什么区别,初步分析过程:
TCP Previous segment not captured
;TCP Fast Retransmisson
。所以感觉像是 Wireshark 判断为快速重传确实合情合理,但是细细一琢磨,会发现里面有些问题:
但为什么 Wireshark 会判断为快速重传,这个自然是 Wireshark TCP 分析的逻辑,TCP Fast Retransmission
部分说明如下(有兴趣的同学也可以直接查看源代码)。在以下条件完全满足的情况下,Wireshark 会标记为快速重传,用以替代乱序或重传。
TCP Fast Retransmission
Set when all of the following are true:
This is not a keepalive packet.
In the forward direction, the segment size is greater than zero or the SYN or FIN is set.
The next expected sequence number is greater than the current sequence number.
We have more than two duplicate ACKs in the reverse direction.
The current sequence number equals the next expected acknowledgement number.
We saw the last acknowledgement less than 20ms ago.
Supersedes “Out-Of-Order” and “Retransmission”.
从以上条件来看,一是 Wireshark 没有考虑上下文数据包时间差值的问题,所以忽略了 RTT 问题;二是 Wireshark 考虑到可能有 DUP ACK 丢失的情况下出现,所以在 >=2 个 DUP ACK 的时候就会判断为成快速重传,但这个绝对不是真正的 TCP 快速重传实现(必须满足 3个 DUP ACK)。
那么 No.24 数据包不是快速重传的话,它到底是什么?肯定不会是超时重传,那么它就只能是乱序。拿着乱序的逻辑重新去梳理该交互过程,是完全正确的。
TCP Previous segment not captured
;TCP Out-Of-Order
。也可以利用 IP.ID
加以佐证,No.24 的 IP ID 为 49749 ,在 No.20 和 No.22 之前,因此乱序无疑。
再次看看科来分析器是如何判断的,准确的判断为 乱序 。👏 国产之光~
目前 Wireshark 的使用版本为 Version 3.6.3 (v3.6.3-0-g6d348e4611e2) ,暂没有深究是否是一个 BUG,还是说可以提一个增强功能给 Wireshark,更或许 Wireshark 认为此 TCP 分析实现逻辑是有它自己的道理的。因为确实数据包的世界太多各种各样的现象,一切皆有可能。