zoukankan      html  css  js  c++  java
  • 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() 就可以知道了,我们分析一下源代码

     

    /*某一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_dest, dev->broadcast))
    			skb->pkt_type = PACKET_BROADCAST;
    		else
    			skb->pkt_type = PACKET_MULTICAST;
    	}
    	else if (1 /*dev->flags&IFF_PROMISC */ ) {
    		if (unlikely(compare_ether_addr_64bits(eth->h_dest, dev->dev_addr)))
    			skb->pkt_type = PACKET_OTHERHOST;
    	}
    
    	;
    	/*如果长度大于1536(最大帧长度),那么他是802.3兼容以太网卡,协议字段在eth->h_proto中标识*/
    	if (ntohs(eth->h_proto) >= 1536)
    		return eth->h_proto;
    
    	rawp = skb->data;
    
    	if (*(unsigned short *)rawp == 0xFFFF)
    		return htons(ETH_P_802_3);
    
    	/*
    	 *      Real 802.2 LLC,
    	 * 802.2的协议头返回后,被当做三层报文处理,
    	 * 协议处理被散列在ptype_base中,协议处理函数为p8022_rcv()
    	 * 对应的三层协议可以通过 register_8022_client() 将自己的处理函数注册到p8022_rcv()中
    	 * 如果 register_8022_client(0xAA, snap_rcv)就将SNAP的三层处理函数注册进去了
    	 */
    	return htons(ETH_P_802_2);
    }


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




  • 相关阅读:
    ASP.NET CORE MVC验证码
    高效工作必备黑科技软件和网站
    asp.net core 新建area使用asp-action,asp-controller不管用
    add-migration : 无法将“add-migration”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次
    entity framework core + SQLite Error 1: 'no such table: Blogs'.
    abp去掉AbpUser中的Name,Surname
    PIE SDK去相关拉伸
    PIE SDK频率域滤波
    PIE SDK均值滤波
    PIE SDK聚类
  • 原文地址:https://www.cnblogs.com/pangblog/p/3290268.html
Copyright © 2011-2022 走看看