视频logo免费生成网站软件,做网站费用列入什么科目,外贸 网站推广计划,电商直播本文整理自#xff1a;《Wireshark网络分析的艺术 第1版》 作者#xff1a;林沛满 著 出版时间#xff1a;2016-02 最近有不少同事开始学习 Wireshark#xff0c;他们遇到的第一个困难就是理解不了主界面上的提示信息#xff0c;于是跑来问我。问的人多了#xff0c;我也…本文整理自《Wireshark网络分析的艺术 第1版》 作者林沛满 著 出版时间2016-02 最近有不少同事开始学习 Wireshark他们遇到的第一个困难就是理解不了主界面上的提示信息于是跑来问我。问的人多了我也总结成一篇文章希望对大家有所帮助。Wireshark 的提示可是其最有价值之处对于初学者来说如果能理解这些提示所隐含的意义学起来定能事半功倍。
1[Packet size limited during capture]
当你看到这个提示说明被标记的那个包没有抓全。以图 1 的 4 号包为例它全长有 171 字节但只有前 96 个字节被抓到了因此 Wireshark 给了此提示。
图1 这种情况一般是由抓包方式引起的。在有些操作系统中tcpdump默认只抓每个帧的前96个字节我们可以用“-s”参数来指定想要抓到的字节数比如下面这条命令可以抓到1000字节。
[rootmy_server /]# tcpdump -i eth0 -s 1000 -w /tmp/tcpdump.cap2TCP Previous segment not captured
在 TCP 传输过程中同一台主机发出的数据段应该是连续的即后一个包的Seq 号等于前一个包的 SeqLen三次握手和四次挥手是例外。如果 Wireshark发现后一个包的 Seq 号大于前一个包的 SeqLen就知道中间缺失了一段数据。假如缺失的那段数据在整个网络包中都找不到即排除了乱序就会提示TCP Previous segment not captured。比如在图 2 这个例子中6 号包的 Seq 号 1449 大于 5 号包的 SeqLen101说明中间有个携带 1448 字节的包没被抓到它就是“Seq1, Len1448”。
图2 网络包没被抓到还分两种情况一种是真的丢了另一种是实际上没有丢但被抓包工具漏掉了。在 Wireshark 中如何区分这两种情况呢只要看对方回复的确认Ack就行了。如果该确认包含了没抓到的那个包那就是抓包工具漏掉而已否则就是真的丢了。
顺便分析一下图 2 这个网络包它是 HTTPS 传输异常时在客户端抓的。因为“Len: 667”的小包即 6 号包可以送达但“Len: 1448”的大包却丢了说明路径上可能有个网络设备的 MTU 比较小会丢弃大包。后来的解决方式证实了这个猜测只要把整个网络路径的 MTU 保持一致问题就消失了。
3[TCP ACKed unseen segment]
当 Wireshark 发现被 Ack 的那个包没被抓到就会提示 [TCP ACKed unseen segment。这可能是最常见的 Wireshark 提示了幸好它几乎是永远可以忽略的。以图 3 为例32 号包的 SeqLen688914488337说明服务器发出的下一个包应该是 Seq8337。而我们看到的却是 35 号包的 Seq11233这意味着 833711232这段数据没有被抓到。这段数据本应该出现在 34 号之前所以 Wireshark 提示了[TCP ACKed unseen segment]。 图3 不难想象在一个网络包的开头会经常看到这个提示因为只抓到了后面的Ack 但没抓到前面的数据包。
4[TCP Out-of-Order]
在 TCP 传输过程中不包括三次握手和四次挥手同一台主机发出的数据包应该是连续的即后一个包的 Seq 号等于前一个包的 SeqLen。也可以说后一个包的 Seq 会大于或等于前一个包的 Seq。当 Wireshark 发现后一个包的 Seq 号小于前一个包的 SeqLen 时就会认为是乱序了因此提示 [TCP Out-of-Order] 。如图 4 所示3362 号包的 Seq2685642 小于 3360 号包的 Seq2712622所以就是乱序。 图4 小跨度的乱序影响不大比如原本顺序为 1、2、3、4、5 号包被打乱成 2、1、3、4、5就没事。但跨度大的乱序却可能触发快速重传比如打乱成 2、3、4、5、1 时就会触发足够多的 Dup ACK从而导致 1 号包的重传。
5[TCP Dup ACK]
当乱序或者丢包发生时接收方会收到一些 Seq 号比期望值大的包。它每收到一个这种包就会 Ack 一次期望的 Seq 值以此方式来提醒发送方于是就产生了一些重复的 Ack。Wireshark 会在这种重复的 Ack 上标记[TCP Dup ACK] 。
以图 5 为例服务器收到的 7 号包为“Seq29303, Len1460”所以它期望下一个包应该是 SeqLen29303146030763没想到实际收到的却是 8 号包Seq32223说明 Seq30763 那个包可能丢失了。因此服务器立即在 9 号包发了Ack30763表示“我要的是 Seq30763”。由于接下来服务器收到的 10 号、12号、14 号也都是大于 Seq30763 的因此它每收到一个就回复一次 Ack30763从图中可见 Wireshark 在这些回复上都标记了[TCP Dup ACK]。 图5 6[TCP Fast Retransmission]
当发送方收到 3 个或以上[TCP Dup ACK]就意识到之前发的包可能丢了于是快速重传它这是 RFC 的规定。以图 6 为例客户端收到了 4 个 Ack991851于是在 1177 号包重传了 Seq991851。 图6 7[TCP Retransmission]
如果一个包真的丢了又没有后续包可以在接收方触发[Dup Ack]就不会快速重传。这种情况下发送方只好等到超时了再重传此类重传包就会被 Wireshark标上[TCP Retransmission]。以图 7 为例客户端发了原始包包号 1053之后一直等不到相应的 Ack于是只能在 100 多毫秒之后重传了包号 1225。 图7 超时重传是一个非常有技术含量的知识点比如等待时间的长短就大有学问本文就不细说了毕竟需要懂这个的人很少。
8[TCP zerowindow]
TCP 包中的“win”代表接收窗口的大小即表示这个包的发送方当前还有多少缓存区可以接收数据。当 Wireshark 在一个包中发现“win0”时就会给它打上“TCP zerowindow”的标志表示缓存区已满不能再接收数据了。比如图8 就是服务器的缓存区已满所以通知客户端不要再发数据了。我们甚至可以在32583263 这几个包中看出它的窗口逐渐减少的过程即从 win15872 减小到win1472。 图8 9[TCP window Full]
当 Wireshark 在一个包中打上[TCP window Full]标志时就表示这个包的发送方已经把对方所声明的接收窗口耗尽了。以图 9 为例Britain 一直声明它的接收窗口只有 65535意味着 Middle East 最多能给它发送 65535 字节的数据而无需确认即“在途字节数”最多为 65535 字节。当 Wireshark 在包中计算出 Middle East已经有 65535 字节未被确认时就会发出此提示。至于 Wireshark 是怎么计算的请参考本书的《计算“在途字节数”》一文。 图9 [TCP window Full]很容易跟TCP zerowindow混淆实际上它们也有相似之处。前者表示这个包的发送方暂时没办法再发送数据了后者表示这个包的发送方暂时没办法再接收数据了也就是说两者都意味着传输暂停都必须引起重视。
10[TCP segment of a reassembled PDU]
当你收到这个提示肯定已经在EditPreferences ProtocolsTCP菜单里启用了Allow sub dissector to reassemble TCP streams。它表示Wireshark可以把属于同一个应用层PDU比如SMB的Read Response和Write Request之类的TCP 包虚拟地集中起来。如图10所示这一个SMB Read Response由3948号包共同完成因此Wireshark在最后一个包中虚拟地把所有包集中起来。这样做有个好处就是可以右键点击图10底部的方框选择CopyBytesPrintable Text 59 Only从而复制整个应用层的PDU。做研发的同学可能比较需要这个功能。 图10 11Continuation to #
你看到这个提示说明已经在EditPreferencesProtocolsTCP菜单里关闭了Allow sub dissector to reassemble TCP streams。比如图10的那些包一关闭就变成图11这样。 图11 仔细对比图10和图11你会发现Read Response在图10中被算在了48号包头上而在图11中被算到了39号包头上。这样会带来一个诡异的结果图10的读响应时间为2.528毫秒38号包和48号包的时间差而图11的读响应时间为2.476毫秒38号包和39号包的时间差。究竟哪个算正确呢这个问题很难回答如果在乎的是实际的总性能那就看前者如果想忽略TCP/IP协议的损耗单看服务器的响应速度那就看后者。在某些特殊情况下这两者相差非常大所以必须搞清楚。
12Time-to-live exceeded (Fragment reassembly time exceeded)
ICMP的报错有好多种大都不难理解所以我们只举其中的一种为例。[Fragment reassembly time exceeded]表示这个包的发送方之前收到了一些分片但是由于某些原因迟迟无法组装起来。比如在图12中由于上海发往北京的一些包被分片传输且有一部分在路上丢失了所以北京方无法组装起来便只好用这个ICMP报错告知上海方。 图12