4.6、VLAN处理:

4.6.1、vlan原理

对于带vlan的以太网报文,其以太网类型为0x8100,所以链路层中对于带vlan报文的处理就是对于以太网类型为0x8100的报文的处理;

vlan,用于在链路层划分广播域,实现数据在链路层分流,在二层交换机中,vlan实际行使其功能是体现在uni端口上,通过在端口上配置能通过哪些vlan,实现不同的端口可以通行不同的数据流,比如二层交换机的端口有的是access端口,即配置为只能通过一个vlan,有的是trunk端口,即配置为可通过多个vlan(很多二层网络设备可能还有其他的叫法,如raisecom设备根据CTC标准端口可配置为透传模式、翻译模式、trunk模式、tag模式等,但本质含义相似,都是在配置能通过哪些vlan),二层交换机的vlan处理如下图:

在上图中,发出报文带有vlan10、20、30的PC分属不同的广播域,即比如发出报文带vlan20的PC如果连在交换机的红色端口上,那么报文会被交换机直接过滤掉,因为红色端口不能通过vlan20的报文,所以如果发出报文带vlan20的某蓝色PC发出广播包,那么所有其他的蓝色PC都能收到这个广播包,而其他PC无法收到,这就是划分广播域。

linux的vlan处理与之相似,每个接口相当于二层交换机的每个物理端口,同样由用户给不同端口配置其可通过的不同的vlan,当带有某vlan的报文进入某接口时,通过检测该接口是否存在该vlan的vlan子接口决定是否可通行此报文,可以理解为,linux对vlan的处理就是通过vlan子接口的方式,实现二层交换机端口vlan的功能。

4.6.2、linux的vlan处理:

linux的vlan处理源码在代码树net/8021q/目录下,核心文件是vlan.c和vlan_dev.c;

linux的vlan处理和网桥处理很相似,在接收方向上,链路层收到带vlan报文后先进入vlan模块处理,然后在找到对应的vlan子接口后,更新报文输入接口为vlan子接口并剥除vlan,然后把该报文打回链路层重新处理,上层协议栈可见的是该报文从vlan子接口接收;在发送方向上,上层协议栈把报文由vlan子接口发送,继而再通过其原始接收的宿主接口发送出去,以带vlan10的报文为例,下图串联了带vlan报文的接收和发送:

vlan模块在内核的初始化由函数vlan_proto_init完成,它包括如下内容:

1、  在内核中注册以太网类型值为0x8100的ptype(处理函数为vlan_skb_recv)

2、  注册linux对于vlan的ioctl接口,典型如vconfig使用它

3、  初始化linux的vlan值集合功能,它用于记录宿主设备的vlan子接口的功能

4、  注册linux的vlan相关的proc接口,即/proc/net/vlan;

5、  注册linux对于vlan相关的routenetlink接口;

6、  注册linux的vlan相关的内核通知链;

我们已经知道linux的vlan处理就是根据二层交换机vlan原理实现的,其本质就是接口的vlan子接口的实现,下面就通过vconfig工具创建vlan子接口的过程描述:

vconfig工具在内核中首先调用vlan_ioctl_handler函数,对于创建vlan子接口的操作,调用函数register_vlan_device,参数是用户输入的宿主接口和vlan值,如宿主接口是eth0、vlan值是10,那么就是说在接口eth0中加入一个vlan子接口eth0.10,意思就是说接口eth0允许带vlan10的报文通过;

vlan型接口的私货是结构体vlan_dev_info,它里边最重要的字段就是记录了宿主接口和vlan值,此外和网桥型接口一样,vlan型接口在内核中也有专用的ops,在vlan_dev.c文件中定义了全局变量vlan_netdev_ops,它规定了vlan型接口的ops,比较需要注意的就是它的发送方法vlan_dev_hard_start_xmit,其他方法和普通接口区别不大;

创建的vlan子接口继承了其宿主接口的MAC地址、MTU,最终由函数register_vlan_dev把该vlan子接口注册进内核,并且同时在宿主接口中记录该vlan子接口,

这里注意下内核通过结构体vlan_group描述每个宿主接口都有哪些vlan子接口,在vlan模块中通过内部函数__vlan_find_group查找定位,外部函数__find_vlan_dev供查找某接口是否存在某vlan值的vlan子接口,这就是vlan报文处理函数vlan_skb_recv一上来就要判断的,判断该宿主接口是否存在该vlan值的子接口,即是否允许带该vlan的报文通过;

如果不允许通过则就此丢弃该报文,否则说明可以通过,先将报文的输入接口(skb->dev重置为vlan子接口),再将vlan标签剥除(vlan_check_reorder_header),再打回链路层重新处理(netif_rx),这样再处理时上层协议栈认为该报文由vlan子接口进入的;

所以对于该报文的回复报文,上层协议栈也会把它从该vlan子接口发送,这将调用vlan型接口的发送函数vlan_dev_hard_start_xmit,它将根据vlan子接口找到其宿主接口,更新报文的出接口(skb->dev)为宿主接口,最终调用dev_queue_xmit把报文从宿主接口发送出去。

事实上linux只实现了二层交换机的最简单的vlan功能,主要是CPU并不直接做二层转发,二层转发是由硬件完成的,但是二层的很多qos功能由vlan实现,带不同vlan的报文走不同的业务通道,比如vlan10在二层转发中所走通道比其他vlan更快,那么重要报文会加上vlan10的标签,也许这样的报文需要上CPU处理,所以linux需要能够识别vlan。

linux网络协议栈(四)链路层 (5)vlan处理相关推荐

  1. linux网络协议栈(四)链路层 vlan处理

    转:http://blog.csdn.net/u010246947/article/details/18224517 4.6.VLAN处理: 4.6.1.vlan原理 对于带vlan的以太网报文,其以 ...

  2. Linux网络协议栈(四)——链路层(2)

    2.协议相关 2.1.第3层协议的管理 在Linux内核中,有两种不同目的的3层协议: (1)    ptype_all管理的协议主要用于分析目的,它接收所有到达第3层协议的数据包. (2)    p ...

  3. 一文了解linux 网络协议栈(链路层)

    [推荐阅读] 浅谈linux 内核网络 sk_buff 之克隆与复制 深入linux内核架构--进程&线程 浅析linux内核网络协议栈--linux bridge 1. int netif_ ...

  4. 理解 Linux 网络栈:Linux 网络协议栈简单总结

    1. Linux 网络路径 1.1 发送端 1.1.1 应用层 (1) Socket 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的.Linu ...

  5. Linux 网络协议栈开发—— 二层桥实现原理

    网桥原理: 网桥工作在链路层,所以它是二层的东西,对于以太网来说网桥和二层网络设备交换机的工作方式几乎是一样的,每个交换机包含一系列以太网接口,交换机通过其内部的硬件交换芯片实现对这些以太网接口出入报 ...

  6. Linux网络协议栈:网络包接收过程

    目录 一 Linux网络收包总览 二 Linux启动 2.1 创建ksoftirqd内核线程 2.2 网络子系统初始化 2.3 协议栈注册 2.4 网卡驱动初始化 2.5 启动网卡 三 迎接数据的到来 ...

  7. 监视和调整Linux网络协议栈:发送数据

    目录 有关监视和调整Linux网络堆栈的一般建议 总览 详细外观 协议族注册 通过套接字发送网络数据 sock_sendmsg,__sock_sendmsg和__sock_sendmsg_nosec ...

  8. linux 虚拟机大量udp请求失败_理解 Linux 网络栈:Linux 网络协议栈简单总结分析...

    1. Linux 网络路径 1.1 发送端 1.1.1 应用层 (1) Socket 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的.Linu ...

  9. Linux网络协议栈:关闭一个还有没发送数据完的TCP连接

    <监视和调整Linux网络协议栈:接收数据> <监控和调整Linux网络协议栈的图解指南:接收数据> <Linux网络 - 数据包的接收过程> <Linux网 ...

最新文章

  1. 查询XML节点 value
  2. SAP RETAIL 通过自动补货功能触发的采购申请有些啥特殊的地方?
  3. CSS题目系列(1) - 可滚动的Table
  4. python3.8安装pip-CentOS7.2安装python3.8与pip
  5. 代码整洁之道——童子军军规
  6. android在视频上放view,android在SurfaceView上播放视频
  7. 坚持是一件很难的事情
  8. Knative Service 是如何指定端口和协议的
  9. # 字节数组转uint32_字节跳动客户端校招面经(21届秋招内推)
  10. LeetCode4. 寻找两个有序数组的中位数
  11. 两条信号之间加电容_信号完整性SI读书笔记之一
  12. (转)详解HTML网页源码的charset格式
  13. mybatis逆向工程利用mybatis-generator-core自动生成代码
  14. open3d 0.13的c++版本使用demo
  15. 即时聊天软件开发体会
  16. 计算机主机有异响,电脑主机有异响怎么办?电脑主板有异响的原因和解决方法...
  17. Wordpress搭建完毕上传主题报错,Unable to create directory wp-content/uploads/...
  18. SMM项目集成Log4j2
  19. 非对称TSP问题(asymmetric travelling salesman problem)与对称TSP问题的转换
  20. java poi 生成excel_利用POI生成EXCEL文件的方法实例

热门文章

  1. 信息系统综合知识八 专业英语
  2. 28岁从事功能测试6年被辞,面试2个月还没到工作···
  3. PTA 吉老师的回归
  4. 设计模式-合成复用原则-》面向对象设计原则
  5. 无线网络攻击类型及防范
  6. Drone 自定义 UI
  7. 也许是国内最全“智能音箱”评测,教你如何选 AI 音箱?
  8. 游戏开发主要学哪些课程?
  9. java接口如何有效防止恶意请求
  10. 属性动画+购物车+结算