ARP  协议

    众所周知,当我们在浏览器里输入某个站点的域名(网址)回车后,我们就能够进入相应的网站,其实当网站的首页加载到我们的电脑上之前,DNS服务器将域名转换成了IP地址,我们找到我们要访问的站点,真正靠得是转换之后的这个IP地址。

    而在局域网里面,任意两个节点之间通信,必须知道对方的MAC地址,才能给对方发送帧,但如果在发送之前,不知道对方的MAC地址,那该怎么办呢,这就是我们要讨论的ARP协议。这个时候,其实它是通过ARP(地址解析)协议来将IP地址翻译成MAC地址的。下面我们围绕下图来说明。

ARP协议_图解 

我将ARP的应用分为两种情况来讨论:同一个网段、不同的网段。

(一)同一个网段

     这种情况比较简单,图中A和B属于同一个网段,假设此时A要给B发送四个ICMP数据包。
(1)在SW上查看一下MAC表,结果如下:
          Mac Address Table
-------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       --------    -----

这表明A在封装发给B的数据帧时候,还不知道B的MAC地址,所以这个时候A就要发送ARP包,进行地址解析。
(2)ARP解析包,如下图
 

ARP协议_ARP协议_02 
由此图可以看出,ARP解析包,在数据链路层封装成帧的时候,目的地址采用FFFF.FFFF.FFFF的广播地址,所以此包,在此网段上的所有节点都能够接受到,但只有目的IP地址是192.168.1.3的主机(B主机)回应。

(3)回应包格式
 

ARP协议_职场_03 
由上图可以看出,在回应包里面SRC MAC:0002.1742.1171,就是B主机的MAC地址,这个包得目的地址是192.168.1.2(A主机)所以当这个包到达A主机的时候,A主机就知道了B主机的MAC地址,那么第一个ICMP包的格式是:
 

ARP协议_休闲_04 
可见,A主机在数据链路层封装帧的时候,DEST MAC 已经就是刚才ARP解析获得的B的MAC地址了,这时候A和B之间就能够顺利的通信了。
(4)此时你在查一下SW的MAC表,如下:
    Mac Address Table
-------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       --------    -----

   1    0002.1742.1171    DYNAMIC     Fa0/3
   1    00e0.f7dc.9d01    DYNAMIC     Fa0/1
   1    00e0.f9dc.342b    DYNAMIC     Fa0/2

(二)不同的网段
假设A和C要通信,因为通信之前A不知道C的MAC地址,所以要进行ARP解析,但不同网段的解析要比同一个网段的解析复杂。此解析可以分为两个阶段.
   第一个阶段:
 

ARP协议_职场_05 
由上图可知,此阶段ARP的主要任务是获知源节点所在网段的网关所对应的MAC地址,而在上图中网管就是router的F0/0。所以当F0/0收到此ARP广播包的时候,会有一个回应包,如下图:
 

ARP协议_ARP协议_06 
由上图可知,网关给A主机的包中SRC MAC:00E0.F7DC.9D01这就是网关F0/0端口的MAC地址,那么这个时候,A将会放松一个ICMP包给此网关,此包的格式如下图:
 

ARP协议_休闲_07 
当这个包到达路由器的时候,它会从F0/1端口进行转发,但转发前它要进行第二个阶段的ARP解析,因为最终根A通信的是C主机,而此时C主机的MAC地址还不知道。

第二个阶段:
 

ARP协议_职场_08 
由图可知,此时SRC MAC:00E0.F7DC.9D02(f0/1的MAC地址),而目的地址是广播地址,所以此广播ARP包,C主机肯定能够收到,收到后它将会有一个回应包,此包如下:
 

ARP协议_职场_09

由图可知,SRC MAC:00E0.A3CE.C268,就使我们所需要的C主机的MAC地址,这个时候,第二个阶段的解析完成。

最后,A就利用C的MAC地址封装城帧,发数据包给C。如下图:
 

ARP协议_ARP协议_10
当四个包发完以后(因为ping命令默认的就是发送四个数据包),主机A上显示的结果是。
Request timed out.
Reply from 192.168.2.2: bytes=32 time=6ms TTL=127
Reply from 192.168.2.2: bytes=32 time=94ms TTL=127
Reply from 192.168.2.2: bytes=32 time=94ms TTL=127
第一个包,超时了。可以这么说,只要是跨网段的,那么第一个包肯定超时,这个就需要大家一起来思考为什么了。