目录

Linux-ECM子网掩码常见问题排查

Linux ECM子网掩码常见问题排查

1 前言

本文主要描述模组ECM数据拨号方式下常见子网掩码相关问题定位排查方法。

2 ECM拨号简介

ECM (Ethernet Networking Control Model 以太网控制模型) 用于在设备和主机之间传输以太网数据包。在 看来,CDC ECM设备就是一个虚拟 ,包含标准网卡需要的 和 。CDC ECM设备通常是一个 ,用于连接LAN或者是WLAN。当客户主机发起ECM拨号的请求时,模块相当于一个路由器,模块内部会调用相应的服务实现WWAN拨号。在拨号成功后,模块内部会启动DHCP server等功能。客户端应用系统 通过DHCP client 服务,获取模块DHCP server分配的IP 。客户主机调用DHCP等脚本实现把模块从网络侧获取到的IP和DNS配置到本机,实现上网。

2.1 ECM拨号基本业务模型

https://i-blog.csdnimg.cn/direct/f0e2f1e838914612ad0bc7d20f936a1c.png

模组内部WAN口提供无线上网服务,LAN口用于接入host数据。LAN口可以是USB口,以太网口或WLAN口。这些LAN口挂住同一个网桥下面,位于同一局域网之内。基于网桥会对应启动一个DHCP服务器,为与LAN口连接的上位机自动分配IP地址。该网桥下的数据的默认路由配置为经过对应的WAN口,这样访问外网的数据会从WAN口出去。

上位机在ECM拨号完成后启动dhcp client程序获取IP地址,子网掩码,网关等信息,使用这些信息配置对应的网口,默认路由,dns server。

2.2 子网掩码

子网掩码是一个32位地址,是与IP地址结合使用的一种技术。它的主要作用有两个,一是用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。二是用于将一个大的IP网络划分为若干小的子网络。

IP地址,子网掩码,该子网对应的网络地址及广播地址的关系如下:假设IP地址为ip,子网掩码为mask, 则该子网的网络地址为(ip & mask),该子网对应的广播地址为(ip & mask) | (~mask),该子网对应的主机地址范围为(网络地址+1,广播地址-1)。Linux系统如果接收到一个IP数据包,目的IP地址为本机,但源IP地址为本机网口对应子网的网络地址或广播地址,不会将该IP数据包送给上层的应用程序。因此如果多个设备或模块之间要支持互通,并且这些设备规划成是在同一个局域网下,则他们的子网掩码应该配置成一样,并且保证设备的IP地址不是这个子网的网络地址或广播地址。

2.2.1 模块WAN口子网掩码自动计算

ECM拨号完成后,模组会将WAN口rmnet_data0 up起来,配置IP地址、子网掩码,并且配置默认路由。rmnet_data0配置的ip地址是数据拨号完成后网络侧分配的IP地址。子网掩码及网关默认情况下是根据IP地址自动计算出来的。

子网掩码的计算规则如下:

/*————————————————————————

If LSB is 1, then skip all 1’s till 0 to generate netmask.

For Example:

IP      = 10.0.0.3        ( 0000 1010 0000 0000 0000 0000 0000 0011 )

netmask = 255.255.255.248 ( 1111 1111 1111 1111 1111 1111 1111 1000 )

If LSB is 0, then skip all 0’s till 1 to genrate netmask.

For Example:

IP      = 10.0.0.8        ( 0000 1010 0000 0000 0000 0000 0000 1000 )

netmask = 255.255.255.240 ( 1111 1111 1111 1111 1111 1111 1111 0000 )

————————————————————————*/

网关的计算规则是IP地址+1后的地址如果为该子网的广播地址则将IP地址-1作为网关地址,否则将IP地址+1作为网关地址,具体如下:

/*————————————————————————

Generate Server IP by adding 1 to IP address.

If by adding 1 the host address becomes broadcast address

then subtract 1 to generate server address.

For Example (Subtract):

IP      =  10.0.0.10       (0000 1010 0000 0000 0000 0000 0000 1010)

netmask =  255.255.255.252 (1111 1111 1111 1111 1111 1111 1111 1100)

Server  =  10.0.0.9        (0000 1010 0000 0000 0000 0000 0000 1001)

For Example (Addition):

IP      =  10.0.0.11       (0000 1010 0000 0000 0000 0000 0000 1011)

netmask =  255.255.255.248 (1111 1111 1111 1111 1111 1111 1111 1000)

Server  =  10.0.0.12       (0000 1010 0000 0000 0000 0000 0000 1100)

————————————————————————*/

2.2.2 模块WAN口子网掩码人工配置

根据IP地址自动计算子网掩码能满足正常的模块上网需求。但在专网应用场景,多个模块之间要求互通,自动计算子网掩码会导致这些模块不在同一个子网内,影响模块之间的互通。这种情况下需要将这些模块统一配置成相同的子网掩码,保证这些模块在同一个子网范围内。

可以使用AT指令配置模块WAN口的子网掩码。

2.2.3 上位机网口的子网掩码配置

正常情况下上位机网口的子网掩码是采用dhcp方式从模块获取的。

3 常见子网掩码问题定位

3.1 专网环境下模组之间无法通信

问题现象: 专网环境下多个模块之间存在某2个模块之间无法ping通,例如A可以ping通C,B可以ping通C,但A无法ping通B

问题排查: 这种情况下需要检查模块A和B的IP地址和子网掩码配置。检查A的IP对于B来说是否是B所在子网的正常的主机地址,同时检查B的IP对于A来说是否是A所在子网的正常的主机地址。如果不是对应子网的主机地址,就存在ping不通的现象。

例如,对于192.168.200.72及192.168.200.73,对应的网络地址、广播地址如下:

https://i-blog.csdnimg.cn/direct/b334683d0063441e80337fb67cae69b2.png

由于192.168.200.72对于192.168.200.73来说是网络地址,而不是主机地址,192.168.200.73设备接收到来自192.168.200.72设备的数据包后,不会将数据包送给上层的应用程序,从而出现ping不通的现象。

问题解决方案: 对于专网允许设备之间互相访问这种应用场景,需要取消模块wan口自动计算子网掩码,根据网络实际情况使用命令AT命令固定配置模块wan口的子网掩码。

3.2 上位机网口的子网掩码配置问题

问题现象: 非IPPASS模式下上位机无法ping通模块内部bridge0的IP地址。

问题排查: 检查上位机网口的IP地址和子网掩码配置,是否与模块内部bridge0的IP地址配置和子网掩码配置一致,确认上位机网口与模块内部bridge0是否处于同一个子网下。

问题解决方案: 如果出现不一致的情况,可以使用命令

AT命令

配置dhcp广播的子网掩码,修改成一致。