我用的是VMware v7.1.2 build-301548
主机win7通过wifi上网,vmware装了Linux系统,Vmware网络接入模式是:Bridge,主机能ping通虚拟机,但虚拟机无法ping通主机。
但如果主机先ping下虚拟机,虚拟机就能ping通主机了,但过一会又不行。解决方案有3个:
1、起初在网上搜索,有网友说是无线的问题,我换成有线上网,果然解决这个问题了。
2、这是VM7的问题,重新安装VM v8.0.1 build-528992就不会出现这个问题了。真郁闷,原来是VM7的bug
3、另一种解决方法。
近来在看《计算机网络》,终于知道了这个问题发生的原因:虚拟机在尝试将主机的ip地址转换成MAC地址时出错了,故ARP缓存映射表里没有对的主机的MAC地址,解决方法:对主机绑定静态的MAC地址。
[root@localhost test1]# ping 192.168.1.102
PING 192.168.1.102 (192.168.1.102) 56(84) bytes of data.
From 192.168.1.104 icmp_seq=2 Destination Host Unreachable
From 192.168.1.104 icmp_seq=3 Destination Host Unreachable
From 192.168.1.104 icmp_seq=4 Destination Host Unreachable
^C
##查看arp缓存表
[root@localhost test1]# arp -a
? (192.168.1.102) at <incomplete> on eth0
可以看到,查看arp缓存表,出现了“incomplete”,发生这种情况一般是因为linux系统尝试请求将主机
的ip地址192.168.1.102转换成物理地址时出错了。
然后,我在主机里面ping虚拟机
C:\Users\Administrator>ping 192.168.1.104
正在 Ping 192.168.1.104 具有 32 字节的数据:
来自 192.168.1.104 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.104 的回复: 字节=32 时间<1ms TTL=64
再回到虚拟机里面
[root@localhost test1]# arp -a
? (192.168.1.102) at 48:5d:60:e4:86:ae [ether] on eth0
? (192.168.1.1) at d8:5d:4c:1e:bb:a0 [ether] on eth0
#这时可以看到,虚拟机的arp缓存表里面有主机的MAC地址了,故这时能ping通主机了,但过了一会,ARP
缓存映射表项失效了,故这时再ping主机就ping不通了。
[root@localhost test1]# arp -a
? (192.168.1.102) at <incomplete> on eth0
? (192.168.1.1) at d8:5d:4c:1e:bb:a0 [ether] on eth0
解决方法:先在主机里面查看主机的MAC地址
C:\Users\Administrator>ipconfig /all
Adapter
物理地址. . . . . . . . . . . . . : 48-5D-60-E4-86-AE
也可以直接在主机里ping虚拟机,然后去虚拟里查看arp缓存表
[root@localhost test1]# arp -a
? (192.168.1.102) at 48:5d:60:e4:86:ae [ether] on eth0
#得到主机的MAC地址
#然后在虚拟机里面手动在ARP表中指定IP地址与MAC地址的对应,类型为static(静态)。静态ARP缓存除
非手动清除,否则不会丢失。
[root@localhost test1]# arp -s 192.168.1.102 48:5d:60:e4:86:ae
[root@localhost test1]# arp -a
? (192.168.1.102) at 48:5d:60:e4:86:ae [ether] PERM on eth0
? (192.168.1.1) at d8:5d:4c:1e:bb:a0 [ether] on eth0
#这时候就能ping通主机了
[root@localhost test1]# ping 192.168.1.102
PING 192.168.1.102 (192.168.1.102) 56(84) bytes of data.
64 bytes from 192.168.1.102: icmp_req=1 ttl=64 time=0.377 ms
64 bytes from 192.168.1.102: icmp_req=2 ttl=64 time=0.307 ms
#无论是静态还是动态ARP缓存,重启启动计算机后都会丢失,故可以在Linux的/etc/rc.local 文件里加
入这条命令,以后开机都会绑定主机IP地址跟它的MAC地址。
@@@@@@@@@@@
参考资料:Guest can't ping host
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ARP(Address Resolution Protocol),即地址解析协议,实现通过IP地址得知其物理地址。在TCP/IP网
络环境下,每个主机都分配了一个32位的IP地址,这种互联网地址是在网际范围标识主机的一种逻辑地
址。为了让报文在物理网路上传送,必须知道对方目的主机的物理地址。这样就存在把IP地址变换成物
理地址的地址转换问题。以以太网环境为例,为了正确地向目的主机传送报文,必须把目的主机的32位
IP地址转换成为48位以太网的地址。这就需要在互连层有一组服务将IP地址转换为相应物理地址,这组
协议就是ARP协议。
在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的
MAC地址。而在TCP/IP协议栈中,网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP
协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。于是需要
一种方法,根据目的主机的IP地址,获得其MAC地址。这就是ARP协议要做的事情。所谓地址解析
(address resolution)就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
另外,当发送主机和目的主机不在同一个局域网中时,即便知道目的主机的MAC地址,两者也不能直
接通信,必须经过路由转发才可以。所以此时,发送主机通过ARP协议获得的将不是目的主机的真实MAC
地址,而是一台可以通往局域网外的路由器的某个端口的MAC地址。于是此后发送主机发往目的主机的所
有帧,都将发往该路由器,通过它向外发送。这种情况称为ARP代理(ARP Proxy)。