ARP协议

原文来自:http://www.study-area.org/network/networkfr2.htm


         严格来说,TCP/IP协议家族并没有定义“TCP/IP”专属的网络硬件规格。硬件的范围实在是太广泛了,标准非常多,当今大部分的底层网络硬件标准都是由IEEE制定的,但也有许多标准是厂商专属的。要让TCP/IP协议能够顺利与不同类型的硬件进行沟通,那么就需要建立起一些标准协议来让大家共同参考。以我们最常用的以太网(Ethernet)为例,我们不需要理会厂商如何设计网络界面(网络?)的驱动程序,一旦它能被系统接纳,数据链路层(DataLink)就能使用网络界面在实体网络上(物理层)传送和接受资料了。


IP位址和物理位置对应的困扰

我们知道以太网上面使用的传送方式叫CAMA/CD(Carrier-Sensing Multipe Access with Collision Detection): 虽然讯框(这个是什么?是封包么?)会在整个网络(Segement)中用广播的方式传递,而且所有节点都会收到讯框,然后,只有目的地址符合自己物理地址的讯框才会被接受下来。因此,不管上层协定是哪一种(可以是TCP/IP也可以是其他),在底层的传送若是使用Ethernet的话,就得使用MAC(Media Access Control)物理地址。若要查询到当前系统目前所有界面的物理地址,我们可以在linux系统中输入ifconfig命令得到




在win系统中的cmd中输入ipconfig/all


        从上面的命令结果中可以发现:关于每一个界面的第一行资讯,最后的部分就是该界面的物理地址。讯框在实体网络上面传送的过程中,IP地址(或称逻辑地址)一点都派不上用场。但问题是:当我们使用TCP/IP的时候,上层的协议(传输层、会话层、表现层、应用层)都是以IP地址为传送依据的。那么,这时我们就必须有一套方法来对应IP地址和物理地址了。

在此过程中,关键点是如果将IP地址与物理地址做对应。有些使用简单物理地址的网络(如proNET-10),其物理地址只占一个byte的长度,而且允许使用者在配置网络卡的是选择自己的物理地址。在这样的网络上进行IP地址和物理地址的对应,是比较简单的,我们可以把物理地址设为和IP地址一样。例如,将设某一个节点的IP地址为192.168.1.17,那么我们就可以将该物理地址设为17。这样,在proNET就可以轻易的根据IP地址来得到物理地址。这样的对应很简单,而且维护起来也很容易,在新机器加入网络的时候,并不需要修改或重编已存的资料。

然而,我们知道在以太网上,每一个物理界面都有一个48bit(6byte)的MAC地址,而IP(v4)使用的地址则为32bit(4byte);每个地址格式都只提供相应的层级协议使用,彼此是不能互换使用的。这时我们就无法用简单的数学关系来做IP地址和物理地址的对应了。


IP地址和物理地址的对应方法

建立表格:

首先,我们想到的最简单的方法是在每一台机器上建立一个IP地址和物理地址的对应表格(table)。不过这个方法还是没办法解决如下的情形:

    • 网络上的节点数量多如黄河之沙(原文作者语文水平不错),要想将全部节点的对应关系列入表格之中几乎是不可能的任务。
    • 如果某一个阶段产生异动情形(如更换网卡),那么如果让所有的表格正确做出相应修改,也是个头痛的问题。
    • 对某个无磁碟(硬盘么?)工作站来说,因为没有本机的存储设备,将无法建立表格。
写入高阶程序:
除了建立表格,我们还可以将实际的网络地址写死在高阶网络程序里面。不过,如前一个方法一样,如果遇到硬件地址变化等异动情形,那么,程序也需要重新编译过才可以,显然,上述的两个方法都不靠谱。

ARP协定:
这里我们要介绍的是Address Resolution Protocol(ARP)。ARP是TCP/IP设计者利用以太网的广播性质,设计出来的地址解释协议。它的主要特性和优点是它的地址对应关系是动态的,它以查询的方式来获得IP地址和物理地址的对应。它的工作原理非常简单:
1. 首先,每一台主机都会在ARP快速缓冲区(ARP Cache)中建立一个ARP表格,用来记录IP地址和物理地址的对应关系。这个Table的每一笔资料会根据自身的存货时间结束而最终消失,以确保资料的真实性。
2. 当发送主机有一个封包要传送给目的主机的时候,并且获得目的主机IP地址;那首先主机会先检查自己的ARP表格中有没有该IP地址的物理地址对应。如果有,就直接使用此地址来传送封包;如果没有,则向网络发出一个ARP Request广播封包,查询目的主机的物理地址。这个封包会包含发送端的IP地址和物理地址资料。
3. 这时,网络上所有的主机都会受到这个广播封包,会检查封包的IP地址是否和自己的IP地址一致。如果不是则忽略;如果是则会先将发送端的物理地址和IP资料更新到自己的ARP表格去,如果已经有该IP的对应,则用新资料覆盖原来的;然后再回应一个ARP Replay封包给对方,告知发送主机关于自己的物理地址。
4. 当发送端接到ARP Replay之后,也会更新自己的ARP表格;然后就可以用此记录进行传送了。
5. 如果发送端没有得到ARP Replay,则宣告查询失败。

ARP的查询过程可参考下图:


ARP查询过程

前面说的ARP表格,只有在TCP/IP协定被载入核心最后才会建立,如果TCP/IP协议被卸载或者关闭机器,那么该表格就会被清空;到下次协议载入或开机的时候再重新建立,而同时会向网络发出一个ARP广告,告诉其他机器它母线地址是什么,以便所有机器能保持最正确的资料。
然后ARP Cache的大小是有所限制的,如果超越了界限,那么越长时间没有被使用过资料就必须被清理掉,以腾出空间来存储更新的资料。所以,当机器收到ARP Request封包的时候,如果查询对象不是自己,则不会根据发送端地址资料来更新自己的ARP表格,而是完全忽略该封包。同时,每条存在Cache中的资料,都不是永久保存的;每笔资料再更新的时候,都会被赋予一个存活倒计时值,如果在倒数时间到达的时候,该条记录就会被清理掉。然而,如果该资料在倒数时间之前被使用过,则计时值会被重新赋予。
当然了,ARP尚有一套机制来处理当ARP表格资料不符合实际地址资料的情况(例如,在当前连线尚未结束前,收到目的端的地址资料更新讯息);或是目的主机太忙碌而不能回答ARP请求等状况。


RARP协议:

刚才介绍的ARP协议是透过向网络查询而找出物理地址,那我们接下来探讨的RARP协议则相反:它是由查询网络上其他主机而到底自己的IP地址。
通常,我们使用的以太网卡,在出厂的时候就有生产厂家把网卡的物理地址烧在ROM里面,这个地址是不能改变的(某些型号的网络卡,或者通过其他技术手段,是可以允许您修改物理地址的)。不管系统是否起来,这个地址都会存在,而且要让系统获得它也很容易。然而,在一些没有硬盘的工作站上面,系统档案都存放在远端服务器,当它在启动的时候,因为本身的没有IP地址,也就无法和服务器沟通,能不能将系统档案载入。那么,我们就必须要有一个办法,让这样的无硬盘工作站在和服务器沟通之前获得自己的IP地址。RARP协议就是解决此问题而设计出来的。
和ARP协议一样,RARP也是用广播的形式来进行查询,只不过这时候问的IP地址不是别人,而是自己的IP地址而已。我们可以从下图看出RARP的运作,其实和ARP是及其相似的:

首先是查询主机向网络送出一个RARP Request封包,向别的主机查询自己的IP。这时候,网络上的RARP服务器就会将发送端的IP地址用RARP Replay封包回应给查询者。这样查询主机就获得自己的IP位址了。
然后不像ARP,查询主机将RARP Request封包丢出去之后,可能得到的RARP Replay会不止一个(在ARP查询中,我们可以确定只会获得一个回应而已)。因为网络上可能存在不止一台RARP服务器(基于备份和分担考量,极有可能如此设计),那么,所有收到RARP请求的服务器都会尝试向查询主机做出RARP Reply回应。如果这样的话,网络上将充斥着中RARP回应,成为额外的负荷。这时候,我们有两种方法来解决RARP的回应问题。
第一种方法:为每一个能RARP请求的主机分配一主服务器,正常来说,只有服务器才会做出RARP回应,其他主机知识记录下接受到RARP请求的时间而已。假如主服务器不能顺利做出回应,那么查询主机在等待逾期后再次用广播方式发送RARP请求,其他非主服务器加入在接到第一个请求后很短时间内再收到相同的请求的话,才会做回应动作。
第二种方法也很类似:正常来说,主服务器当受到RARP请求之后,会直接做出回应;为避免所有非主服务器同时传回RARP回应,每台非主服务器都会随机等待一段时间再作出回应。如果主服务器未能作出回应的话,查询主机会延迟一段时间才会进行第二次请求,以确保这段时间内获得非主服务器的回应。当然,设计者可以精心的设计延迟时间至一个合理的间隔。

PROXY ARP

代理(Proxy)ARP通常用来在路由器上代为回答在它后面的某个网络主机的ARP请求。这是一种欺骗手法,因为查询端会以为目标主机就是路由器本身,但事实上,机器是在另一个网络里面。
Proxy ARP常使用于远端链接网络(如接发)环境中。例如在本地网络中有一台接发主机,提供其他主机接法上来连接本地网。当本地主机要查询远端接发主机的ARP请求的时候,因为它的广播封包是无法到达远端的;此时接发服务器就可以代替远端主机回答这个ARP请求,然后本地主机就将封包送给接发服务器,服务器再将封包传给远端主机。
Proxy ARP还有另一个功能:就是将路由器所连接的两端物理网络相互隐藏起来。这样,两边的网络就能够使用同一个网络识别码,只要中间的路由器被配置Proxy ARP,便能替任何一端网络回应另一端网络的ARP请求。这样的配置,除了能够解决现代主机与古老的机器之间的沟通(前者使用全部0代表主机,而后者则使用全部1代表主机;这个我们在后面的章节中再说明这个概念)。
Proxy ARP另一个很有用的场合,是解决IP不足下的子网络切割情况。例如现在台湾的商业性ADSL网络智能分配到5个可用IP,如果要在这么小的范围下做子网的切割,那么,除路由器所占用的两个IP之外,剩下的就只有一个IP可以使用。这是毫无意义的,但使用Proxy ARP之后,我们可以使用的IP将不会被浪费掉。

ARP和RARP之封包格式

让我们重温下OSI层级中的以太网络封包格式(数据链路层封包):

以太网络的封包格式
我们可以发现标准的以太网封包其中有一段46到1500byte长度的数据空间,假如这是一个ARP封包的话,那么该端数据空间就用来包装整个ARP。ARP和RARP的封包格式是一模一样的:


ARP/RARP封包格式
下面我们就封包中的每一栏位做一个简单的说明:
HARDWARE TYPE
这是指网络界面卡的种类,如果该值为1,则表示为以太网(Enthernet)。
PROTOCOL TYPE
这是指高阶网络类型定位址类型,如果该值为0x0800,则表示为IP地址格式。
HLEN
这是指硬件地址长度(单位为byte),以太网的地址长度为6byte。
PLEN
这是指网络协议地址的长度(单位为byte),IP协议地址长度为4.
OPERATION
这是指封包类别,一共四种:
1. ARP Request
2. ARP Replay
3. RARP Request
4. RARP Replay
SENDER HA 
这是指发送端的硬件地址,如果是以太网的话,将会是一个6byte长度的以太网地址。
SENDER IP
这是指发送端的IP地址,会是一个4byte长度的IP地址。(IPv4)
TRAGET HA
这是指目的端的实体地址,如果是以太网的话,将会是一个6byte长度的以太网地址。
TRAGET IP
这是指发送端的IP地址,会是一个4byte长度的IP地址。(IPv4)
ARP指令:
假如您要在linux系统上验证一下前面所学的理论,只要您的网络功能已经设定好,您可以用arp命令来检查当前的ARP表格内容。

linux系统中,输入arp带一个-n的参数,是将ARP表中的资料用数字(number)的形式显示,否则它将尝试用DNS(域名)或其他主机对应方式来显示IP所对应的主机名称。大家可以很轻易的在每一行资料中找到IP和物理地址的对应,同时还有硬件类型等信息。
假如此时您下一个命令,连接一台没有在ARP表格中出现的IP:

如果您把这台主机从网络上断开,确定它不会再发送ARP请求或者做出ARP回应,那么大约20分钟后再输入arp命令,您可能发现与多ARP记录都已经消失,这就是资料存活倒计时的后果。
假如您的linux系统还装有封包拾取软件,如tcpdump,您可以在此期间抓些封包看看,细心点就能看出ARP Request 和 ARP Replay的过程:

如果还有兴趣的话,还可以找些更强劲的拾取工具(如:snifit),把ARP封包的所有细节都抓出来看看。不过这里暂时不要做这样的动作来,至于如何检查封包的每一个细节,我们将在后面介绍IP和TCP封包的时候再介绍。
我们用arp不仅能查看当前的ARP记录,而且我们还可以用arp命令来建立ARP记录,例如我们前面提到过的Proxy ARP功能,我们可以用中间的路由器来“隐藏”两端的网络:


上面arp命令中的-s参数就是用来设定(set)一个ARP记录的。接着在输入ARP命令,就会发现刚设定的资料标记为MP。这样,当另一个网络要查询211.20.240.115的时候,这个linux路由器就能够代为回应了。

ARP之RFC文件
ARP的详细资料可以查询RFC-826、RFC-814、以及RFC-1166等文件。而RARP的资料可以参考RFC-903、RFC-906、还有RFC-1293等文件。

习题:
1.请在linux系统上找出网络的物理地址
2.分别解释ARP、RARP、Proxy ARP的功能与实现过程。
3.请描述ARP/RARP的封包格式的各栏位说明。
4.用linux系统检查一下ARP表格内容,并查实连接新主机以观测表格资料的变化。
5.有条件的话,用封包拾取软体来拾取ARP封包来观测一下他们是如何工作的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值