最近研究了ndpi的源代码,过程中看到关于这方面的资料很少,所以就想把自己的收获写下来分享一下,也让之后的同学有所参考。首先简单介绍一下ndpi源码中几个比较重要的结构体,这些结构体的定义一般都在ndpi_typedefs.h头文件中,有兴趣的同学可以参考。
1,ndpi_iphdr, ndpi_tcphdr,ndpi_udphdr, ndpi_ethdr(这几个是在 linux_compat.h头文件中)
这几个结构题比较简单,主要用于存储各层的数据包头信息。如果学过计算机网络都应该知道网络数据在传输时经过每一层都会加上相应的信息,比如IP包头一般有20个字节固定长度,下面是ndpi_iphdr结构体的定义,可以看出来是跟IP数据包格式一一对应的,在此不做过多解释。ndpi_ethdr是对应数据链路层。
struct ndpi_iphdr {
#if defined(__LITTLE_ENDIAN__)
u_int8_t ihl:4, version:4;
#elif defined(__BIG_ENDIAN__)
u_int8_t version:4, ihl:4;
#else
# error "Byte order must be defined"
#endif
u_int8_t tos;//区分服务
u_int16_t tot_len;//总长度
u_int16_t id;//标志
u_int16_t frag_off;//片偏移
u_int8_t ttl;//跳数
u_int8_t protocol;//协议
u_int16_t check;//
u_int32_t saddr;//源IP
u_int32_t daddr;//目的IP
};
2,ndpi_detection_module_struct
这个结构体比较重要,主要用于存储一些全局变量ÿ