1
计算机网络技术理论与实践
1.3.3.4 2.3.4 Wireshark包分析方法

2.3.4 Wireshark包分析方法

由于网络协议通常都遵循OSI体系结构中的分层模型,协议数据是从上到下封装后发送的。通过Wireshark截获到的是封装完的数据包,想要分析数据包,就只能从外层向内层进行分析,也就是从下层协议向上层协议进行分析,这是因为对于封装好的数据包,只能对最外层的边界进行定位,所以只能先分析最外层的协议格式,当外层协议格式确定后,才能知道内层协议的边界,进行定位分析。

例如,当收到一个数据包为以太网帧时,首先按照最外层的以太网帧格式对数据包进行分析,根据以太网帧中的类型字段,可以知道以太网数据帧里面封装的协议,如果类型值为0x0806表示里面封装的是ARP协议,如果类型值为0x0800表示里面封装的是IP协议。当封装的是IP协议时,我们将数据包脱去以太网帧头和尾部,把里面的数据交给IP协议进行分析。IP协议根据协议格式对数据进行分析,并通过“protocol”字段来分析里面封装的协议,如果是0x11表示封装的是UDP协议,如果是0x06表示封装的是TCP协议,然后脱去IP层协议头部,按照协议的类型交给相应的传输层协议分析,就这样一直从最外层的协议分析到最内层的协议。

由于网络协议种类非常多,Wireshark能够识别几百种协议,为了使协议和协议间层次关系明显,便于对数据流中各个层次的协议进行逐层处理,Wireshark系统采用了协议树的方式,如图2-11所示。

img33

图2-11 协议树示意图

图2-11就是一个简单的协议树。如果协议A的所有数据都是封装在协议B里的,那么这个协议A就是协议B的孩子节点。将Wireshark捕捉到的无结构数据流作为根接点,具有相同父节点的协议成为兄弟节点。拥有同样父协议的兄弟节点必须能够通过父协议中的字段进行区分,这样才能正确地分析,在Wireshark中采用协议的特征字来进行识别。每个协议会注册自己的特征字。这些特征字用于为自己的子节点协议提供可以互相区分开来的标识。例如,IP协议将“protocol”字段注册为特征字,就可以通过“protocol”字段的内容来区分它的孩子节点,如果ip.protocol==0x06,表示其内部是TCP协议,特征字可以是协议规范定义的任何一个字段。比如TCP协议就可以定义“port”字段为特征字。

在Wireshark中注册一个协议解析器首先要指出它的父协议是什么,另外还要指出自己区别于父节点下的兄弟节点协议的特征。比如HTTP协议,在Wireshark中它的父接点是TCP协议,TCP的特征字为“port”字段,HTTP的特征为tcp.port==80。这样当一个端口为80的TCP数据包来到时,首先由TCP协议注册的解析器进行处理,处理完后通过查找协议树找到自己协议下面的子协议,通过特征字判断应该由哪个子协议来继续分析,根据端口为80,可以找出子协议HTTP,然后转交给HTTP注册的解析模块进行处理,这样由根节点开始一层层解析下去。

Wireshark的主界面被分成3个部分:

最上面为数据包列表面板,用来显示截获的每个数据包的总结性信息,默认会显示出数据包的序号、时间、源地址、目的地址、协议类型和摘要信息。显示的内容可以自己通过“Preferences”面板进行定制。

中间面板为数据包细节面板,用来显示在数据包列表面板中选定的数据包的协议分析结果,通过协议树的方式进行展示,是分析数据包的主要部分。协议树中从上向下依次列出数据包从外到内的协议,每个协议展开后会显示出该协议中所有字段,并在后面显示出该字段的值。当单击某个协议字段或者某个协议时,在下方的数据包字节面板中会用高亮方式显示出该字段或者该协议头部在整个数据包中所处的位置。

最下边是以十六进制形式表示的数据包字节面板,用来显示数据包在物理层上传输时的最终形式。