大体分析一下一个包从网卡收到,然后到上层的一个过程,以作记录。
1) 网卡层
网卡收到网络包后在网卡驱动里面一般都会调用netif_rx或者是NAPI层的rx,然后挂载到对应CPU 网卡的queue里面中去。然后在中断的下半部分将网络包一层一层的往上传递。
2 交换层
真正协议栈对于包的处理是在如下的函数中,
int netif_receive_skb(struct sk_buff *skb)
这个函数主要做的是,如果二层处存在交换部分的话,对数据包进行交换处理,
skb = handle_bridge(skb, &pt_prev, &ret, orig_dev);
if (!skb)
goto out;
skb = handle_macvlan(skb, &pt_prev, &ret, orig_dev);
if (!skb)
goto out;
交换机根据包是进行转发还是不处理。如果包是发往本机的话,然后就
ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
其实fuction 具体的就是网络层的ip_recv来进行处理了。
int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
{
}
ip_recv 主要是对包进行检测通过之后,真正的三层处理时再ip_rcv_finish里面进行处理的。
static int ip_rcv_finish(struct sk_buff *skb)
{
如果没有响应的目标地址的话,交由路由进行处理。路由部分用来决定是用来转发还是丢弃。
if (skb_dst(skb) == NULL) {
int err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos,
skb->dev);
对IP包进行option 检测,
if (iph->ihl > 5 && ip_rcv_options(skb))
goto drop;
最后就是对包
return dst_input(skb);
}
/* Input packet from network to transport. */
static inline int dst_input(struct sk_buff *skb)
{
return skb_dst(skb)->input(skb);
}
如果是发往本机的就通过
ip_local_deliver_finish 从L3 层向上传递到L4层中去,进行相应的处理。
阅读(4157) | 评论(1) | 转发(0) |