Chinaunix首页 | 论坛 | 博客
  • 博客访问: 500184
  • 博文数量: 104
  • 博客积分: 3045
  • 博客等级: 少校
  • 技术积分: 1230
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-29 10:18
文章分类

全部博文(104)

文章存档

2011年(72)

2010年(1)

2009年(1)

2008年(30)

分类: LINUX

2011-03-02 18:59:28

   大体分析一下一个包从网卡收到,然后到上层的一个过程,以作记录。
  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) |
给主人留下些什么吧!~~

chinaunix网友2011-03-06 17:07:24

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com