林沛满-Wireshark的提示

news2024/11/17 19:52:22

本文整理自:《Wireshark网络分析的艺术 第1版》
作者:林沛满 著
出版时间:2016-02

最近有不少同事开始学习 Wireshark,他们遇到的第一个困难就是理解不了主界面上的提示信息,于是跑来问我。问的人多了,我也总结成一篇文章,希望对大家有所帮助。Wireshark 的提示可是其最有价值之处,对于初学者来说,如果能理解这些提示所隐含的意义,学起来定能事半功倍。

1.[Packet size limited during capture]

当你看到这个提示,说明被标记的那个包没有抓全。以图 1 的 4 号包为例,它全长有 171 字节,但只有前 96 个字节被抓到了,因此 Wireshark 给了此提示。
在这里插入图片描述

图1

这种情况一般是由抓包方式引起的。在有些操作系统中,tcpdump默认只抓每个帧的前96个字节,我们可以用“-s”参数来指定想要抓到的字节数,比如下面这条命令可以抓到1000字节。

[root@my_server /]# tcpdump -i eth0 -s 1000 -w /tmp/tcpdump.cap

2.[TCP Previous segment not captured]

在 TCP 传输过程中,同一台主机发出的数据段应该是连续的,即后一个包的Seq 号等于前一个包的 Seq+Len(三次握手和四次挥手是例外)。如果 Wireshark发现后一个包的 Seq 号大于前一个包的 Seq+Len,就知道中间缺失了一段数据。假如缺失的那段数据在整个网络包中都找不到(即排除了乱序),就会提示[TCP Previous segment not captured]。比如在图 2 这个例子中,6 号包的 Seq 号 1449 大于 5 号包的 Seq+Len=1+0=1,说明中间有个携带 1448 字节的包没被抓到,它就是“Seq=1, Len=1448”。
在这里插入图片描述

图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 号包的 Seq+Len=6889+1448=8337,说明服务器发出的下一个包应该是 Seq=8337。而我们看到的却是 35 号包的 Seq=11233,这意味着 8337~11232这段数据没有被抓到。这段数据本应该出现在 34 号之前,所以 Wireshark 提示了[TCP ACKed unseen segment]。

在这里插入图片描述

图3

不难想象,在一个网络包的开头会经常看到这个提示,因为只抓到了后面的Ack 但没抓到前面的数据包。

4.[TCP Out-of-Order]

在 TCP 传输过程中(不包括三次握手和四次挥手),同一台主机发出的数据包应该是连续的,即后一个包的 Seq 号等于前一个包的 Seq+Len。也可以说,后一个包的 Seq 会大于或等于前一个包的 Seq。当 Wireshark 发现后一个包的 Seq 号小于前一个包的 Seq+Len 时,就会认为是乱序了,因此提示 [TCP Out-of-Order] 。如图 4 所示,3362 号包的 Seq=2685642 小于 3360 号包的 Seq=2712622,所以就是乱序。

在这里插入图片描述

图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 号包为“Seq=29303, Len=1460”,所以它期望下一个包应该是 Seq+Len=29303+1460=30763,没想到实际收到的却是 8 号包Seq=32223,说明 Seq=30763 那个包可能丢失了。因此服务器立即在 9 号包发了Ack=30763,表示“我要的是 Seq=30763”。由于接下来服务器收到的 10 号、12号、14 号也都是大于 Seq=30763 的,因此它每收到一个就回复一次 Ack=30763,从图中可见 Wireshark 在这些回复上都标记了[TCP Dup ACK]。

在这里插入图片描述

图5

6.[TCP Fast Retransmission]

当发送方收到 3 个或以上[TCP Dup ACK],就意识到之前发的包可能丢了,于是快速重传它(这是 RFC 的规定)。以图 6 为例,客户端收到了 4 个 Ack=991851,于是在 1177 号包重传了 Seq=991851。

在这里插入图片描述

图6

7.[TCP Retransmission]

如果一个包真的丢了,又没有后续包可以在接收方触发[Dup Ack],就不会快速重传。这种情况下发送方只好等到超时了再重传,此类重传包就会被 Wireshark标上[TCP Retransmission]。以图 7 为例,客户端发了原始包(包号 1053)之后,一直等不到相应的 Ack,于是只能在 100 多毫秒之后重传了(包号 1225)。

在这里插入图片描述

图7

超时重传是一个非常有技术含量的知识点,比如等待时间的长短就大有学问,本文就不细说了,毕竟需要懂这个的人很少。

8.[TCP zerowindow]

TCP 包中的“win=”代表接收窗口的大小,即表示这个包的发送方当前还有多少缓存区可以接收数据。当 Wireshark 在一个包中发现“win=0”时,就会给它打上“TCP zerowindow”的标志,表示缓存区已满,不能再接收数据了。比如图8 就是服务器的缓存区已满,所以通知客户端不要再发数据了。我们甚至可以在3258~3263 这几个包中看出它的窗口逐渐减少的过程,即从 win=15872 减小到win=1472。

在这里插入图片描述

图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由39~48号包共同完成,因此Wireshark在最后一个包中虚拟地把所有包集中起来。这样做有个好处,就是可以右键点击图10底部的方框,选择CopyBytesPrintable Text 59 Only,从而复制整个应用层的PDU。做研发的同学可能比较需要这个功能。

在这里插入图片描述

图10

11.[Continuation 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协议的损耗,单看服务器的响应速度,那就看后者。在某些特殊情况下,这两者相差非常大,所以必须搞清楚。

12.[Time-to-live exceeded (Fragment reassembly time exceeded)]

ICMP的报错有好多种,大都不难理解,所以我们只举其中的一种为例。[Fragment reassembly time exceeded]表示这个包的发送方之前收到了一些分片,但是由于某些原因迟迟无法组装起来。比如在图12中,由于上海发往北京的一些包被分片传输,且有一部分在路上丢失了,所以北京方无法组装起来,便只好用这个ICMP报错告知上海方。

在这里插入图片描述

图12

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1063183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

海洋测绘外业总结(2023年9月)

本次外业大约历时2个多月,中间遇到了多波束噪声、电火花电源箱冒烟、侧扫声纳绞车承重头内部线路中断,连接拖鱼的硫化头烧坏问题。 1、多波束噪声的问题 在外业采集过程中,EM2040D多波束水体图呈现了明显三段,意思就是&#xff…

SSM 注解配置方式整合

文章目录 Bean注解使用注解方式代替 web.xml 文件Spring注解方式整合Mybatis事务管理器配置请求与响应EnableWebMvc 注解REST 风格RestControllerComponentScan静态资源放行表现层数据封装EnableAspectJAutoProxy(AOP注解方式)AOP 通知获取数据&#xff…

AUTOSAR COM模块框架梳理

框架: COM的功能主要就是两个: 把IPDU内的signal提取出来提供给SWC使用,把SWC发送的signal拷贝到IPDU buffer内 所以,COM的关键字是 signal, signal group, IPDU, IPDU group Signal group 是为了保证 Complex Data Types 的数…

NodeMCU ESP8266开发流程详解(图文并茂)

文章目录 整体架构打开软件setuploop 连接开发板CP2102版本CH340版本 下载结论 整体架构 NodeMCU ESP8266基于Arduino IDE的开发相对来说还是比较容易上手的,我们基本需要以下几个东西; 一台安装好Arduino IDE的PC,并且已经部署环境&#x…

unity脚本_transform父子物体

运行 就没有父子关系了 当我们需要设置父物体时 通常我们用方式二 说明: 参数一:父物体 参数二:是否保留世界坐标的 位置 角度 缩放 信息 true 会保留 世界坐标系下的状态 和 父物体 进行计算 得到本地坐标系信息 false 不会保留 会直…

点餐小程序实战教程04-用户注册

我们上一篇讲解了自定义方法以及生命周期函数的概念,本节我们讲解一下数据源操作的方法。 1 查询单条数据 在我们的业务逻辑里,是要根据用户的登录信息来去数据源获取数据,根据返回结果来判断是否注册过。这里就涉及到要如何过滤数据的问题…

Qt扩展-Advanced-Docking 简介及配置

Advanced-Docking 简介及配置 一、概述二、项目结构三、安装配置四、代码测试 一、概述 Advanced-Docking 是类似QDockWidget 功能的多窗口停靠功能的库。很像visual stdio 的 停靠功能,这个库对于停靠使用的比较完善。很多的软件都使用了这个框架。 项目源地址&a…

基于知识蒸馏的两阶段去雨去雪去雾模型学习记录(二)之知识收集阶段

前面学习了模型的构建与训练过程,然而在实验过程中,博主依旧对数据集与模型之间的关系有些疑惑,首先是论文说这是一个混合数据集,但事实上博主在实验时是将三个数据集分开的,那么在数据读取时是如何混合的呢&#xff0…

【前端开发---Vue3】前段开发之详细的Vue3入门教程,特别适合小白系统学习,入门到熟练使用Vue看这一篇就够了!

前言: 这篇文章更加侧重的是Vue3不同于Vue2的知识点,如果学习Vue2请看下面这篇文章 Vue2详细系统入门教程 11.2 Vue3 声明:图片资源来自于黑马程序员公开学习资料 本人在学习当中,详细整理了笔记,供大家参考学习 1…

基于最近电平逼近的开环MMC逆变器Simulink仿真模型

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

重新认识AUTOSAR Interface

核心: S/R interface: data elementC/S interface: operation (with arguement)M/S interface: mode group (macro) 其实 data element,operation,mode group 才是核心,他们可以看作是用户自定义的变量类…

柯桥实用口语学习,韩语口头禅系列短句-恋爱篇

사랑해.我爱你。 너한테 미치겠어.我为你疯狂。 난 니거야.我是你的。 넌 내거야.你是我的。 너 잘 생겼어.你很帅。 네가 뽀뽀/키스 해도 돼? 我可以吻你吗?

基于虚拟阻抗的下垂控制——孤岛双机并联Simulink仿真

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

[Spring] Spring5——事务简介

目录 一、事务概述 1、什么是事务 2、事务的四个特性(ACID) 二、搭建事务操作环境 1、dao、service 两层结构 2、示例 3、模拟异常(事务场景引入) 三、Spring 事务管理 1、事务管理介绍 2、声明式事务管理——注解方式 …

c++ 学习 之 继承的基本语法

继承可以减少重复的代码 语法&#xff1a; class 子类 : 继承方式 父类子类 也称为 派生类 父类 也称为 基类 class BasePage { public:void header(){cout << "首页&#xff0c;公开课&#xff0c;登录&#xff0c;注册。。。&#xff08;公共头部&#xff09…

C/C++——内存管理

1.为什么存在动态内存分配 灵活性 静态内存分配是在编译时确定的&#xff0c;程序执行过程中无法改变所分配的内存大小&#xff1b;动态内存分配可以根本程序的运行环境来动态分配和释放空间&#xff0c;提供了更大的灵活性 动态数据结构 有些数据结构的大小和结构在编译时…

input输入多行文本:删除“首先 其次 此外 总的来说”

input允许多行输入 233.3表示停止输入input输入多行文本文本 &#xff08;空行&#xff09; &#xff08;空行&#xff09; &#xff08;空行&#xff09; 正文 &#xff08;空行&#xff09; &#xff08;空行&#xff09; &#xff08;空行&#xff09; 正文 &#xff08;空行…

国庆节:不仅仅是庆祝,更是成长与体验

目录 国庆节&#xff1a;不仅仅是庆祝&#xff0c;更是成长与体验引言第一部分&#xff1a;旅途风景目的地选择旅行亮点与国庆的联系 技术主题完成的博文国庆与技术 第三部分&#xff1a;回家的路为什么回家艰难险阻家与国庆 结论 国庆节&#xff1a;不仅仅是庆祝&#xff0c;更…

【Spring笔记02】Spring中的IOC容器和DI依赖注入介绍

这篇文章&#xff0c;主要介绍一下Spring中的IOC容器和DI依赖注入两个概念。 目录 一、IOC控制反转 1.1、什么是IOC 1.2、两种IOC容器 &#xff08;1&#xff09;基于BeanFactory的IOC容器 &#xff08;2&#xff09;基于ApplicationContext的IOC容器 二、DI依赖注入 2.…

Vue MVVM 模型

一、什么事MVVM 模型 MVVM 是 Model-View-ViewModel 的缩写&#xff0c;它是一种软件架构风格 Model&#xff1a;模型&#xff0c; 数据对象&#xff08;data 函数&#xff09;&#xff0c;如下图 View&#xff1a;视图&#xff0c;模板页面&#xff08;用于渲染数据&#xf…