问题:两台不同网段的 PC 连到一台 cisco2950 (无三层设备) , 为什么不同网段的 PC 无法进行通信? PC 不是要广播吗他们连到同一台交换机,另一台 PC 应该收到了 ARP 广播啊? <?xml:namespace prefix = o />

 

掌握 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<?xml:namespace prefix = st1 />-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 这里就已经基本打住了。