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.50192.168.90.10。欲实现vsomeip跨设备跨网段通信,需要依次完成单播跨网段通信、多播转发等工作,以下将分步骤详细阐述。

图1 设备连接图

2. 单播通信设置

2.1 打开网关单播转发功能

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

图2 查看Linux系统IP转发功能是否打开

配置Linux内核中的net.ipv4.ip_forward参数存在两种方式。其一为临时设置,系统重启或者对系统网络服务重启后均失效。通过修改内核参数的映射文件即可,对应的指令为:

1
echo '1' > /proc/sys/net/ipv4/ip_forward

其二为永久设置,使用vi打开/etc/sysctl.conf文件,并取消如图3所示的红色方框处注释,保存后,使用sysctl -p指令进行刷新即可。

为了防止网关拦截或丢弃数据包,设置rp_filter参数为0。rp_filter参数用于控制内核是否开启对数据包源地址校验。其值0为不开启源地址校验,1为严格反向路径校验,2为松散反向路径校验。**(这一步必须做)**

另外,ubuntu系统需要关闭防火墙,关闭的指令为 sudo ufw disable

图3 /etc/sysctl.conf文件

2.2 配置静态路由

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

1
2
3
4
#  i.MX8M开发板(192.168.100.60)
route add -net 192.168.90.0/24 gw 192.168.100.50
# i.MX8M开发板(192.168.90.60)
route add -net 192.168.100.0/24 gw 192.168.90.10

配置完成后,可使用route -n指令查看,如图4和5所示。

图4 i.MX8M开发板(192.168.100.60)
图5 i.MX8M开发板(192.168.90.60)

2.3单播跨网段通信测试

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

图6 单播跨网段通信测试

3. 路由组播转发设置

3.1 组播转发说明

vsomeip的服务发现需要使用到组播功能,而在跨网段通信过程中,如何通过S32G进行组播数据转发,是一个首先需要解决的问题。

查看Linux内核中的组播转发功能是否开启,可以使用指令:

1
cat /proc/sys/net/ipv4/conf/all/mc_forwarding

需要注意的是,mc_forwarding为只读文件,因此无法使用上文中操作单播路由转发的方式。只有在通过配置,正确打开了Linux组播转发功能,该参数才能变为1。如图7。

图7 mc_forwarding组播转发参数

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

图8 查看内核是否支持组播(方式一)
图9 查看内核是否支持组播(方式二)

3.2 pimd的交叉编译及应用

pimd是一个轻量级、独立的PIM-SM/SSM组播路由守护进程,该程序起源于mrouted。设置好交叉编译工具链后,参照如下指令进行交叉编译,编译好的程序如图10所示。若在ubuntu环境中,可直接 apt 安装pimd。

1
2
3
./configure --prefix=<.../your_install_dir>
make
sudo make install

注意事项:

在编译过程中,若提示找不到libite目录下的一些cpp文件,可下载libite,然后将libite/src文件放置到/pimd/libite

图10 交叉编译成功的pimd程序

通过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

图11 PC ip_mr_vif参数
  • ip mroute show
图12 PC 查看组播路由表

4. vsomeip源码修改与运行配置

4.1 vsomeip源码修改

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

1
<vsomeip_Dir>/implementation/endpoints/src/udp_server_endpoint_impl.cpp
图13 vsomeip源码修改

4.2启动pimd守护进程

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

图14 pimd路由表
图15 mc_forward参数

4.3 vsomeip运行配置

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

1
2
# 运行, 自行修改
sudo sh ./run_client_request_fu.sh
图16 client.json配置文件
图17 run_client_request_fu.sh脚本文件

5. vsomeip跨网段实验结果

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

图18 vsomeip跨网段跨设备运行结果
image-20230414110043768
图19 真实实验设备

6. vsomeip跨网段通信问题分析与解决思路

6.1 网络TTL与vsomeip TTL区分

关于网络概念中的TTL,首先需要做出解释,并与vsomeip中的TTL区分。计算机网络概念中的TTL是指IP包被路由器丢弃之前允许通过的最大网段数量(跨路由器数量)。数据包经过一次路由器,其值减一,当值减至0时,路由器将取消该数据包的转发。其单位可以理解为“跳”。

而vsomeip中的TTL,值得是服务发现的生存时间,其单位为秒。其值一般在配置文件中赋值,如图20所示。

图20 vsomeip 服务发现TTL

6.2 问题分析与解决思路

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

图21 系统设备连接图

单播通信成功后,首先在服务端设置组播,命令为:

1
sudo route add 224.224.224.245 dev <网卡名称>

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

图22 当前vsomeip跨网段通信实验结果
图23 预期vsomeip通信实验结果

由图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组播转发不成功

图24 mc_forwarding组播转发参数
图25 pimd程序运行log
image-20230414111425305
图26 ip_mr_vif结果
图27 ip mroute show结果

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

图28 wireshark进行网络抓包
图29 分析UDP数据包
图30 分析UDP数据包

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

图31 wireshark进行网络抓包
图32 UDP数据包分析

6.3 错误排查思路

  • 单播通信问题(这是前提)
  • 多播TTL问题
  • 系统防火墙问题
  • linux rp_filter 网络包校验过滤问题
  • PIMD RP(汇聚点)问题

vsomeip如何进行跨网段通信
http://ziyangfu.github.io/2023/04/14/vsomeip如何进行跨网段通信/
作者
FZY
发布于
2023年4月14日
许可协议