上篇网络流量监视 之二 写到通过raw socket捕获到了包括IP头数据包,下面的工作就是分析该数据包了
数据包结构很多地方都有介绍的,具体如下
----------------------------------------------
| ip header | tcp header(or x header) | data |
----------------------------------------------
其中IP头部分如下
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
数据结构定义如下(IPV4):
把2进制数据转换成对应的数据结构,使用以下的转换函数
转换完成的数据并不能直接使用,熟悉网络的人应该知道,IP包头采用的是网络字节序,需要转换成对应的本机字节序,对于ushort类型的数据,需要将高低位字节进行交换
下面一一列举数据结构各个字段的意义:
一 ip_verlen,前4位存放着IP的版本号,后4位存放着IP头长度
通过 ip_verlen >> 4 得到值来判断数据包的IP协议版本号(4或者是6)
通过 ip_verlen & 0x0f 得到IP包头长度(注意该值需要乘4才是包头长度)
二 ip_tos,服务器类型 ,本文不使用
三 ip_totallength,数据包长度
四 ip_id, 16位标识
五 ip_offset, 分片偏移, 其前3位为标识
六 ip_ttl,8位生存时间 TTL
七 ip_protocol,8位协议 (TCP, UDP 或其他)
八 ip_checksum,16位IP首部校验和
九 ip_srcaddr,32位源IP地址
十 ip_destaddr ,32位目的IP地址
下面是实现IP头解析的代码
在网络流量监视 之二 的基础上,增加相关代码,把IP头的解析信息也写入到日志文件中
让我们看看效果吧
OK,已经可以看到捕获包的基本IP信息了,利用这些信息,我们可以在网络流量监视 之一的基础上对网络数据流量进行更加详细的监视了。