数据包处理的一些建议前言我们大部分功能都需要解析数据,进行一系列的包匹配完成,但是目前,我们没有一个很好的框架来简化这个过程,大家处理数据包都是采用原生的linux内核接口,并且没有统一的规范要求如何使用这些接口,所以,存在大量的陷阱,一不留神就造成宕机
获取IP头部1)__netif_receive_skb()在进入三层处理前就对network_header进行了设置
2)ip_rcv()中详细的检查保证了IP头部到netfilter后是完整的
3)netfilter可以尽情使用ip头部
获取tcp头部错误1:陷阱:netfilter的钩子点是属于TCP/IP协议栈的三层流程中,而四层的TCP头部此时还没有正确获取,只是初始化为IP头部的值,无法直接使用
错误2:陷阱:structsk_buff{
sk_buff_data_ttransport_header;/*Transportlayerheader*/sk_buff_data_tnetwork_header;/*Networklayerheader*/sk_buff_data_tmac_header;/*Linklayerheader*/
}iph=ip_hdr(skb);tcph=tcp_hdr(skb);tcph=(char*)iph+(iph->ihlihlsaddr,ntohs(tcph->source),&iph->daddr,ntohs(tcph->dest),ntohs(iph->tot_len),ntohs(iph->id));payload=(char*)tcph+tcph->doff*4;tcplen=skb->len-tcpoff;if(tcph->doff*4doff*4;payload_len=tcplen-tcph->doff*4;if(payload_len==0)r