网桥、vlan、源目MAC地址的链路层处理

本文详细介绍了Linux内核在链路层如何处理网桥、vlan以及源目MAC地址。链路层的主要任务包括与网卡驱动和协议栈上层的接口、网桥实现、vlan处理、邻居子系统、按以太网类型处理报文以及二层隧道功能。网桥原理类似于二层交换机,通过MAC地址表实现报文转发。在Linux中,网桥的实现集中在net/bridge/目录下的多个源代码文件中,包括MAC地址表、报文转发逻辑等。创建网桥和添加接口的过程涉及到br_add_bridge和br_add_if等函数。报文接收和发送处理中,网桥会进行动态MAC地址学习、ebtables过滤、报文复制等操作。对于传入本机或转发出去的报文,网桥根据目的MAC地址决定报文的流向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,链路层

在报文接收方向上,网卡驱动把接收到的数据按照其对应的链路层协议(如以太网)组装成报文,然后把它上交给链路层,接口是netif_receive_skb,至此网卡驱动的任务就结束了,报文交给链路层处理;

在报文发送方向上,网卡驱动受链路层驱使,链路层告知其有报文要发送时,网卡驱动才开始工作,接口是dev_queue_xmit。

上面是链路层和网卡驱动层的接口,然而在链路层不一定是报文最终的归宿,从报文接收角度看,绝大多数报文都要最终给目的主机的应用层,协议报文会在不同协议所属层次终结,所以大多数报文都还要由链路层处理后(或不处理)再向上层转发,比如IP报文,在链路层由ip_rcv函数进入网络层处理,比如由应用程序通过原始套接字获取的报文将在链路层被直接送往socket层,比如arp协议报文会被送往arp模块去处理……

再从报文发送角度看,不同的处理模块,会通过其专有接口通知链路层要发送报文,比如对于网络层,通过ip_finish_output(最终是ip_finish_output2)告诉链路层要发送报文(事实上是经由邻居子系统模块实际发送,邻居子系统实现链路层和网络层的映射,可以认为属于链路层和网络层的中间层),当然原始套接字的情况则比较简单,直接调用dev_queue_xmit通知网卡驱动,然而对于网桥、vlan子接口的收发,链路层的处理就显得极为必要,而从网络分层理论看,网桥、vlan,正是逻辑链路层的内容,这些都属于linux链路层的核心工作,典型的对于以太网的链路层,以太网类型、vlan、源目MAC地址是链路层的协议字段。

此外,在链路层的无需三层协议转发的二层隧道转发方式,典型如按网络层IP地址转发的eoip(Ethernet over ip),也是链路层的任务。

从功能上看,链路层完成以下任务:

  • 1、 实现与网卡驱动和协议栈上层的接口;
  • 2、 实现网桥,即实现按MAC地址转发的二层交换机功能;
  • 3、 实现vlan处理,实现带vlan报文的传输;
  • 4、 实现邻居子系统,即实现链路层和网络层的映射;
  • 5、 根据以太网类型,实现根据链路层协议类型收发报文;
  • 6、实现二层隧道功能(典型如依托于网络层IP地址转发的eoip隧道);

如上图,链路层由netif_receive_skb收到报文后,依次进行网桥处理、L2隧道处理、按以太网类型处理(事实上在按以太网类型处理前,还可能有其他处理),网桥处理中会根据报文是否发给本机还是转发做不同的处理,发给本机将修改报文输入接口为桥端口并返回netif_receive_skb重新进协议栈处理,转发则直接调用dev_queue_xmit从对应接口发送;L2隧道处理则根据所属隧道的目的IP寻找路由,并根据路由结果指示的出接口转发报文;按以太网类型处理,就根据以太网类型调用在之前注册过的协议处理函数,如vlan报文调用vlan_skb_recv,IP报文调用ip_rcv,arp报文调用arp_rcv等等;

需要注意对于网桥和vlan的上本机的报文,会更新报文的输入接口,由从网卡驱动接收接口改为对应的桥端口或vlan子接口(vlan报文还会去除vlan头),这是因为事实上上层协议栈关心报文的“逻辑”输入接口,而不是“物理”输入接口,这些报文的反向报文也是由上层协议栈发送到桥端口或vlan子接口,再继而转换为其原始的报文输入接口通往网卡驱动,简单的说就是网桥、vlan报文对于上层协议栈可见的是桥端口、vlan子接口。

综上所述,链路层的功能是提供协议栈与网卡驱动的接口、协议栈上层的接口(按以太网类型)、直接转发(网桥或L2隧道),另外邻居子系统实现了链路层和网络层的映射(对于IPV4为a

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值