arp基本原理解析.doc_第1页
arp基本原理解析.doc_第2页
arp基本原理解析.doc_第3页
arp基本原理解析.doc_第4页
arp基本原理解析.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

TCP/IP基础:ARP 协议严格来说,TCP/IP 协定家族并没有定义 TCP/IP 专属的 网路硬体规格。硬体的范围实在太过广泛了标准非常多当今大部份的低层网路硬体标准都是由 IEEE 制定的,但也有许多标准是厂商专属的。要让 TCP/IP 协定能够顺利与不同类型的硬体进行沟通那么就需要建立起一些标准协定来让大家共同参考。以我们最常用的乙太网(Ethernet)为例我们无需理会厂商如何设计网路界面的驱动程式一旦它能够被系统接纳网路储存层(Datalink)就能使用网路界面在实体网路上传送和接收资料了。 IP 位址和实体位址对应之困扰 在网路基础课程中我们知道乙太网上面使用的传送方式叫 CSMA/CD (Carrier-Sensing Multiple Access with Collision Detection)虽然讯框会在整个网段(segment)中用广播的方式传递而且所有节点都会收到讯框然而只有目的位址符合自己实体位址的讯框才会被接收下来。因此,不管上层协定是哪一种(可以是 TCP/IP 也可以是其它),在底层的传送若是使用 Ethernet 的话,就得使用 MAC (Media Access Control) 实体位址。若要查询到当前系统目前所有界面的实体位址,我们可在 Linux 系统里面输入 ifconfig 命令eth0 Link encap:EthernetHWaddr 00:A0:0C:11:EA:11 inet addr:203.30.35.134 Bcast:203.30.35.159 Mask:255.255.255.224 UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 Interrupt:3 Base address:0x300eth1 Link encap:EthernetHWaddr 00:80:C7:47:8C:9A inet addr:192.168.0.17 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1 RX packets:12303 errors:0 dropped:0 overruns:0 frame:0 TX packets:12694 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 Interrupt:10 Base address:0x2e0从上面的命令结果中可发现:关于每一个界面的第一行资讯最后的部份就是该界面的实体位址。讯框在实体网路上面传送的过程中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 Reply 封包给对方告知发送主机关于自己的实体位址 4. 当发送端接到 ARP Reply 之后也会更新自己的 ARP 表格然后就可以用此纪录进行传送了。 5. 如果发送端没有得到 ARP Reply 则宣告查询失败。 ARP 的查询过程可参考下图 ARP 的查询过程 前面说的 ARP 表格只有在 TCP/IP 协定被载入核心之后才会建立如果 TCP/IP 协定被卸载或关闭机器那么表格就会被清空到下次协定载入或开机的时候再重新建立而同时会向网路发出一个 ARP 广播告诉其它机器它的目前位址是什么以便所有机器都能保持最正确的资料。 然而ARP cache 的大小是有所限制的如果超过了界限那么越长时间没被使用过渡资料就必须清理掉以腾出空间来储存更新的资料。所以当机器收到 ARP equest 封包时如果查询对象不是自己则不会根据发送端位址资料来更新自己的 ARP 表格而是完全忽略该封包。同时每笔存在 cache 中的资料都不是永久保存的每笔资料再更新的时候都会被赋予一个存活倒数计时值如果在倒数时间到达的时候该资料就会被清掉。然而如果该资料在倒数时间到达之前被使用过则计时值会被重新赋予。 当然了ARP 尚有一套机制来处理当 ARP 表格资料不符合实际位址资料的状况(例如在当前连线尚未结束前收到目的端的位址资料更新讯息)或是目的主机太忙碌而未能回答 ARP 请求等状况。 RARP 协定 刚才介绍的 ARP 协定是透过向网路查询而找出实体位址那我们接下来探讨的 RARP 协定则相反它是籍由查询网路上其它主机而得到自己的 IP 位址。 通常我们使用的乙太网卡在出厂的时候就有生产厂家把网卡的实体位址烧在 ROM 里面这个位址是不能改变的(某些型号的网路卡或是透过其它技术手段是允许您修改实体位址的)。不管系统是否起来这个位址都会存在而且要让系统获得它也很容易。然而,在一些无磁碟(diskless)工作站上面系统档案都存放在远端的伺服器当它在启动的时候因为本身没有 IP 位址也就无法和伺服器沟通更不能将系统档案载入。那么我们就必须要有一个办法让这样的无磁碟工作站在和伺服器沟通之前获得自己的 IP 位址。RAPR 协定就是为解决此问题而设计出来的。 和 ARP 协定一样RARP 也是用广播的形式来进行查询只不过这时候问的 IP 位址不是别人而是自己的 IP 位址而已。我们可以从下图看出 RARP 的运作其实和 ARP 是极其相似的 RARP 的查询过程 首先是查询主机向网路送出一个 RARP Request 广播封包向别的主机查询自己的 IP。在时候网路上的 RARP 伺服器就会将发送端的 IP 位址用 RARP Reply 封包回应给查询者。这样查询主机就获得自己的 IP 位址了。 然而不像 ARP查询主机将 RARP Request 封包丢出去之后可能得到的 RARP Reply 会不止一个 (在 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 层级时提到的乙太网路框包格式 ARP / ARAP 封包格式 下面我们就封包中每一栏位做一个简单的说明 HARDWARE TYPE 这是指网路界面卡的种类如果该值为 1则表示为乙太网 ( Ethernet )。 PROTOCOL TYPE 这是指高阶网路协定位址种类如果该值为 0x0800则表示为 IP 位址格式。 HLEN 这是指硬体位址长度(单位为 byte)乙太网的位址长度为 6 。 PLEN 这是指网路协定位址的长度(单位为 byte)IP 协定位址长度为 4。 OPERATION 这是指封包类别一共有四种 1. ARP Request 2. ARP Reply 3. RARP Request 4. RARP Reply SENDER HA 这是指发送端的实体位址如果是乙太网的话将会是一个 6 byte 长度的乙太网位址。 SENDER IP 这是指发送端的 IP 位址会是一个 4 byte 长度的 IP 位址。 TARGET HA 这是指目的端的实体位址如果是乙太网的话将会是一个 6 byte 长度的乙太网位址。 TARGET IP 这是指目的端的 IP 位址会是一个 4 byte 长度的 IP 位址。 ARP 指令 假如您要在 Linux 系统上验证一下前面所学的理论只要您的网路功能已经设好您可以用 arp 命令来检查当前的 ARP 表格内容 # arp -nAddress HWtypeHWaddress Flags MaskIface192.168.20.88 ether 00:10:5A:74:19:A7 C eth1192.168.20.16 ether 00:D0:B7:74:77:74 C eth1192.168.20.140ether 00:D0:B7:74:77:85 C eth1192.168.20.176ether 00:02:B3:0B:5A:60 C eth1192.168.16.254ether 00:D0:B7:85:40:FE C eth1192.168.22.1ether 00:50:8B:92:C3:AB C eth1在 Linux 系统中输入 arp 带一个 -n 的参数是将资料用数字(number)的形式显示否则它将尝试用 DNS 或其他主机对应方式来显示 IP 所对应的主机名称。大家可以很轻易在每一行资料中找到 IP 位址和实体位址的对应同时还有硬体类型等信息。 假如此时您下一个 ping 命令连接一台没有在 ARP 表格中出现的 IP # ping 1211.20.240.113PING 211.20.240.113 (211.20.240.113): 56 data bytes64 bytes from 211.20.240.113: icmp_seq=0 ttl=128 time=0.6 ms64 bytes from 211.20.240.113: icmp_seq=1 ttl=128 time=0.6 ms64 bytes from 211.20.240.113: icmp_seq=2 ttl=128 time=0.6 ms64 bytes from 211.20.240.113: icmp_seq=3 ttl=128 time=0.6 ms此时您再次输入 arp 命令的话您将发现新主机的 ARP 资料 # arp -nAddress HWtypeHWaddress Flags MaskIface192.168.20.88 ether 00:10:5A:74:19:A7 C eth1192.168.20.16 ether 00:D0:B7:74:77:74 C eth1192.168.20.140ether 00:D0:B7:74:77:85 C eth1192.168.20.176ether 00:02:B3:0B:5A:60 C eth1192.168.16.254ether 00:D0:B7:85:40:FE C eth1192.168.22.1ether 00:50:8B:92:C3:AB C eth1211.20.240.113ether 00:60:6C:08:2A:24 C eth0如果您把这台主机从网路上断开确定它不会再发送 ARP 请求或作出 ARP 回应那么过大约 20 分钟后再输入 arp 命令您很可能发现许多 ARP 记录都已经消失了这就是资料存活倒数计时的后果。 假如您的 Linux 系统还装有封包撷取软体如 tcpdump 您可以在此期间抓些封包看看细心点就能看出 ARP Request 和 ARP Reply 的过程 09:17:33.803030 0:0:e8:68:98:b3 ff:ff:ff:ff:ff:ff 0806 42: arp who-has 211.20.240.113 tell 211.20.240.11709:17:33.803777 0:60:6c:8:2a:24 0:0:e8:68:98:b3 0806 60: arp reply 211.20.240.113 is-at 0:60:6c:8:2a:24您如果还有兴趣的话还可以找些更强劲的封包撷取工具(如snifit)把 ARP 封包的所有细节都抓出来看看。不过这

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论