第二章 网络接口配置:从物理层到链路层的实战
好,咱们进入第二章。网络接口配置,说白了就是让VxWorks知道「用哪块网卡、怎么用」。我刚开始接触VxWorks网络栈时,觉得这步很简单——不就是配个IP地址嘛。结果第一次在嵌入式设备上调试,网口死活不通,折腾了两天才发现是接口类型选错了。嗯,从那以后我再也不敢小看这章内容了。
2.1 网络接口类型:你面对的是哪种网卡?
VxWorks支持的网络接口类型,其实就三大类。我按实际项目中遇到的频率排个序:
- END (Enhanced Network Driver):这是最常用的。说白了就是标准以太网控制器,比如Intel的I210、Broadcom的BCM57xx。我做过的一个电力网关项目,用的就是END驱动。
- VxBus + END:VxWorks 6.x以后的主流方式。设备树自动枚举,驱动加载更智能。我个人习惯在新项目里优先用这个。
- MUX (Multiplexer) 接口:这玩意儿比较特殊。它是在END之上再抽象一层,支持虚拟接口、VLAN等。你想想看,一个物理网口要拆成多个逻辑接口,就得靠MUX。
怎么判断当前系统支持哪些接口?我一般用这个命令:
-> iShow
它会列出所有已加载的驱动。如果看到"end"字样的设备,那就是END接口。我曾经在一个老项目里发现驱动没加载,折腾半天,结果就是BSP配置里少了个宏定义。
2.2 ifconfig命令详解:不只是配个IP
很多人以为ifconfig就是配IP地址的。其实它的功能远不止这些。我把它拆成三个层次来讲:
2.2.1 基础用法:查看接口状态
-> ifconfig
gei0: flags=0x1008863<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST>
mtu 1500
inet 192.168.1.100 netmask 0xffffff00 broadcast 192.168.1.255
ether 00:30:48:12:34:56
这里有个细节:flags字段。我见过不少工程师只看IP地址,忽略了接口状态。如果UP和RUNNING没同时出现,那接口就是有问题的。有一次现场反馈网口不通,我远程一看,flags里只有UP没有RUNNING——物理层没起来,网线松了。
2.2.2 配置参数:不只是IP
ifconfig能配的参数,我列个表:
| 参数 | 作用 | 我踩过的坑 |
|---|---|---|
| inet | IP地址 | 注意字节序,VxWorks用网络字节序 |
| netmask | 子网掩码 | 十六进制格式,0xffffff00别写错 |
| mtu | 最大传输单元 | 默认1500,但有些工业协议要求改小 |
| ether | MAC地址 | 可以改,但别乱改,会冲突 |
举个例子,配一个静态IP:
-> ifconfig gei0 inet 192.168.1.100 netmask 0xffffff00
配完记得检查:
-> ifconfig gei0
2.3 网络接口参数配置:那些容易被忽略的细节
除了IP地址,还有几个参数我建议你重点关注:
2.3.1 MTU:别小看这个值
MTU默认1500字节。但有些场景需要改:
- 工业以太网:比如Profinet,要求MTU不能超过1500,但有些设备只支持1024。我遇到过因为MTU不匹配导致丢包的情况。
- VPN隧道:加了IPSec头部后,实际载荷会变小。不改MTU会导致分片,性能下降。
改MTU的命令:
-> ifconfig gei0 mtu 1400
2.3.2 混杂模式:抓包必备
调试网络问题时,我经常用混杂模式:
-> ifconfig gei0 promisc
这样网卡会接收所有经过的数据包,不管目标MAC是不是自己。配合tcpdump或Wireshark,基本能定位90%的网络问题。
ifconfig gei0 -promisc。
2.4 链路聚合配置:从单链路到高可用
链路聚合,说白了就是把多个物理网口绑成一个逻辑口。好处有两个:带宽叠加、冗余备份。我在一个轨道交通项目里用过,要求网络7x24小时不中断。
2.4.1 聚合模式选择
VxWorks支持两种模式:
- Active-Backup(主备模式):一个口工作,另一个口待命。切换时间大约1-2秒。我建议对实时性要求不高的场景用这个。
- Load Balance(负载均衡):两个口同时收发。但要注意,VxWorks的负载均衡是基于源MAC+目的MAC的哈希,不是简单的轮询。
2.4.2 配置步骤
假设你有两个物理口gei0和gei1,要绑成lag0:
-> muxBind "lag0", "gei0"
-> muxBind "lag0", "gei1"
-> ifconfig lag0 inet 192.168.1.100 netmask 0xffffff00
这里有个关键点:muxBind的顺序决定了主备模式下的主口。第一个绑定的就是主口。我曾经因为顺序搞反,导致主备切换后性能下降。
2.4.3 验证聚合状态
-> muxShow
这个命令会显示每个聚合口的成员状态。如果某个成员显示DOWN,说明链路断了。我一般会写个脚本定期检查,一旦发现成员异常就告警。
2.5 实战经验总结
最后,我把自己这些年积累的几个要点列出来:
- 先确认物理层:配任何网络参数前,先看网口灯亮不亮。灯不亮,配什么都没用。
- 配置要持久化:VxWorks的ifconfig配置默认只存在内存里,重启就丢了。记得写到启动脚本或配置文件中。
- 调试用最小配置:遇到网络问题,先把所有聚合、VLAN去掉,用最简配置测试。我80%的问题都是这样定位的。
- 日志要打开:在BSP配置里打开网络驱动的调试日志。很多问题看日志就能找到原因,不用抓包。
嗯,这章内容就到这里。网络接口配置看似基础,但恰恰是很多问题的根源。下一章我们讲IP层配置,到时候会涉及路由、多网卡等更复杂的内容。记得把今天的内容练熟,后面用得上。