打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Linux 二层协议架构组织

本文主要讲解了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() 就可以知道了,我们分析一下源代码

  1. /*某一MAC协议类型的全部网络设备都是使用相同的---XX_type_trans, 
  2.  * 如 tr_type_trans() --- 令牌环王 
  3.  * fddi_type_trans() --- FDDI网络 
  4.  */  
  5. __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)  
  6. {  
  7.     struct ethhdr *eth;  
  8.     unsigned char *rawp;  
  9.   
  10.     skb->dev = dev;    
  11.     skb_reset_mac_header(skb);  
  12.     /*获取第二层数据包的报头*/  
  13.     skb_pull(skb, ETH_HLEN);  
  14.     eth = eth_hdr(skb);  
  15.   
  16.     /*在skb->pkt_type中得到识别和注册 
  17.      * PACKET_BROADCAST:广播包 
  18.      * PACKET_MULTICAST:2层组播地址 
  19.      * PACKET_HOST:发送给本机的报文 
  20.      * PACKET_OTHERHOST: 发送给其他主机的报文,这里主机应该处于混杂模式中 
  21.     */  
  22.     if (unlikely(is_multicast_ether_addr(eth->h_dest))) {  
  23.         if (!compare_ether_addr_64bits(eth->h_dest, dev->broadcast))  
  24.             skb->pkt_type = PACKET_BROADCAST;  
  25.         else  
  26.             skb->pkt_type = PACKET_MULTICAST;  
  27.     }  
  28.     else if (1 /*dev->flags&IFF_PROMISC */ ) {  
  29.         if (unlikely(compare_ether_addr_64bits(eth->h_dest, dev->dev_addr)))  
  30.             skb->pkt_type = PACKET_OTHERHOST;  
  31.     }  
  32.   
  33.     ;  
  34.     /*如果长度大于1536(最大帧长度),那么他是802.3兼容以太网卡,协议字段在eth->h_proto中标识*/  
  35.     if (ntohs(eth->h_proto) >= 1536)  
  36.         return eth->h_proto;  
  37.   
  38.     rawp = skb->data;  
  39.   
  40.     if (*(unsigned short *)rawp == 0xFFFF)  
  41.         return htons(ETH_P_802_3);  
  42.   
  43.     /* 
  44.      *      Real 802.2 LLC, 
  45.      * 802.2的协议头返回后,被当做三层报文处理, 
  46.      * 协议处理被散列在ptype_base中,协议处理函数为p8022_rcv() 
  47.      * 对应的三层协议可以通过 register_8022_client() 将自己的处理函数注册到p8022_rcv()中 
  48.      * 如果 register_8022_client(0xAA, snap_rcv)就将SNAP的三层处理函数注册进去了 
  49.      */  
  50.     return htons(ETH_P_802_2);  
  51. }  

通过上面的文章描述,我们清楚了LInux是如何组织二层协议处理的,希望大家批评指正




本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
深入解析物联网操作系统
Linux中uname命令作用是什么?
AMD Zen3一切顺利,已经被添加到Linux的内核中,这款处理器有哪些值得期待的革新?
Linux抛弃旧款CPU,一下子少50万行代码
MIPS架构厂商日渐式微 Linux报告其漏洞遭遇困难
《深入Linux内核架构》.pdf
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服