访问网页失败也是日常比较常见的问题之一,导致问题的原因可能有很多种,像是客户端、浏览器、服务器或者网络等等,自然具体问题得具体分析。本篇以一个实际案例来说明下 TCP 连接相关的问题,该数据包仍然来自于 Wireshark sharkfest 2017,一些简短但有趣的 TCP 跟踪文件中的又一个。
数据包跟踪文件基本信息如下:
λ capinfos Sample04.pcapng
File name: Sample04.pcapng
File type: Wireshark/... - pcapng
File encapsulation: Ethernet
File timestamp precision: microseconds (6)
Packet size limit: file hdr: (not set)
Number of packets: 33
File size: 6228 bytes
Data size: 5005 bytes
Capture duration: 38.709141 seconds
First packet time: 2011-01-14 01:14:52.475277
Last packet time: 2011-01-14 01:15:31.184418
Data byte rate: 129 bytes/s
Data bit rate: 1034 bits/s
Average packet size: 151.67 bytes
Average packet rate: 0 packets/s
SHA256: 48ca202b8b7c2cf0fd20fe0909cae6cd2a30fbdbdad17492a5cab7f2749bb745
RIPEMD160: 151de4053735268f9943f00403f72aef66debf42
SHA1: a3fb91edd6db023edb2648f6d69dfafb2b7c6a27
Strict time order: True
Capture comment: Sanitized by TraceWrangler v0.6.4 build 808
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
Time resolution = 0x06
Number of stat entries = 0
Number of packets = 33
λ
数据包推测通过 Wireshark 所捕获,数据包数量 33 个,文件大小 6228 字节,捕获时长约 38.7 秒,平均速率 1034 bits/s,并经过 TraceWrangler 匿名化软件所处理。
关于 TraceWrangler 匿名化软件简介,可以查看之前的文章《Wireshark 提示和技巧 | 如何匿名化数据包》
专家信息如下,其中有需要注意的地方是 Previous segment not caputred
的警告信息,以及 RST、(疑似)重传、DUP ACK 等,考虑到总包数 33 本身较少,少量疑似有问题的信息仍然需要关注。
首先什么是 TCP Previous segment not caputred
? 实际上在以前的文章,包括大家自己手头上的实际案例,应该是一种比较常见的专家提示信息。
Set when the current sequence number is greater than the next expected sequence number.
如字面意思所述,TCP 之前的段未被捕获到,实际上数据包跟踪文件里这个未被捕获到的提示一般有两种可能:
当然这两种情况,有时也会比较好区别,简要说明如下:
举例:
类似文章和案例很多,有兴趣的同学可以查看《丢包?不要轻易下结论》、《丢包?不要轻易下结论续》、《TCP Previous Segment Lost》等。
回到本案例,展开完整的数据包文件信息,如下:
主要分析如下:
当然可能是 TraceWrangler 匿名化应用的问题,服务器端 IP 0.115.64.211(被修改过),和 DNS 响应中的 IP(217.110.67.201)并不一致,小问题可忽略。
在客户端 No.11 发送 Client Hello 后,服务器并无任何响应,在 3 秒后,客户端 No.13 超时重传了数据包,服务器此时所发送来的 No.14 提示即有 TCP Previous segment not caputred
,说明服务器传输方向在之前有分段丢失的情况发生,因此客户端产生了 No.15 的 DUP ACK 现象。之后因为 TLS 握手失败问题,客户端主动 FIN 了连接,之后会话匆匆结束。而体现在应用上的异常现象,就是网页访问失败,打不开~
转向 TCP 详细分析,打开上帝视图,看看究竟发生了什么问题
TCP Previous segment not caputred
, 说明了丢失了 4140 字节的分段,也就是 4140/1380 = 3,刚好 3 个 MSS 的数据包。说明服务器按 MSS 1380 所发送出来的数据包,在中间传输时被丢弃了,这种情况判断是中间路径 MTU 小于 1420 (1380+40)导致;(传输路径 MTU 问题)本案例中的访问网页失败算是一类比较简单的故障场景,问题现象明确且容易复现,三下五除二也就解决了,当然相对也会有很复杂的场景,就比较烧脑了 ~