日期:2014-05-16 浏览次数:20860 次
本文主要讲解了Linux 二层协议架构组织,使用的内核的版本是2.6.32.27
为了方便理解,本文采用整体流程图加伪代码的方式从内核高层面上梳理了Linux 二层协议架构组织,希望可以对大家有所帮助。阅读本文章假设大家对C语言有了一定的了解
Linux中1层2层标准化及在Linux系统中的实现位置如下所示
1层和2a层(MAC)层体现了不同网络介质的区别,在Linux的设备驱动中实现;2b层(LLC)则对上提供了统一的接口,在Linux的内核中实现该部分
Linux在网络架构中的活动形式如下
1-4层是在内核中进行的,交付应用程序处理的数据报文是在用户空间进行的,具体的情参考我的前两篇博客
Linux内核二层数据包接收流程
Linux内核数据包的发送传输
对于LLC层的协议控制信息及扩展信息如下
所有的协议报文,都通过链路层的协议指示标明三层需要哪个协议实例处理,通过eth_type_trans() 就可以知道了,我们分析一下源代码
/*某一MAC协议类型的全部网络设备都是使用相同的---XX_type_trans, * 如 tr_type_trans() --- 令牌环王 * fddi_type_trans() --- FDDI网络 */ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev) { struct ethhdr *eth; unsigned char *rawp; skb->dev = dev; skb_reset_mac_header(skb); /*获取第二层数据包的报头*/ skb_pull(skb, ETH_HLEN); eth = eth_hdr(skb); /*在skb->pkt_type中得到识别和注册 * PACKET_BROADCAST:广播包 * PACKET_MULTICAST:2层组播地址 * PACKET_HOST:发送给本机的报文 * PACKET_OTHERHOST: 发送给其他主机的报文,这里主机应该处于混杂模式中 */ if (unlikely(is_multicast_ether_addr(eth->h_dest))) { if (!compare_ether_addr_64bits(eth->h_de