[转]为什么连接同一台交换机的不同网段的PC无法进行通信?
http://cwfsxlove.blog.51cto.com/43997/50387
掌握cmd下的两个命令arp和route你就会明白,下面解释一下:
首先,第一题中明确告诉你无三层设备,也就是说你连的网络中不会有网关的存在,即使你的PC设了一个网关,但是这个网关也是无效的,同意这点吗?画个图来 说:PC1--交换机--PC2。PC1假设为192.168.1.1,PC2为192.168.2.1,掩码默认。那么你在发PING请求时,应该先了 解下发出的过程。
PC中有个ARP表,要知道PC上的数据到二层进行封装后是要加上目的MAC的(具体请看TCP/IP协议,封装过程中加的各种报文头),然后根据目的 MAC地址转发的,也就是说你的数据要想从网卡出去,就必须知道对方的MAC地址,同样自己的PC也有个MAC地址,MAC地址和IP地址一样,都是唯一 的标识你身份的东西(IP私网地址例外,但在某个私网中它的地址也是唯一的,如果故意设成多台PC的IP地址一样,那会提示你有IP冲突,当然这时候也会 有新的问题,比如问你:此时是否所有的配成相同IP地址的主机都可以正常收发数据)。
讲了点题外话,但也可以思考下:),接着回来看这个问题,那么怎么知道对方的MAC?答案是ARP广播。首先PC1不知道PC2的MAC地址,那么肯定会 发ARP广播,假设PC1设了网关192.168.3.1。在CMD下用ARP -a命令查看本机ARP表,应该是什么都没有(如果之前PC是清空了ARP表开始做这个实验)。ARP表项格式如下:
Internet Address Physical Address Type
192.168.216.100 00-05-45-30-1f-58 dynamic
不难看出,这个表明确指出了IP地址及与其对应的MAC地址。比如现在是PING 192.168.216.100的话,那么查找ARP表项时就知道了其MAC地址为00-0e-45-30-1f-58。那么接下来就可以通过查看主机路 由表把ICMP报文从哪个接口(这里为PC设置的IP地址所在网卡)转发出了。
在PING时,首先要知道对方MAC,必然会来查找ARP表,如果有对方的MAC地址,就会在封装报文时在目的MAC中加上从ARP表中知道的这个 MAC。如果不知道就会发ARP广播,好,这个实验关键的问题在这里。发ARP广播时,也要知道是从哪个接口(PC上就是网卡了)出去,那么这时必须知道 主机路由表的情况了,主机路由表可以在CMD下用route print命令显示出来,类似于下:
=========================================================================== Active Routes: Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 192.168.3.1 192.168.1.1 30 127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1 192.168.1.0 255.255.255.0 192.168.1.1 192.168.1.1 30 192.168.1.1 255.255.255.255 127.0.0.1 127.0.0.1 30 192.168.1.255 255.255.255.255 192.168.1.1 192.168.1.1 30 224.0.0.0 240.0.0.0 192.168.1.1 192.168.1.1 30 255.255.255.255 255.255.255.255 192.168.1.1 192.168.1.1 1 Default Gateway: 192.168.3.1 =========================================================================== Persistent Routes: None
这是PC1的主机路由表,默认网关为192.168.3.1,路由表中的第一项全0的表示默认路由,即只要PC发出的数据包在路由表中找不到匹配的全部都 从这个默认路由所在接口转发到默认网关。可以看到在这条默认路由的interface中明确指出是192.168.1.1,即192.168.1.1所在 网卡转发到默认网关。那么要转发到默认网关,我就得知道默认网关的MAC地址,所以这时候又去查ARP表,一看没有网关的MAC,所以发ARP广播(从网 卡发出去),结果可想而知,这个网关不存在,肯定得不到网关对应的MAC地址。网关都不存在,那么数据转发给谁也就不知道了,所以所有的数据都在本地终 结,不向外发送。自然ICMP包是不会被发送的。
从上面可以看出,其实数据在发送时,应该是先查找路由表的,为了更好地理解,把ARP放在了前头,其实数据发送一到IP这层就开始看路由表,找出指定 的转发接口。最后到二层成帧后要知道MAC地址,就要去查找ARP表了。这个实验就是先看路由表,因为不同网段所以是从遵循默认路由,转发到默认网关。但 是要转发到网关,也必须知道网关MAC地址,但此实验中网关显然是不存在,那MAC地址也不可能知道,所以ARP广播数据(查找PC2的MAC时发的ARP广播)根本没处转发,此情况下数据在本地终结不对外发送了。也就是说这个ARP广播根本没从你网卡这个门中走出去。
但是有一个ARP广播是出去的,就是查找网关的MAC时这个广播,即192.168.3.1这个IP所对应的MAC。只要你一直在PING,那么这个ARP广播就会一直从网卡中发送出去。
如果有条件可以试一下,两台PC连一台二层交换机,然后用个抓包工具抓取ARP包,我是用Ethereal,非常不错的软件。你可以发现是只有查找网关MAC的ARP广播包(即ARP请求包)从你网卡出去,其它的ARP包都没有从这个网卡进出。
上面这个实验可以把默认网关去掉,再PING时是另一种结果,这个结果提示是目的主机不可达,如下:
C:\Documents and Settings\Administrator>ping 192.168.2.1 -t Pinging 192.168.2.1 with 32 bytes of data: Destination host unreachable. Destination host unreachable.
为什么不是原来的Request timed out,因为这时查找路由表时已经没有默认路由这项了,即路由表中不存在此数据转发的任何符合的条件存在,所以什么都不用干,直接说明要找的目的主机我没 法找,我肯定是到达不了这台主机的,给出了目的主机不可达的提示。而设置了网关就不一样,至少机器知道是有个出口的,即知道东西是可以从我这里出去的,至 少有那么条路存在。假设现在网关存在了,比如换了个三层交换机,配上了实验中的网关地址。这时候ARP广播包肯定是可以出去的。
最后,综合上面所说的,按步骤来说这个ICMP报文下来后,查找路由表,查出是从默认网关出去,那么得先知道网关MAC,所以发查找网关对应MAC的ARP广播,因为得不到这个MAC,所以数据一直就是转发不出。这个问题其实到查找网关MAC这里就已经基本打住了。