代码改变世界

ARP

2019-03-07 14:15  未曾走远  阅读(1176)  评论(0编辑  收藏  举报

ARP是通过一个查找表(ARP缓存)来执行这种转换的。当在ARP缓存中没有找到地址时,则向网络发送一个广播请求,网络上所有的主机和路由器都接收和处理这个ARP请求,但是只有相同IP地址的接收到广播请求的主机或路由器,发回一个ARP应答分组,应答中包含它的IP地址和物理地址,并保存在请求主机的ARP缓存中。其他主机或路由器都丢弃此分组。

 

 

 

 以太网帧格式如上图下面的表格,6个字节的目的地址(目的主机的MAC地址),6个字节的源地址(本机的MAC地址)

 帧类型字段为2个字节,802.3中表示数据长度,ETHERNET II中表示帧类型。比如0x0800表示后面的报文是IP协议报文,0x0806表示后面的报文是ARP协议报文。通常小于0x0800表示数据长度。

在以太网(ARP协议只适用于局域网)中,如果本地主机想要向某一个IP地址的主机(路由表中的下一跳路由器或者直连的主机,注意此处IP地址不一定是IP数据报中的目的IP)发包,但是并不知道其硬件地址,此时利用ARP协议提供的机制来获取硬件地址。

过程如下:

1) 本地主机在局域网中广播ARP请求,ARP请求数据帧中包含目的主机的IP地址。意思是“如果你是这个IP地址的拥有者,请回答你的硬件地址”。

2) 目的主机的ARP层解析这份广播报文,识别出是询问其硬件地址。于是发送ARP应答包,里面包含IP地址及其对应的硬件地址。

3) 本地主机收到ARP应答后,知道了目的地址的硬件地址,之后的数据报就可以传送了。

PC1发送的请求广播包同时被其他主机收到,然后PC3和PC4收到之后(发现不是问自己)则丢弃。而PC2收到之后,根据请求包里面的信息(有自己的IP地址),判断是给自己的,所以不会做丢弃动作,而是返回ARP回应包。

 大部分网络协议在设计的时候,都需要保持极度克制,不需要的交互就砍掉,能合并的信息就合并,能不用广播就用单播,以此让带宽变得更多让网络变得更快。

 

 


硬件类型:2个字节,定义网络类型,以太网是类型1,取值0x0001。也就是说ARP协议不仅仅应用于以太网协议,还可以支持别的链路层协议。

协议类型:2个字节,定义协议类型,对应IPv4协议,值为0x0800。即0x0800表示IP协议。

硬件地址长度:1个字节,定义以字节为单位的物理(硬件)地址长度,如果是以太网,则为6个字节(MAC地址长度)。

协议地址长度:1个字节,定义以字节为单位的逻辑(协议)地址长度,如果是IP协议,则是4个字节(IP地址长度)。

操作类型:2个字节,定义分组的类型,有4中操作类型。

        ARP请求  :0x0001

        ARP应答  :0x0002

        RARP请求:0x0003

        RARP应答:0x0004

发送端以太网地址(硬件地址):如果是以太网,则是源主机以太网地址(MAC地址),此处和以太网头中的源地址对应。

发送端IP地址:如果是IP协议,则表示源主机的IP地址。

目的以太网地址:如果是以太网,则是目的以太网地址(MAC地址),和以太网头中的目的地址对应。

目的IP地址:如果是IP协议,则表示源主机要请求硬件地址的IP地址。

对应ARP请求包来说,目的端的硬件地址字段无须填充(需用全0替代),其他字段都需要填充。对于ARP回复包来说,所有字段都需要填充。

 

APR请求包是广播的,但是ARP应答帧是单播的。

 


对于一个ARP请求来说,除目的地址外的所有其他字段都有填充值,当系统收到一份目的为本机的ARP请求报文后,它就把硬件地址填进去,然后用两个发送端地址分别替换两个目的地址,并把操作字段改为2,最后把它发送回去。

根据以太网协议规定,以太网数据报最小长度是64字节(14字节的以太网头,包含4字节的FCS),而ARP报文数据长度为28字节,这样总长度为46字节,需要在以太网帧结构中的PAD字段填充18个字节,达到以太网数据报最小长度64字节,可填充0。

 

需要注意的问题:
  ARP 是解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。如果所要找的主机和源主机不在同一个局域网上,那么就要通过ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络,剩下的工作就由下一个网络来做。

  从 IP 地址到硬件地址的解析是自动进行的,使用主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上的另一个已知 IP 地址的主机或路由器进行通信,ARP协议就会自动地将该IP地址解析为链路层所需要的硬件地址,默认情况下ARP缓存的过期时间是两分钟。
 ARP缓存表

windows下可以使用arp -a命令查看arp缓存表中的信息:
  arp –d清除本机arp缓存表
  arp –a查看本机当前arp表
  arp –s绑定arp地址(注意:本次机器生效,下次重启后会全部失效)

  在每台安装有TCP/IP协议的电脑或路由器里都有一个ARP缓存表,表里的IP地址与MAC地址是一对应的,如图所示:

 



其实对于ARP协议来说,还有其他类型的ARP协议,比如:代理ARP协议。

一般来说,网络设备,包括电脑都会有arp缓存,arp缓存用来存放ip地址和mac地址的信息。在发送数据前,会先查找arp缓存表,如果缓存表中有对方的mac地址,则直接采用该mac封装数据帧,然后转发,如果不存在,则通过arp请求报文询问学习,然后将学习到的ip地址和mac地址的映射关系存放到arp缓存表中。