刚开始学习网络方面的技术,只知道不同网段的主机不能通信,却不知道为什么。最近通过不断的学习才弄明白其中的一些道理,现谈谈我的看法:

以下内容基于下面的实验拓扑:

 

不同网段主机为什么不能相互通信_休闲

两台主机PC1 PC2,中间连接一个台交换机,两台主机IP地址段不同,如上所示

PC1是我的真实电脑,10.1.1.1是一个虚拟网卡,192.168.1.7是真实网络接口,其网关为192.168.1.1;PC2是用一台虚拟交换机模拟的。

而我们在测试两台主机通信成功与否是主要运用了Ping这个程序,我们知道Ping使用的是ICMP协议,她是一个三层范围内的协议,是IP协议的附属协议,假如我们再PC1上去ping PC2时,我们可以预见,PC1必定需要知道去往PC2的路由信息才可以去处(此时数据在第三层,还未牵涉到第二层),但遗憾的是PC1并不知道PC2的路由信息,也即PC1中并没有关于10.1.2.0/24网段的路由信息,我们可以使用RoutePrint命令来打印出PC1中的路由信息:

不同网段主机为什么不能相互通信_职场_02

可以看出PC1中并没有关于网段10.1.2.0的路由信息,只有10.1.1.0网段的路由信息,我这里有一个默认的路由,从192.168.1.7接口出去通过网关192.168.1.1到公网了,结果就是返回TTl超时信息,而不是目标不可达信息,应为此时PC1本身已经在为自己做路径选择了,他选择了默认路由,从192.168.1.7接口出去了

不同网段主机为什么不能相互通信_交换机_03

Sniffer在接口192.168.1.7上捕捉到的ICMP包:

不同网段主机为什么不能相互通信_IP_04

这说明,到10.1.2.1的包确实是被PC1本身给路由出去了,但是有去无回,截获到的ICMP包全都是Type为8的请求包,而无Type为0的回应包。

不同网段主机为什么不能相互通信_休闲_05

而假如我们把我电脑上的192.168.1.7接口的网关也去掉,那么也就是说,我电脑里的用来模拟PC1的路由信息中的默认路由就会丢失,那么当我再Ping10.1.2.1的时候,主机PC1就找不到到10.1.2.0网段的任何路由信息了,那么她会返回 主机不可达的信息:

不同网段主机为什么不能相互通信_交换机_06

返回 主机不可达:

不同网段主机为什么不能相互通信_职场_07

以上都发生在网络层,还不曾牵涉交换机的链路层,此时数据均未通过Switch进行过传播,此时数据包以及帧被抑制在了PC1内,如果不设置网关,PC1根本就没有机会发出arp的广播包,因为触发ARP查询的ICMP包已经在网络层被PC1自身终结,从而也不会继续向下层去查询硬件地址了。