关于虚拟机的通信原理解析

前段时间,与一哥儿们讨论这个问题的时候,让人挺纠结的。自己抽空分析了一下,下面是学习笔记:

本机环境:  Windows XP SP3 (IP:192.168.1.100 后续用真实机代替本环境)

虚拟环境:  VPC2007 (Windows Server 2003   IP:192.168.1.200 后续用虚拟机代替本环境)

抓包软件:  OmniPeek V5.4

原文地址:  http://www.cctry.com/thread-11536-1-1.html

(注意:虚拟机与本机要在同一个网段,不然会ping不通,另外在端要先运行 arp -d  命令清空ARP缓存.... ^_^)

     记得我以前在 无忧网客联盟论坛 里面 学习CCNA/NP时,看过一些关于以太网的基础知识。毕竟 在以太网中传输数据必须要靠唯一的MAC地址来识别最终的目标计算机 。简单的来讲,在LAN 中,如果一台计算机要与另一台计算机通讯传送数据包,那么必须先要检查自身ARP缓存中该IP地址的MAC地址,如果MAC不存在,就会在广播网里面发送一个ARP请求,再根据ARP数据包找到该计算机的MAC地址,待MAC地址匹配确认,才开始最终的传输。

     (当初就怎么没想过LAN数据包是如何到达虚拟机的? 囧......)

1、设置OmniPeek:

这里选择IP协议:


2、清空本机ARP缓存:

再打开cmd( 从本机ping虚拟机 ) ,待清空后点击start开始捕获,如下图:


3、分析数据包

     既然能ping通,当然首先是捕获一下本机的ICMP协议数据包,看看有没有产生真正的数据包。于是用OmniPeek抓包分析一下,果然产生了“真实”的ARP、ICMP共计4条数据包:


     (这里“真实”一词之所以打个引号,是因为......留个疑问,后面再做解释吧!)

     先打开ARP请求的数据包,因为之前运行了 arp -d 命令清空了ARP缓存表,所以才会产生出ARP请求的数据包:


     再看看ARP回显的数据包,此时目标地址与源地址都已经得到:


     再看ping程序产生的ICMP数据包,先是请求(这里ICMP Type 表示请求或回显的标志):


     再看ping程序回显时数据包:


     这些数据包,总体看来似无任何“异常”,从ARP到ICMP一路都顺畅与规矩,仍然发现不了什么问题。

     带着疑问始终不解,于是请教了网络群里面老兵,他告诉我VPC/VM虚拟机里面一般会有一个独立的服务或驱动在模拟一块虚拟网卡。于是在 微软官方某大牛的博客 中找到了这样答案,大致意思是这样的:

1、采用NDIS过滤驱动,基于VPC或是Virtual Server的虚拟网卡都是模拟了一个虚拟适配器设备,该虚拟网卡的MAC地址都是以00-03-FF开头;

2、每个一个虚拟机都会创建一个默认的虚拟网络适配器(最多只能虚拟创建四个);

3、在安装完VPC之后,会在系统中多个服务或驱动:Virtual Machine Network Services,这个服务很强大,它负责数据在虚拟网卡和物理网卡中传递。


     依靠Virtual Machine Network Services,物理网卡会处于一种XXO的状态,它不光会接收投递到其真实MAC地址的数据,同时还会接收投递到虚拟网卡MAC地址的数据,经过此一步数据汇总,然后再依据各个MAC地址,数据投递到相应MAC的网卡之上,不管数据是投递到虚拟机还是真实本机,反之亦然。

     于是用巨盾的进程工具,果然找到了这样一个驱动:


     于是终于搞清楚了,为什么能ping通虚拟机了,有点小小的“鸡动”了!!!

     关于VM的话,相信也是类似的“原理”吧, 它带有特殊的进程、特殊的服务或许特殊的驱动,做些“特殊”的事 ....有兴趣的朋友不妨你自己试试!

     (由于鄙人的老本本硬盘空间很“宝贵”,我就不试了。自己一直没用VM,即便“能省就省”吧.....)

你可能感兴趣的:(关于虚拟机的通信原理解析)