九月 26th, 2010 wildlee
同网段不同掩码之通信原理 原创:wildlee
这两天发现51cto论坛里版主提出的一个简单问题,但看似简单,实则复杂。在此把心得写一下,感谢网友小飞侠、phetler、见贤思齐的指点。原题是:同一vlan下主机的掩码不相同,他们之间能互通吗?同一vlan下主机的掩码不相同,他们之间能互通吗?比如1.1.1.2/24和1.1.1.3/25,,网关是:1.1.1.1/24这两个主机中有一台不小心配错的掩码,请问他们能ping通网关并上网吗?他们之间能互访吗? 在经过反复思考与实验后终于得出结论:物理层不关心源mac是谁,只关心目标mac是不是自己的,是自己的就接收,无法分析上层协议。arp属于二层协议,在请求与发送数据包时不关心三层ip地址是否合法,只是记下目标mac与ip。解封装以下层协议为主,不在乎上层,封装时从上层协议开始,以上层协议为主,不在乎其下层协议。
我们搭建一个这样的网络,网关:192.168.1.1./24;主机A:192.168.1.2/24;主机B:192.168.1.3/25。
当我们配置好主机B:IP、掩码、网关的时候,会有什么情况发生呢?在这个有类ip为192.168.1.0/24 这个网段中通过子网掩码的划分,在B主机的眼中就变成了两个网段:网络192.168.1.0/25与192.168.1.128/25,如果B的主机号在192.168.1.128~254/25范围,那么主机B在192.168.1.128/25这个网络中,如果在192.168.1.0~127/25那么B主机在192.168.1.0/25这个网络中。与时同时,在主机B的上面还会发生什么呢?会产生本机路由条目如图:
在这里,我配置B的主机号为166,属于192.168.1.128/25这个网络,大家在图中也可以看到,如果我配置为192.168.1.3/25的话,那么你将看到路由表中将有192.168.1.0/25这个网络。所谓路由规则就是同网段的直接发,不同网段的交给网关发送。
看完上面的过程:我们来分析下B主机与A主机通信的过程,B现在要同主机A通信,由于在B的眼中,A主机的ip为192.168.1.2/25,所以B主机直接把A看作是192.168.1.0~127/25这个网段中的主机,并与其直接通信。然后在其整个网段中发送其arp广播包获得主机A的mac地址,并建立连接与其通信。在此过程中,主机A确把主机B看作是192.168.1.3/24这个网段中的主机来通信,因为没有任何人任何协议告诉它们的掩码是不同的,它们不是在一个网段中,对此通信可以说是一种巧合,机器是很笨的,网关也是如此。B认为网关的ip为192.168.1.1/25,网关认为主机B的ip是192.168.1.3/24(在内部网中,arp,icmp,ip,tcp,udp,不具备有通告子网掩码功能)所以在这种情况下,主机A与主机B访问ping网关都是OK 的,它们之间的互访问也是OK的。
上面我们看到的是一种的情况,假如主机B是另一个网段的呢?主机号为192.168.1.128~254/25这个范围的呢,这个就有点意思了,大家猜猜能不能通信呢?是怎么样的一个过程呢?我们来看下啊!我们把主机B的IP设置为192.168.1.150/25,
网关设置为192.168.1.1时,这时主机B就会跳出一个警告!!说网关与ip地址不在同一个网段,因为主机B认为网关是属于192.168.1.0/25这个网段的,不管那么多点击确定,因为主机的网关可以是不同网段的IP。当我们与主机A 通信时,主机B 认定主机A在192.168.1.0/25这个网络,他们不在同一个网段中,所以主机B不会去获得主机A的mac,它得到网关的mac ,然后发送数据包给网关。网关怎么做呢?它了解到目标IP为内网主机,是主机A,所以通过arp得到A的mac后,然后以源mac为网关,目标mac为A,网络层不变发送给主机A。
主机A收到这个包怎么做呢?也有点意思。在主机A的route里有这样一个网络就是192.168.1.0/24,现在主机A收到的这个数据包源ip,192.168.1.150,目标是自己ip 时,很明显,在主机A眼中,主机B和自己就是同一个网段的,所以A的高层忽略了链路层的mac是网关的,回复包也必须给网关mac的过程。这个由网络层决定,网络层认为B同自己在同一个网段,所以要得到B主机的mac地址,然后将数据包发给B。A主机发送arp广播请求B主机的mac,B主机收到后,解封装,低层不知道高层的ip间的不配对(b 主机ip与A主机ip不在同一个网段中),所以B主机上运行的arp协议直接发B主机的mac发送给了A。A主机得到mac后与B 主机通信。这样形成了一个三角通信关系。24位掩码到B直接走,B到A的走网关。但是居然能通信,这样一个三角关系。
我来说个例子:B主机ping主机A,ping 数据包被B主机送到网关,网关交给主机A,主机A发送回复包给主机B,主机B显示通信成功,认为主机A是通的,B不关心源mac是主机A的,只因高层网络层收到了这个回复包,认为通信成功。但在主机a包到来前,网关会返回给主机B 一个ping超时包,因为主机A根本没有返回数据包给网关,网关认为到达A是不通的或A拒绝回复ping。
我说下自己对vlan的看法,我认为每个vlan说白了,不管根据什么分的vlan。我认为每个vlan可以想成是由每个路由器连接的一个网络(网段),每个网段都有自己的网关,这好比大家在配置vlan时,每个vlan都有路由子接口,那就是每个vlan的网关了,大家不防仔细分析下其通信原理,我认为是一样的,只不过它是加入了一个链路协议,让路由多变小,线络多变少。其通信原理与我们平时局域网通信原理是一样的,不用把vlan协议想在其内,它只不过是实现了一种功能。