功能需求
要测试两台电脑协作的一个项目,需要在两台电脑间进行通讯,测试工具是A.我的笔记本电脑,有无线网卡和有线网卡;B.一台TX2的工控机,有无线网卡和两个有线网卡,其中一个网口和PLC通讯,另一个和我的电脑通讯。
连接测试
需要先将两台电脑用网线连接起来并ping通。实现这一目标主要需要设置好网络参数,也就是通讯双方要有自己的名字IP,并且知道对方和自己处在一个网络中(子网掩码),也知道通讯的节点(网关)。
最常用的内网网段是192.168.0.1~255, 工控机连接PLC的网段就是这个:工控机用的固定ip是192.168.0.100,PLC用的固定ip是192.168.0.102,子网掩码255.255.255.0,也就是说前三(二进制就是24位)位192.168.0是一样的,
才会认为是在同一个网络中,网关是192.168.0.1,这个“同一个网络”所用的通讯接口就是这个网关。
用网线连接笔记本和工控机,随意设了一个ip,笔记本是192.168.0.60,工控机是192.168.0.66,发现ping不通,思考了一下之后明白了,192.168.0的网段已经被另一个网口占用了,这个网口需要开辟一个新的网段才能用。
查到问题就好办了,把两个都设到192.168.2.xxx网段,同样用255.255.255.0的掩码,这样工控机就能区分出来192.168.0来自一个网口,192.168.2是另一个网口的。设置好之后笔记本的网络信息如下:
enp0s31f6 Link encap:以太网 硬件地址 e8:6a:64:xx:xx:xx
inet 地址:192.168.2.1 广播:192.168.2.255 掩码:255.255.255.0
inet6 地址: fe80::3429:xxxx:xxxx:xxxx/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:395 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:2877 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:82992 (82.9 KB) 发送字节:255402 (255.4 KB)
中断:16 Memory:e9200000-e9220000
这样就可以互相ping到了。
进阶需求和测试
完成上面一步后,又出现了新的问题,笔记本有有线网卡和无线网卡,默认有线的优先级是高于无线的,所以有线插上之后,无线虽然连着,但起不到数据传输的作用了,这样我就上不了网。
所有还需要进一步对网络访问加以区分
Linux下使用route查看路由表:
dane@ThinkPad:~ $ route
内核 IP 路由表
目标 网关 子网掩码 标志 跃点 引用 使用 接口
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.2.1 0.0.0.0 UG 100 0 0 enp0s31f6
default 172.16.18.254 0.0.0.0 UG 600 0 0 wlp3s0
link-local * 255.255.0.0 U 1000 0 0 wlp3s0
172.16.18.0 * 255.255.255.0 U 600 0 0 wlp3s0
192.168.2.0 * 255.255.255.0 U 100 0 0 enp0s31f6
该ip路由表上有8个字段,Destination是表示目标ip段,它和Genmask(掩码)形成一个ip段。
当一个ip落在该目标ip段时,便找到了路由的出口,该出口就是一个网关(Gateway).
当然,还有一种情况就是,当一个ip落在两个目标ip段时,此时会根据跳跃点(Metric)来判断网关。
当一个ip不在目标ip段时,此时选择的是默认ip段(default).当存在一个多网卡的计算机时,可以给不同的网卡增加不同的路由信息。
举例:增加一条路由,目标ip段时133.40.16.0–133.40.16.255, 网卡是eth0.跳跃点是Metric 1,网关:133.40.16.0。
route add -net 133.40.16.0 netmask 255.255.255.0 gw 133.40.16.0 Metric 1 dev eth0
有效方案
尝试了很多方案之后(列在后面),找到了最适合的方法。ubuntu 16默认有两个网络管理设备,network 和 NetworkManager,这两者是不共生的,为了简便,
一般都用后者进行网络管理。对它的网络进行设置,只要在对应的配置文件中修改即可。管理员权限打开,参考link
中的命令进行参数修改。它与network的管理方式的级别关系是:
首先,当系统内没有第三方网络管理工具(比如nm)时,系统默认使用interfaces文件内的参数进行网络配置。(就像ubuntu Server版本一样)
接着,当系统内安装了 nm之后,nm默认接管了系统的网络配置,使用nm 自己的网络配置参数来进行配置。
但是,如果用户在安装nm之后(Desktop版本默认安装了nm),自己手动修改了interfaces 文件,那nm 就自动停止对系统网络的管理,系统改使用interfaces 文件内的参数进行网络配置。
此时,再去修改nm 内的参数,不影响系统实际的网络配置。若要让nm 内的配置生效,必须重新启用nm 接管系统的网络配置。
cd /etc/NetworkManager/system-connections/
在这个文件夹里可以看到所有的网络,比如我的无线网叫Wireless,网线连着的是wire,分别用gedit编辑这两个网络的配置信息:
打开文件后找到[IPV4]部分,增加route-metric
如下:
Wireless 无线网络设置
[ipv4]
dns-search=
method=auto
route-metric=15
wire 有线网络设置,根据自己情况设置好ip和网关即可,metric默认会为100
[ipv4]
address1=192.168.2.1/24,192.168.2.1
gateway=192.168.2.1
dns-search=
method=manual
设置好以后,需要重启网络并清理缓存:
# 重启网络并刷新配置
systemctl stop network-manager #停用NM
sudo pkill dhclient #停用dh
sudo ip addr flush dev eth0 #eth0 需要根据实际的网卡进行更改,我的就是wlp3s0
systemctl start network-manager #重启
重启完成后,再次查看路由表,会发现无线网metric变成了15,排在有线之前,可以正常访问外网了
而有线网有网段的限制,还是可以正常访问与之相连的有线网络的。
dane@ThinkPad:~ $ route -n
内核 IP 路由表
目标 网关 子网掩码 标志 跃点 引用 使用 接口
0.0.0.0 172.16.18.254 0.0.0.0 UG 15 0 0 wlp3s0
0.0.0.0 192.168.2.1 0.0.0.0 UG 100 0 0 enp0s31f6
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enp0s31f6
172.16.18.0 0.0.0.0 255.255.255.0 U 15 0 0 wlp3s0
192.168.2.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s31f6
尝试过不好用的方法
方法1. 临时修改路由网络,把原来默认的删掉,再加上想用的:
sudo route del -net 0.0.0.0
sudo route del -net 0.0.0.0 gw 192.168.2.1
sudo route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.2.1 metric 20 dev enp0s31f6
sudo route add -net 0.0.0.0 netmask 0.0.0.0 gw 172.16.18.254 metric 50 dev wlp3s0
这样做有两个缺陷,一是重新插拔会刷新覆盖,二是最后一条添加出来和默认值又几乎一样了。总之这是个指标不治本的方式,临时用一下行,长期肯定不行。
方案2.(不可用,因为通常用NM管理,这两者是冲突的)在ubuntu中的路径是 /etc/network/interfaces,
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
# 新增下面的内容:
auto wlp3s0
iface wlp3s0 inet dhcp
metric 10