前言
在有些时候我们需要直接抓取并分析原始ip数据包(比如说netfilter内核框架中数据包的分析、原始套接字中数据包的分析),但是我们所能获得的ip数据包通常只是一个若干字节的在连续地址空间中存储的数据,比如存在数组char[MSG_SIZE]中,下面介绍如何分析原始ip数据包中的数据。
在开始分析包头之前我们假设原始ip数据包存储在缓存char buf[MSG_SZIE]中。
一、IP头的分析
众所周知,ip数据包的第一个包头便是ip头。ip包头采用结构体iphdr,该数据结构在中定义。
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,//ip头长度,以4字节为单位
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
#else
#error "Please fix "
#endif
__u8 tos;
__be16 tot_len;
__be16 id;
__be16 frag_off;
__u8 ttl;
__u8 protocol;
__sum16 check;
__be32 saddr;
__be32 daddr;
/*The options start here. */
};
注意这个数据结构是没有包含ip选项的,数据包中这个数据结构后边紧跟着的就是选项。
如果要获取ip头,我们可以直接定义一个