今天我们来看一下,如何让两台直连的主机,配置不同网段的ip地址后,还可以ping通。同时从中可以了解些什么?
环境配置
准备两台电脑,系统是Ubuntu的,用一根网线把它们的网络接口连起来
在Ubuntu的终端下配置它们的ip地址:
- A主机的本地网卡eth0配置192.168.1.100/24
- B主机的本地网卡eth0配置192.168.3.100/24
打开B主机的wireshark抓包工具,在本地网卡eth0上抓包
执行步骤
首先在终端下用ifconfig配置好两台主机的ip地址后,在A主机的终端窗口下直接ping B主机的ip地址192.168.3.100,发现并没有ping通,A主机的终端下显示:connect:Network is unreachable
我们知道:
A想要发icmp请求,首先icmp请求报文必须是一条完整的报文
一般发出的报文缺的是什么?
目的MAC地址
所以A必须先发广播ARP请求,但是B并没有收到ARP请求
A和B是直连的,它们也没有路由器隔绝广播报文,为什么B没有收到广播ARP请求呢?
AB直连,应该不存在在中途丢失的可能,B又没收到,那么也就是说只有一种可能,A的ARP根本没有发出去,为什么没有发出去?
因为它根本没有找到发出去的路径,它不知道发给目的ip为192.168.3.100的报文应该从哪个网络接口发出
为什么不知道?是因为它在路由表里没有找到匹配的路由规则。这也就是为什么A主机会显示:connect:Network is unreachable的原因
所以第二步
在A的路由表里添加一条路由规则,发给192.168.3.0/24网段的所有报文都要从网卡eth0发出去,这样就能让一条完整的报文从指定的网络接口发出去
此时再次执行ping操作,A由于不知道B的MAC地址,会先发广播ARP请求
广播ARP请求是完整的吗?是的
为什么?
因为目的MAC地址是有的,广播MAC地址
完整的报文如果想发出去,要去路由表里找匹配的规则,发给目的ip 192.168.3.100的报文能匹配到吗?
可以的,因为在上一步加了一条规则,所有发给192.168.3.0/24网段的报文从网卡eth0发出去,所以广播ARP报文就可以发出去了
发是发出去了,那能到达B主机吗?
由于是直连,当然可以
试想一下,如果A和B是用路由器连接,能到达B吗?肯定到不了,为什么?因为路由器隔绝广播报文
主机B收到了A的广播ARP请求报文,但是却没有回复ARP响应,为什么?
和之前的A主机发不出去ARP请求一样,B想发ARP响应,但是在路由表里没有找到路由规则,去往192.168.1.0/24网段的路由规则
所以第四步
B主机也要添加一条路由规则,发给192.168.1.0/24网段的所有报文都要从网卡eth0发出去,这样就能让一条完整的报文从指定的网络接口发出去
此时A主机再次ping B主机,发现能ping通了,B主机上抓包可以看到,首先A主机发来了ARP请求,B主机ARP协议层自动回复了ARP响应,接着A又发来了icmp请求,B主机的icmp协议层又自动回复了icmp响应
由此,A和B的ip地址虽然不同网段,但是直连的它们还是可以通信的
那再思考一个问题:
直连的两台主机如果ip地址同网段,可以ping通,这是毫无疑问的,但是也没有手动添加路由规则啊,为什么就可以ping通?
那是因为当你的主机网卡在配置ip地址时,系统就自动地把“这个ip的网段和这个网卡”作为规则添加到路由表里了
总结
-
一条报文如果想发出去,必须确保是完整的报文,这也就是说它的源ip、源mac、目的ip、目的mac必须是有的,然后还要根据它的目的ip匹配路由表,确定要从哪个网卡发出,有了这些,报文就会从网卡发出去
-
发出去的报文,如何准确发到目的主机,由网络上的交换机和路由器等决定
-
广播报文的广播域,并不是指源主机同网段的所有主机,而是只要没有路由器隔绝,就能发给所有连接的其他主机的区域,广播域和ip地址无关