vsomeip如何进行跨网段通信
vsomeip如何进行跨网段通信
1. 说明
如图1所示,本次将演示vsomeip的跨设备跨网段实验。左边i.MX8M开发板将运行客户端程序,IP地址设置为192.168.100.60
,子网掩码为255.255.255.0
。相应的,右边开发板运行服务端程序,IP地址设置为192.168.90.60
。使用一台搭载Ubuntu20.04系统的笔记本电脑作为网关,分别使用2个USB有线网卡连接开发板。众所周知,两个终端不在同一网段,无法直接通信,因此需要使用一台Linux系统作为网关,连接两台终端,借助网关的路由转发功能进行通信。笔记本电脑的eth0和eth1,IP地址分别为192.168.100.50
和192.168.90.10
。欲实现vsomeip跨设备跨网段通信,需要依次完成单播跨网段通信、多播转发等工作,以下将分步骤详细阐述。

2. 单播通信设置
2.1 打开网关单播转发功能
出于安全考虑,Linux系统默认禁止数据包转发功能。所谓转发即根据数据包的IP地址将数据包从一块网卡发送到本机的另一块网卡的过程。打开Linux系统IP转发功能,需要配置Linux内核参数net.ipv4.ip_forward
。该参数表征Linux系统当前对IP转发功能的支持情况,权限为可读可写,其值为0时表示禁止IP转发,其值为1则表示IP转发功能以打开,如图2所示。

配置Linux内核中的net.ipv4.ip_forward
参数存在两种方式。其一为临时设置,系统重启或者对系统网络服务重启后均失效。通过修改内核参数的映射文件即可,对应的指令为:
1 |
|
其二为永久设置,使用vi打开/etc/sysctl.conf
文件,并取消如图3所示的红色方框处注释,保存后,使用sysctl -p
指令进行刷新即可。
为了防止网关拦截或丢弃数据包,设置rp_filter参数为0。rp_filter参数用于控制内核是否开启对数据包源地址校验。其值0为不开启源地址校验,1为严格反向路径校验,2为松散反向路径校验。**(这一步必须做)**
另外,ubuntu系统需要关闭防火墙,关闭的指令为 sudo ufw disable
。

2.2 配置静态路由
配置静态路由需要用到route指令,常用的参数有add(增加路由)、del(删除路由)、-net(设置到某网段路由)、gw(出口网关IP地址)、dev(出口网关,物理设备名)等,不再赘述。分别在笔记本电脑和i.MX8M开发板上输入如下的指令:
1 |
|
配置完成后,可使用route -n
指令查看,如图4和5所示。


2.3单播跨网段通信测试
笔记本电脑的IP地址为192.168.90.50
,i.MX8M开发板的IP地址为192.168.100.60
,使用ping指令进行测试,如图6所示,结果表明,单播跨网段通信正常。

3. 路由组播转发设置
3.1 组播转发说明
vsomeip的服务发现需要使用到组播功能,而在跨网段通信过程中,如何通过S32G进行组播数据转发,是一个首先需要解决的问题。
查看Linux内核中的组播转发功能是否开启,可以使用指令:
1 |
|
需要注意的是,mc_forwarding为只读文件,因此无法使用上文中操作单播路由转发的方式。只有在通过配置,正确打开了Linux组播转发功能,该参数才能变为1。如图7。

IP组播模块提供了创建和删除转发缓存的基本功能,但只有通过组播路由协议守护进程(通常是mrouted),依靠路由协议(如静态路由、OSPF、RIP、PIM)来生成转发缓存,才能真正实现组播功能。组播较为复杂,具体实现原理等可自行查阅相关资料。具体到组播转发功能,简言之,需要具备的前提条件为组播转发缓存和组播路由协议守护进程。组播转发缓存(MFC)更新操作完全由与内核交互的外部用户模式进程提供服务。内核是否支持组播功能,可通过如图8和9所示的两种方式查看。本次测试使用PIM-SM协议,因此其对应的组播路由协议守护进程可为开源软件pimd。


3.2 pimd的交叉编译及应用
pimd是一个轻量级、独立的PIM-SM/SSM组播路由守护进程,该程序起源于mrouted。设置好交叉编译工具链后,参照如下指令进行交叉编译,编译好的程序如图10所示。若在ubuntu环境中,可直接 apt 安装pimd。
1 |
|
注意事项:
在编译过程中,若提示找不到libite目录下的一些cpp文件,可下载libite,然后将libite/src
文件放置到/pimd/libite
。

通过pimd -d
可查看pimd运行信息,pimd -q
停止pimd程序,整个通信过程,pimd持续运行。更多指令可通过pimd -h
查看。
3.3 Linux组播相关指令
- ip_mr_vif
ip_mr_vif中列出了组播路由中涉及的两个网络接口(eth0和eth1),pimreg为组播管理代码注册的虚拟设备。指令:more /proc/net/ip_mr_vif

- ip mroute show

4. vsomeip源码修改与运行配置
4.1 vsomeip源码修改
vsomeip中没有对多播的生存时间(TTL,Time To Live)进行设置,跨网段通信中需要进行补充,参照图13修改vsomeip源代码,需修改源码的文件为:
1 |
|

4.2启动pimd守护进程
在笔记本电脑(充当网关)上运行pimd守护进程,运行指令为:sudo pimd -d
。运行成功后可通过指令:sudo pimd -r
查看路由表,如图14所示。通过图15中的mc_forward参数可以看出,linux内核中的多播转发功能已启动。


4.3 vsomeip运行配置
跨设备运行vsomeip程序需要修改配置文件以及在路由表中添加多播地址,以客户端为例,可参照下图进行设置。
1 |
|


5. vsomeip跨网段实验结果
vsomeip跨网段跨设备运行结果如图18所示,由图可知,服务端与客户端已经成功建立通信。真实实验环境如图19,至此,实验结束。


6. vsomeip跨网段通信问题分析与解决思路
6.1 网络TTL与vsomeip TTL区分
关于网络概念中的TTL,首先需要做出解释,并与vsomeip中的TTL区分。计算机网络概念中的TTL是指IP包被路由器丢弃之前允许通过的最大网段数量(跨路由器数量)。数据包经过一次路由器,其值减一,当值减至0时,路由器将取消该数据包的转发。其单位可以理解为“跳”。
而vsomeip中的TTL,值得是服务发现的生存时间,其单位为秒。其值一般在配置文件中赋值,如图20所示。

6.2 问题分析与解决思路
分析过程分为两个阶段,第一阶段的分析过程参照图21所示的系统设备连接图进行。其结论为:网关组播转发不成功。第二阶段继续探究组播转发不成功原因,并成功定位问题,其设备连接图参照图1。

单播通信成功后,首先在服务端设置组播,命令为:
1 |
|
然后在S32G上运行pimd程序,笔记本电脑与i.MX8M开发板分别运行vsomeip服务端与客户端程序。如图21所示。由图22可知,vsomeip服务端与客户端没有通信成功。预期的结果应如图23所示。


由图24可知,S32G开发板内核的组播转发参数mc_forwarding已经置为1,说明内核组播转发已经打开。图25为组播路由协议守护进程pimd运行log,由图可知,pimd选择IP地址192.168.100.90
作为组播汇聚点,并且客户端192.168.90.50
(PC)已经加入组播组。不过,通过 ip_mr_vif已知,终端数据可以进入,但无法转发,如图26。查看组播路由表,如图27,可以看出Iif存在而Oifs未找到。目前可以得出的结论为S32G组播转发不成功。




第二阶段继续探索组播转发不成功问题。首先使用wireshark工具进行网络抓包,抓取点如图28所示。如图29与30所示,由图可知,客户端的消息可以成功进入网关,而进一步分析其UDP包可知,其数据包的TTL为1。结合前文说明可知,数据包经过网关,TTL减至0,系统将数据丢弃。因此路由器另一端的开发板无法收到信息。



在进行源码修改后,跨网段通信成功。从图31处进行抓包,并进行分析,如图32所示,其TTL值从5减到4。其结果表明确实是TTL的问题。


6.3 错误排查思路
- 单播通信问题(这是前提)
- 多播TTL问题
- 系统防火墙问题
- linux rp_filter 网络包校验过滤问题
- PIMD RP(汇聚点)问题