我们简单了解下L4层协议和Raw IP是如何与IP层进行交互的。
L4层协议
L4层协议可以通过静态编译和模块配置两种方式加入内核。
比较重要的协议如TCP、UDP、ICMP通常是静态编译至内核。
一些不常用的或者比较特殊的协议,则是通过内核配置加入内核。如IGMP,SCTP,IPIP等等。
L4层协议的注册
L4层协议有net_protocol结构定义:
/* This is used to register protocols. */
struct net_protocol {
int (*handler)(struct sk_buff *skb); //由协议注册的,用于处理入口封包的函数
//由ICMP协议处理函数所用的函数,当收到ICMP UNREACHABLE 时,通知L4层
void (*err_handler)(struct sk_buff *skb, u32 info);
int (*gso_send_check)(struct sk_buff *skb);
struct sk_buff *(*gso_segment)(struct sk_buff *skb,
int features);
struct sk_buff **(*gro_receive)(struct sk_buff **head,
struct sk_buff *skb);
int (*gro_complete)(struct sk_buff *skb);
unsigned int no_policy:1, //使协议免于IPsec检查
netns_ok:1;
};
/*
* Add a protocol handler to the hash tables
*/
int inet_add_protocol(const struct net_protoc