程序员社区

直连的不同网段的两台主机如何通信

今天我们来看一下,如何让两台直连的主机,配置不同网段的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地址无关


赞(2) 打赏
未经允许不得转载:IDEA激活码 » 直连的不同网段的两台主机如何通信

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区