wireshark源代码的结构分析
一、层次化的数据包协议分析方法 IP / \ TCP UDP / \ HTTP TFTP 由于网络协议种类很多,就WireShark所识别的500多种协议来说,为了使协议和协议间层次关系明显。从而对数据流里的各个层次的协议能够逐层处理。WireShark系统采用了协议树的方式。上图就是一个简单的协议树。如果协议A的所有数据都是封装在协议B里的,那么这个协议A就是协议B是另外一个协议的儿子节点。我们将最低层的无结构数据流作为根接点。那么具有相同父节点的协议成为兄弟节点。那么这些拥有同样父协议兄弟节点协议如何互相区分了?WireShark系统采用协议的特征字来识别。每个协议会注册自己的特征字。这些特征字给自己的子节点协议提供可以互相区分开来的标识。比如tcp协议的port字段注册后。 Tcp.port=21就可以认为是ftp协议, 特征字可以是协议规范定义的任何一个字段。比如ip协议就可以定义proto字段为一个特征字。 在WireShark中注册一个协议解析器首先要指出它的父协议是什么。另外还要指出自己区别于父节点下的兄弟接点协议的特征。比如ftp协议。在WireShark中他的父接点是tcp协议,它的特征就是tcp协议的port字段为21。 这样当一个端口为21的tcp数据流来到时。首先由tcp协议注册的解析模块处理,处理完之后通过查找协议树找到自己协议下面的子协议,判断应该由那个子协议来执行,找到正确的子协议后,就转交给ftp注册的解析模块处理。这样由根节点开始一层层解析下去。 由于采用了协议树加特征字的设计,这个系统在协议解析上由了很强的扩展性,增加一个协议解析器只需要将解析函数挂到协议树的相应节点上即可。 二、基于插件技术的协议分析器
尽管WireShark是目前最好的开放源码的网络分析系统,但WireShark仍然有一些可以改进的地方,一个优秀的网络分析器,尽可能的正确分析出数据协议和高效的处理数据是两个重要的指标。在协议识别方面WireShark大多采用端口识别,有少量协议采用内容识别。这就让一些非标准端口的协议数据没有正确解析出来。比如ftp协议如果不是21端口的话,WireShark就无法识别出来,只能作为tcp数据处理。另外对于内容识别式。WireShark是将所以内容识别的函数组成一张入口表。每次协议数据需要内容识别时,按字母顺序逐个调用表里的每个识别函数。比如对于识别yahoo massanger协议。主要是看数据前几个字节是不是’ymsg’.由于协议名为y开头。所以当识别出协议时已经把所有内容识别函数调用了一遍。这些都是由于WireShark没有实现tcp协议栈,无法做到流级别的识别。导致在协议识别方面有点缺陷。 |