400-035-6699
当前位置: 首页 » 技术支持 » 博文资讯 »

以太网技术:节点VLAN分配的重要性解析

以太网的发展中,我们经常需要对网络节点进行VLAN(Virtual Local Area network虚拟局域网)的分配。那么,为什么我们要为节点分配VLAN呢?本文将围绕这一主题进行探讨,并分享Lwip(Light weight IP)与TC3xx VLAN实现的源码及其注意事项
首先,让我们了解一个工程场景。当一个控制器(例如ECU1)启动时,它会向交换机发送ARP广播,目的是获取目标节点的MAC地址。由于广播帧的特性,交换机会将这个帧转发给所有端口(除了接收端口),这就是我们常说的泛洪。在网络规模较大,多个交换机相互连接的情况下,ARP广播的范围会进一步扩大,这无疑增加了网络的负担。
为了解决这一问题,我们可以通过VLAN技术来分割广播域,将信息传播限定在一定范围内。下面,我们来看看VLAN是如何工作的。
### VLAN格式与原理
VLAN帧与普通以太网帧的不同之处在于,它多了4个字节的VLAN Tag。这个Tag包含两个部分:TPID(Tag Protocol Identifier,标签协议标识符)和TCI(Tag Control Information,数据帧控制信息)。
TPID表示数据帧类型,0x8100代表IEEE 802.1Q帧(C-VLAN),0x88A8代表S-VLAN。PCP(Priority Code Point)表示数据帧的优先级,DEI(Drop Eligible Indicator)用于标记MAC地址封装是否符合规范,CFI(Canonical Format Indicator)则是标准格式标识符。VID(VLAN identifier)用于表示帧所属的VLAN,取值范围是0到4095。
### VLAN划分广播域
实际应用中,我们可以根据需求将不同控制器分组,并为每组分配一个VID。例如,将ECU1和ECU2分到VID为0x0A的组,将ECU2和ECU3分到VID为0x0B的组。当一个节点(如ECU1)发送ARP广播时,该广播帧只能在相同VID(如VID=0x0A)的域内传播,不会影响其他VID组。
### Lwip+TC3xx的VLAN实现细节
在使用Lwip实现VLAN时,需要注意以下几点:
1. **修改netif.c**:在ifx_netif_input()接口中,添加ETHTYPE_VLAN,以接收含有VLAN的以太网帧。
2. **设置VID**:在IfxGeth_Eth_configureMacCore()接口中,设置VID。例如,设置VID为0x0A。
3. **通信数据流**:配置含VLAN的通信数据流,确保数据帧正确传输。
通过以上步骤,我们可以有效地使用VLAN技术来优化网络性能,减少不必要的广播,提高网络的传输效率
总结来说,VLAN是一项重要的网络管理技术,它通过划分广播域来提高网络的性能和安全性。理解和掌握VLAN的应用,对于现代网络架构来说至关重要。同时,通过Lwip和TC3xx的实践,我们可以更好地理解VLAN的实现细节,为实际的网络设计提供指导。

以太网技术:节点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),如下所示:

5693423e-9812-11ee-8b88-92fbcf53809c.png

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

56a56f04-9812-11ee-8b88-92fbcf53809c.png

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

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

VLAN划分原理

(一)VLAN格式

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

56aa0cc6-9812-11ee-8b88-92fbcf53809c.png56aa0cc6-9812-11ee-8b88-92fbcf53809c.png

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

56c4d6f0-9812-11ee-8b88-92fbcf53809c.png

各参数解释如下:

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组,如下所示:

56d8031a-9812-11ee-8b88-92fbcf53809c.png

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

56eba8ac-9812-11ee-8b88-92fbcf53809c.png

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

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)的通信数据流如下所示:

5703c360-9812-11ee-8b88-92fbcf53809c.png








审核编辑:刘清

【限时免费】一键获取网络规划系统模板+传输架构设计+连通性评估方案

VLAN相关文章

服务电话:
400-035-6699
企服商城