以太网基础:为什么需要VLAN?

admin 2023年12月12日01:36:01评论12 views字数 2748阅读9分9秒阅读模式

以太网基础:为什么需要VLAN?

以太网的开发中,有时需要为节点分配VLAN(Virtual Local Area Network,虚拟局域网)。但是,为什么要为节点分配VLAN呢?本文针对这个话题展开讨论。除此之外,文末给出Lwip(Light weight IP)+TC3xx VLAN实现的源码及注意事项。

划分VLAN场景

事物的出现,总有其合理性(即:存在即合理),所以,VLAN也有其出现的原因。先看这样一个工程场景:某个控制器(eg:ECU1)启动时,向交换机(Switch)发送ARP Broadcast,以便于获取目标节点MAC(Media Access Control)地址。由于是广播帧,交换机收到该帧后,转发给所有Port(不包括接收Port),也就是我们常说的泛洪(Flooding),如下所示:

以太网基础:为什么需要VLAN?

如果网络范围进一步扩大,即:多个Switch连接时,该帧ARP传播的范围会进一步扩大,如下所示:

以太网基础:为什么需要VLAN?

节点发送ARP的目的是为了获取目标节点的MAC地址,以便于通信。但是,这样的动作却要把信息传遍整个网络,如此,将增加网络负担。如上,只是讨论ARP广播的例子,实际工程中,类似场景还有很多:SOME/IP中的服务发现、未知单播帧的转发等。


所以,面对这些工程场景,应该如何降低网络带宽负载呢?答:可以通过VLAN技术,分割广播域,将信息的传播限定到一定范围。

VLAN划分原理

(一)VLAN格式

相比没有VLAN的以太网帧,包含VLAN的以太网帧多4 Byte(VLAN Tag),具体位置如下所示:

以太网基础:为什么需要VLAN?
以太网基础:为什么需要VLAN?


VLAN Tag包含TPID(Tag Protocol Identifier,标签协议标识符)和TCI(Tag Control Information,数据帧控制信息)两个部分,如下所示:

以太网基础:为什么需要VLAN?

各参数解释如下:

TPID:表示数据帧类型,0x8100 表示 IEEE 802.1Q 帧(C-VLAN),0x88A8表示S-VLAN;

PCP:Priority Code Point(3 bits),表示数据帧优先级,数值越大,优先级越高;

DEI:Drop eligible indicator(1 bit),丢弃资格标识符,表示 MAC 地址封装是否符合规范格式;

CFI:Canonical Format Indicator(1 bit),标准格式标识符;

VID:VLAN identifier(12 bits),表示帧所属的VLAN。取值范围: 0~4095。

(二)VLAN分割广播域原理

根据项目的实际情况,可以划分不同ECU组,之后,为每组ECU分配一个VID。比如:ECU1、ECU2划分到VID = 0x0A组,ECU2、ECU3划分到VID = 0x0B组,如下所示:

以太网基础:为什么需要VLAN?

当某个节点(eg:ECU1)发送ARP Broadcast报文时,该广播帧只能在相同VID(eg:VID=0x0A)的域内传播,非相关的VID组则不受影响,如下所示:

以太网基础:为什么需要VLAN?

如此,即限定了消息传播的范围,同时,也降低了总线带宽的消耗。

VLAN分组方式有多种:基于端口(Port)划分、基于协议(Protocol)划分、基于MAC地址划分、基于IP地址划分等。

Lwip+TC3xx的VLAN实现细节

开源的Lwip虽然是不错的Ethernet学习资料,但是,这并不意味着使用Lwip会一帆风顺。利用Lwip实现VLAN过程中,需要注意以下几点:

(一)netif.c修改

在netif.c的ifx_netif_input()接口中,需要添加ETHTYPE_VLAN,即:接收含有VLAN的以太网帧,修改如下所示:

err_t ifx_netif_input(netif_t *netif){    ......
switch (htons(ethhdr->type)) { /* IP or ARP packet? */ case ETHTYPE_IP: case ETHTYPE_ARP: case ETHTYPE_VLAN: ......

(二)发送VLAN设置

IfxGeth_Eth.c中,本文在接口IfxGeth_Eth_configureMacCore()中添加如下代码,设置VID=0x0A,如下所示:

void IfxGeth_Eth_configureMacCore(IfxGeth_Eth *geth, IfxGeth_Eth_MacConfig *macConfig){   ...    /* Set Send Vlan */    IfxGeth_mac_writeQueueVlanTag(geth->gethSFR, IfxGeth_MtlQueue_0, 0x0A);   ...}

IfxGeth_Eth_configureMacCore()接口的具体实现如下所示:

boolean IfxGeth_mac_writeQueueVlanTag(Ifx_GETH *gethSFR, IfxGeth_MtlQueue queueId, uint16 vLanTag){    Ifx_GETH_MAC_VLAN_INCL vlan_incl;
if (gethSFR->MAC_VLAN_INCL.B.BUSY) { return FALSE; } /* VLAN Tag Control in Transmit Packets */ vlan_incl.B.VLC = 2;
vlan_incl.B.RDWR = 1; vlan_incl.B.CSVL = 0; vlan_incl.B.VLT = vLanTag; vlan_incl.B.ADDR = queueId;
gethSFR->MAC_VLAN_INCL.U = vlan_incl.U;
// Wait until operation is finished while (gethSFR->MAC_VLAN_INCL.B.BUSY) {}
return TRUE;}


(三)含VLAN通信数据流

包含VLAN(VID = 0x0A)的通信数据流如下所示:

以太网基础:为什么需要VLAN?


(四)源码链接

本文实现的VLAN源码链接如下(仅供学习参考):
https://github.com/Kaixinguo2021/Tasking_Tc397_Eth_Multicast.git





以太网基础:为什么需要VLAN?

以太网基础:为什么需要VLAN?

码上报名

谈思实验室AutoSec智能汽车安全攻防实训课程,12月18-19日,上海

更多文章

智能网联汽车信息安全综述

华为蔡建永:智能网联汽车的数字安全和功能安全挑战与思考

汽车数据合规要点

车载以太网技术发展与测试方法

车载以太网防火墙设计

SOA:整车架构下一代的升级方向

软件如何「吞噬」汽车?

汽车信息安全 TARA 分析方法实例简介

汽车FOTA信息安全规范及方法研究

联合国WP.29车辆网络安全法规正式发布

滴滴下架,我却看到数据安全的曙光

从特斯拉被约谈到车辆远程升级(OTA)技术的合规

如何通过CAN破解汽

会员权益: (点击可进入)谈思实验室VIP会员


以太网基础:为什么需要VLAN?

以太网基础:为什么需要VLAN?

原文始发于微信公众号(谈思实验室):以太网基础:为什么需要VLAN?

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月12日01:36:01
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   以太网基础:为什么需要VLAN?https://cn-sec.com/archives/2287953.html

发表评论

匿名网友 填写信息