新客立减

学习文档

 

仅供参考

 

数据包处理的一些建议

 

前言

 

 

我们大部分功能都需要解析数据,

进行一系列的包匹配完成,

但是目前,

我们没有一个

很好的框架来简化这个过程,大家处理数据包都是采用原生的

linux

内核接口,并且没有统

一的标准要求如何使用这些接口,所以,存在大量的陷阱,一不留神就造成宕机。

 

 

获取

IP

头部

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

__netif_receive_skb()

在进入三层处理前就对

network_header

进行了设置。

 

 

2

ip_rcv()

中详细的检查保证了

IP

头部到

netfilter

后是完整的。

 

 

3

netfilter

可以尽情使用

ip

头部。

 

 

获取

tcp

头部

 

 

错误

1

 

 

 

 

 

陷阱:

 

 

netfilter

的钩子点是属于

TCP/IP

协议栈的三层流程中,而四层的

TCP

头部此时还没有正

确获取,只是初始化为

IP

头部的值,无法直接使用。

 

 

 

错误

2

 

 

 

 

陷阱:

 

 

数据包可能是非线性的

 

struct sk_buff { 

 

...... 

 

sk_buff_data_t 

transport_header; 

 

/* Transport layer header */ 

 

sk_buff_data_t 

network_header; 

 

/* Network layer header */ 

 

sk_buff_data_t 

mac_header; 

 

 

/* Link layer header */ 

 

...... 

 

iph = ip_hdr(skb); 

tcph = tcp_hdr(skb); 

tcph = (char *)iph + (iph->ihl << 2);