本文主要讲解了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是如何组织二层协议处理的,希望大家批评指正

Linux 二层协议架构组织的更多相关文章

  1. 【转帖】Linux 内核系统架构

    Linux 内核系统架构   描述Linux内核的文章已经有上亿字了 但是对于初学者,还是应该多学习多看,毕竟上亿字不能一下子就明白的. 即使看了所有的Linux 内核文章,估计也还不是很明白,这时候 ...

  2. linux i2c驱动架构-dm368 i2c驱动分析

      linux i2c驱动架构-dm368 i2c驱动分析   在阅读本文最好先熟悉一种i2c设备的驱动程序,并且浏览一下i2c-core.c以及芯片提供商的提供的i2c总线驱动(i2c-davinc ...

  3. linux集群架构

    Linux集群架构   根据功能划分为两大类:高可用和负载均衡 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务 实现高可用的开源软件有:heart ...

  4. Linux集群架构(二)

    Linux集群架构(二) 目录 八.LVS DR模式搭建 九.keepalived + LVS 十.扩展 八.LVS DR模式搭建 1.实验环境: 四台机器: client: 10.0.1.50 Di ...

  5. Linux集群架构(一)

    第二十八课 Linux集群架构(一) 目录 一. 集群介绍 二. keepalived介绍 三. 用keepalived配置高可用集群 四. 负载均衡集群介绍 五. LVS介绍 六. LVS调度算法 ...

  6. [转】LTE整体架构和协议架构概述

    1.1 LTE整体架构 LTE(Long Term Evolution,长期演进)是由3GPP(The 3rd Generation Partnership Project,第三代合作伙伴计划)组织制 ...

  7. Linux系统主流架构一

    Linux系统主流架构一 随着IT运维的不断发展,尤其的Linux的飞速发展,越来越多的企业开始使用Linux操作系统,例如:Centos.Red Hat.Ubuntu.Fadora等等,成千上亿个网 ...

  8. linux网络协议

    网络协议 本章节主要介绍linxu网络模型.以及常用的网络协议分析以太网协议.IP协议.TCP协议.UDP协议 一.网络模型 TCP/IP分层模型的四个协议层分别完成以下的功能: 第一层 网络接口层 ...

  9. Linux邮件服务器架构

    // 上面的过程只是实现了简单的本地用户的文件发送功能,只需要安装mailutil,不需要安装配置sendmail,看鸟哥的Linux私房菜中写的应该是本地用户发送邮件不需要sendmail.只有当非 ...

随机推荐

  1. java实现随机验证码的图片

    链接地址:http://blog.sina.com.cn/s/blog_407a68fc010006qo.html 1.一共需要2个常用java文件(RandomCode.java和RandomCod ...

  2. oracle语句块调用

    如果要写一个临时的语句块调用某个过程,可以参照以下方式: declare cursor v_is is select distinct aac001 from sic84 where aab001=5 ...

  3. Android的回调

    学了两三周的安卓了,最先开始是看mars老师的视频,看了一两天结合慕课网上的一些安卓视频,到现在算是有点入门了. 安卓立用得比较多的回调函数有点不明是怎么实现的,网上找了一些资料,结合自己的实践,总算 ...

  4. C#堆栈

    栈就是堆栈,因为堆和堆栈这样说太拗口了,搞得像绕口令,所以有些时候就把堆栈简称为栈.堆和栈,你看这又多舒服. 但无论什么时候,堆栈都不等于堆和栈,必须说,堆和栈或者堆和堆栈. 有人说:“C#的所有值类 ...

  5. PyQt中如何隐藏Menu

    PyQt中隐藏一个Menu Item,可以通过QAction的setVisible(False)来设置,而QMenu的setVisible(False)是不管用的. 现在问题来了,我们有一个菜单,它有 ...

  6. Android 开发中eclipse 下 DDMS 视图中 sdcard 中文件导入的处理

    首先需要说明下,这里说的sdcard的权限并不是指在Android application程序中设置sdcard的权限读 取问题.而是指在DDMS看到的目录下的那个sdcard目录的权限问题.     ...

  7. 基于visual Studio2013解决算法导论之047赫夫曼编码

     题目 赫夫曼编码 解决代码及点评 // 赫夫曼编码.cpp : 定义控制台应用程序的入口点. // #include <iostream> #include <stdio.h ...

  8. 微信平台接入Web页面功能接口(C#)

    微信平台接入web页面功能接口 今年因工作需要,通过微信平台接入公司的Wap页面,回忆下,记录内容,方面以后使用. 1.成为开发者后,你才可以使用公众平台的开发功能.需要填写URL和ToKen,接口配 ...

  9. leetcode第一刷_Binary Tree Inorder Traversal

    递归实现当然太简单,也用不着为了ac走这样的捷径吧..非递归实现还挺有意思的. 树的非递归遍历一定要借助栈,相当于把原来编译器做的事情显式的写出来.对于中序遍历,先要訪问最左下的节点,一定是进入循环后 ...

  10. mysql基础入门

    基本命令:(sql分号结束,切记.切记) 登录mysql:mysql -h ip  -u用户名 -p   或者  mysql  -u用户名  -p密码 查看数据库: show  databases: ...