Wireshark基本用法 && 过滤规则 && 协议详解

基本使用:

https://www.cnblogs.com/dragonir/p/6219541.html

 

协议解析:

https://www.jianshu.com/p/a384b8e32b67

 

 

 

(1)版本 ,占4位,指IP协议的版本,目前广泛使用的IP协议版本号为4(即IPv4)。

 

2)首部长度 ,占4位,可表示的最大十进制数值是15。请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。首部长度限制为60字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。

 

(3)服务类型 ,占8位,用来获得更好的服务,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用。

 

(4)总长度 ,总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节。在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。

 

PS:图中总长度为84个字节,ping包默认为56个字节,ICMP包头是8个字节,再加上首部长度20个字节。下图我将包长度设置为112个字节后,总长度就变成140个字节了

 

(5)标识(identification),占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。

 

PS:个人理解就是一个数据报对应一个标识,当数据报长度超过最大MTU时会被分片,但被分片的标识字段是一样的。下面ping一个3100字节的包验证一下,百度大包经禁ping了,改pingMOP:

 

从上图可以看出3100字节的大包被分为3片字段都是一样的(12312)。

 

(6)标志(flag),占3位,但目前只有2位有意义。标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。

 

 

(7)片偏移,占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,除了最后一个分片,每个分片的长度一定是8字节(64位)的整数倍

 

PS:片偏移就是相对数据报字段的起点,以标识中的ping包来看,第一个分片的片偏移是0,第二个是1480,第3个是2960,如下图所示:

 

(8)生存时间,占8位,生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。最初的设计是以秒作为TTL的单位。每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把TTL值减1。当TTL值为0时,就丢弃这个数据报。后来把TTL字段的功能改为“跳数限制”(但名称不变)。路由器在转发数据报之前就把TTL值减1.若TTL值减少到零,就丢弃这个数据报,不再转发。因此,现在TTL的单位不再是秒,而是跳数。TTL的意义是指明数据报在网络中至多可经过多少个路由器。显然,数据报在网络上经过的路由器的最大数值是255.若把TTL的初始值设为1,就表示这个数据报只能在本局域网中传送。

 

(9)协议占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。 

 

(10)首部检验和,占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。

 

(11)源地址,占32位。

 

(12)目的地址,占32位。

 

(13)数据部分,可变,最大为总长度-首部长度。

 

基本IO Graphs:

IO graphs是一个非常好用的工具。基本的Wireshark IO

graph会显示抓包文件中的整体流量情况,通常是以每秒为单位(报文数或字节数)。默认X轴时间间隔是1秒,Y轴是每一时间间隔的报文数。如果想要查看每秒bit数或byte数,点击“Unit”,在“Y

Axis”下拉列表中选择想要查看的内容。这是一种基本的应用,对于查看流量中的波峰/波谷很有帮助。要进一步查看,点击图形中的任意点就会看到报文的细节。

过滤:

每一个图形都可以应用一个过滤条件。这里创建两个不同的graph,一个HTTP一个ICMP。可以看到过滤条件中Graph 1使用“http”Graph 2使用“icmp”。图中可以看到红色ICMP流量中有些间隙,进一步分析。

 
过滤

常用排错过滤条件:

对于排查网络延时/应用问题有一些过滤条件是非常有用的:

tcp.analysis.lost_segment:表明已经在抓包中看到不连续的序列号。报文丢失会造成重复的ACK,这会导致重传。

tcp.analysis.duplicate_ack:显示被确认过不止一次的报文。大凉的重复ACK是TCP端点之间高延时的迹象。

tcp.analysis.retransmission:显示抓包中的所有重传。如果重传次数不多的话还是正常的,过多重传可能有问题。这通常意味着应用性能缓慢和/或用户报文丢失。

tcp.analysis.window_update:将传输过程中的TCP window大小图形化。如果看到窗口大小下降为零,这意味着发送方已经退出了,并等待接收方确认所有已传送数据。这可能表明接收端已经不堪重负了。

tcp.analysis.bytes_in_flight:某一时间点网络上未确认字节数。未确认字节数不能超过你的TCP窗口大小(定义于最初3此TCP握手),为了最大化吞吐量你想要获得尽可能接近TCP窗口大小。如果看到连续低于TCP窗口大小,可能意味着报文丢失或路径上其他影响吞吐量的问题。

tcp.analysis.ack_rtt:衡量抓取的TCP报文与相应的ACK。如果这一时间间隔比较长那可能表示某种类型的网络延时(报文丢失,拥塞,等等)。

函数:

IO Graphs有六个可用函数:SUM, MIN, AVG, MAX, COUNT, LOAD。

MIN( ), AVG( ), MAX( )

首先看一下帧之间的最小,平均和最大时间,这对于查看帧/报文之间的延时非常有用。我们可以将这些函数结合“frame.time_delta过滤条件看清楚帧延时,并使得往返延时更为明显。如果抓包文件中包含不同主机之间的多个会话,而只想知道其中一个pair,可将“frame.time_delta”结合源和目标主机条件如“ip.addr==x.x.x.x &&ip.addr==y.y.y.y”。如下图所示:

 
函数

我们做了以下步骤:

将Y轴设置为“Advanced”,让Caculation域可见。不做这一步就看不到计算选项。

X轴时间间隔1秒,所以每个柱状图代表1秒间隔的计算结果。

过滤出两个特定IP地址的HTTP会话,使用条件:“(ip.addr==192.168.1.4&& ip.addr==128.173.87.169) && http”。

使用3个不同的graph,分别计算Min(), Avg(), Max()。

对每一个计算结果应用条件“frame.time_delta”,将style设置成“FBar”,显示效果最佳。

Count( ):此函数计算时间间隔内事件发生的次数,在查看TCP分析标识符时很有用,例如重传。

Sum( ):该函数统计事件的累加值。有两种常见的用例是看在捕获TCP数据量,以及检查TCP序列号。

协议过滤器:

arp:显示所有包括ARP请求和回复在内的所有ARP数据流。

ip:显示内含IPv4头在内的(如ICMP目的地址不可达报文,在ICMP报文头之后返回到来方向的IPv4头)IP数据流。

ipv6:显示所有IPv6数据流,包括内含IPv6报文头的IPv4报文,如6to4,Teredo,以及ISATAP数据流。

tcp:显示所有基于TCP的数据流。

应用过滤器:

bootp:显示所有DHCP数据流(基于BOOTP)。

dns:显示包括TCP区域传输以及基于标准UDP的DNS请求和回复在内的所有DNS数据流。

tftp:显示所有TFTP(Trivial File Transfer Protocol)数据流。

http:显示所有HTTP命令,回复以及数据传输报文,但不显示TCP握手报文,TCP ACK报文以及TCP结束报文。

icmp:显示所有ICMP报文。

域过滤器:

boot.option.hostname:显示所有包含主机名的DHCP数据流(DHCP基于BOOTP)。

http:host:显示所有包含HTTP主机名字段的所有HTTP报文。此报文是客户端向网络服务器发送请求时发出的。

ftp.request.command:显示所有包含命令的FTP数据流,比如USER,PASS,或RETR命令。

字符过滤器:

tcp.analysis.flags:显示所有包含TCP分析标识的所有报文,包括报文丢失,重传,或零窗口标识。

tcp.analysis,zero_window:显示含有表明发送方的接收缓存用完标识的报文。

显示过滤器比较运算符:

通过扩展过滤条件可查找某一域值,Wireshark针对此功能支持数字比较运算符。

1. ==或eq

例如:ip.src == 10.2.2.2

显示所有源地址为10.2.2.2的IPv4数据流

2. !=或ne

例如:tcp.srcport != 80

显示源端口除了80以外的所有TCP数据流

3. >或gt

例如:frame.time_relative > 1

显示距前一个报文到达时间相差1秒的报文

4. <或lt

例如:tcp.window_size < 1460

显示当TCP接收窗口小于1460字节时的报文

5. >=或ge

例如:dns.count.answers >= 10

显示包含10个以上answer的DNS响应报文

6. <=或le

例如:ip.ttl <= 10

显示IP报文中Time to Live字段小于等于10的报文

7. contains

例如:http contains “GET”

显示所有HTTP客户端发送给HTTP服务器的GET请求

对于基于TCP应用的过滤条件采用比较运算符。例如,如果想看端口80上面的HTTP数据流,使用HTTP.port==80。

小贴士:

运算符两边不用留空格。ip.src == 10.2.2.2与ip.src==10.2.2.2的效果是相同的。

过滤HTTP数据流:

在排查网页浏览器会话或检查网速过慢问题时,对浏览器会话进行过滤就显得尤为重要。过滤HTTP数据流有两种方式:

http

tcp.port==xx(xx表示所使用的HTTP端口)

第二种过滤方法更加有效。

 

posted @ 2019-01-19 14:18  ma_fighting  阅读(20424)  评论(0编辑  收藏  举报
历史天气查