组织:中国互动出版网(http://www.china-pub.com/)RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm)E-mail:[email protected]译者:沈进 (simon_shen    [email protected]) 译文发布时间:2001-9-6版权:本中文翻译文档版权归中国互动出版网所有。可以用于非商业用途自由转载,但必须保留本文档的翻译及版权信息。Network Working Group                                   David C. Plummer Request For Comments:  826                                  (DCP@MIT-MC)                                                           November 1982以太网地址转换协议或转换网络协议地址为48比特以太网地址用于在以太网硬件上传输(RFC826——An Ethernet Address Resolution Protocol or Converting Network Protocol Addresses to 48.bit Ethernet Address for Transmission on Ethernet Hardware)目录1.摘要 12.说明 33.问题 54.动机 55.定义 56.包格式 67.发包 68.收包 79.为什么这么做 710.网络监控和排错 811.一个例子 912.相关情况 91.摘要 通过路由机制,协议P在发送主机S上的实现决定了S需要传输到目标主机T,而T连在和S相连的10兆以太网电缆上。实际传输以太网包必须产生一个48比特以太网地址。主机的协议P地址并不总是和相应的以太网地址兼容(长度或值不同)。现在这个协议允许动态地发布信息,这些信息可用来构造转换协议P地址空间内的地址A为48比特以太网地址的一张表。 允许在非10兆以太网硬件使用的协议已经被综合总结,无线电网络就是这种硬件。 [这篇RFC的目的是提出一种转换协议地址(例如IP地址)为本地网络地址(例如以太网地址)的方法。这个问题现在受到ARPA Internet社区的普遍关注,这里提出的方法仅供读者参考,并不是Internet标准的描述。]2.说明 这个协议起初是为DEC/Intel/Xerox的10兆以太网设计的,现在已允许用在其它类型的网络上。许多讨论将直接针对10兆以太网。总之,合适的话将遵循以太网的特定讨论。 DOD Internet协议将作为Internet的规范被参考。 这里用到的数字,在以太网标准中是高位字节在前的,这和例如PDP-11,VAX等机器的字节编址相反,因此对下面描述的操作字段(ar$op)必须特别小心。 需要处理硬件名字空间已达成一致。直到官方认可,请求可发送到 David C. Plummer Symbolics, Inc. 243 Vassar Street Cambridge, Massachusetts  02139 或发邮件到DCP@MIT-MC。3.问题 世界总的来说是杂乱的,同时网络增加了这种杂乱。几乎在网络架构的每一层,都有几个潜在的协议可以使用。例如在高一点的层次有用于远程登录的TELNET和SUPDUP。低一点的有CHAOS,DOD TCP,Xerox,BSP或DECnet等可靠字节流协议。甚至在与硬件较接近的逻辑传输层也有CHAOS,DOD Internet,Xerox PUP,DECnet等协议。10兆以太网通过使用以太网包头中的类型字段来使这些协议(而且更多)能在一根电缆上共存。然而,10兆以太网在物理电缆上需要48比特地址,而大多数协议地址不是48比特,它们并不需要与硬件的48比特以太网地址有什么关系。例如CHAOS的地址是16比特,DOD Internet的地址是32比特,Xerox PUP的地址是8比特。这就需要一个协议来动态地区分一个<协议,地址>对和一个48比特以太网地址的对应关系。4.动机 随着更多的制造商提供遵循DEC,Intel和Xerox发布的规范的接口产品,10兆以太网的使用也在增加。随着使用的增加,为这个接口开发的软件也越来越多。有两个选择:(1)每个实现者用自己的方法做某种形式的地址转换;(2)每个实现者使用统一标准,这样代码可以不加修改的移植到其它系统。这个建议试图建立一个标准。5.定义 下面的定义是作为对填在以太网包头的类型字段的值的参考。 ether_type$XEROX_PUP, ether_type$DOD_INTERNET, ether_type$CHAOS,一个新的值 ether_type$ADDRESS_RESOLUTION再定义以下的值(后面讨论) ares_op$REQUEST (= 1, 高位字节在前) 和 ares_op$REPLY   (= 2), 和 ares_hrd$Ethernet (= 1).6.包格式 为了把<协议,地址>对映射到48比特以太网地址用于传输,需要一个体现地址转换协议的包格式。包格式如下所示。 以太网传输层(并不是用户需要访问的): 48比特:目的以太网地址 48比特:源以太网地址 16比特:协议类型 = ether_type$ADDRESS_RESOLUTION 以太网包数据: 16比特:(ar$hrd)硬件地址空间(例如:Ethernet,Packet Radio Net。) 16比特:(ar$pro)协议地址空间。对于以太网硬件,它属于类型字段ether_type$<协 议>的集合 8比特:(ar$hln)每种硬件地址的字节长度 8比特:(ar$pln)每种协议地址的字节长度 16比特:(ar$op)操作码(ares_op$REQUEST | ares_op$REPLY) n字节:(ar$sha)源硬件地址,n从ar$hln字段得到 m字节:(ar$spa)源协议地址,m从ar$pln字段得到 n字节:(ar$tha)目的硬件地址(如果知道的话) m字节:(ar$tpa)目的协议地址。7.发包 当网络层往下传来一个包,路由将决定这个包下一跳的协议地址,并根据目的协议地址决定用哪个硬件进行传输。在10兆以太网需要地址转换。一些更低的层次(像硬件驱动层)必须咨询地址转换模块(也许在以太网支持模块中实现)把<协议类型,目的协议地址>对转换成48比特以太网地址。地址转换模块试图在一个表中寻找这个对。如果找到,则返回相应的48比特以太网地址给调用者(硬件驱动层)。如果找不到,也许应通知调用者这个包正在被丢弃(假定包会被高层重传),同时发出一个类型字段为ether_type$ADDRESS_RESOLUTION的以太网包。地址转换模块在ar$hrd字段中填ares_hrd$Ethernet,在ar$pro字段中填要被转换的协议类型,在ar$hln字段中填6(48比特以太网地址字节数),在ar$pln字段中填该协议地址的字节数,在ar$op字段中填ares_op$REQUEST,在ar$sha字段中填自己的48比特以太网地址,在ar$spa字段中填自己的协议地址,在ar$tpa字段中填要访问机器的协议地址。不能在ar$tha字段中填特殊的值,因为它的值正是要得到的。如果实现上简单的话,ar$tpa字段可以填硬件的广播地址(在10兆以太网上所有机器)。根据原先的路由机制,这个包将被广播到所有在以太网电缆上的工作站。8.收包 当收到地址转换包时,收包模块把它送到运行类似下面算法的地址转换模块。条件不成立意味着处理结束,并丢弃包。 ?我用ar$hrd字段中的硬件吗? 是的:(几乎肯定) [检查ar$hln的硬件地址长度(可选)] ?我用ar$pro字段中的协议吗? 是的: [检查ar$pln的协议地址长度(可选)] Merge_flag := false 如果<协议类型,发送者协议地址>对在我的转换表中,用包中的发送者硬件 地址更新表,并把Merge_flag设成true。 ?我是目的协议地址吗? 是的: 如果Merge_flag是false,在转换表中加入三元组<协议类型,发送者协 议地址,发送者硬件地址>。 ?操作码是ares_op$REQUEST吗?(现在看操作码) 是的: 交换硬件和协议字段,把本地硬件和协议地址填在发送者字段中。 在ar$op字段中填ares_op$REPLY。然后从收到包的硬件上把这个包 发送到目的硬件地址。 注意到在检查操作码之前,<协议类型,发送者协议地址,发送者硬件地址>三元组就被加入转换表中。这是建立在通信是双向的假设上的,如果A有某种理由与B“交谈”,B也会有某种理由与A“交谈”。还注意到如果<协议类型,发送者协议地址>对已存在表项中,新的硬件地址将覆盖旧的。相关情况给出了这样做的动机。 总结:ar$hrd和ar$hln字段使非10兆以太网可以使用这个协议和包格式。对于10兆以太网,就是<1,6>。对于其它硬件网络,ar$prozi字段也许不再对应以太网类型字段,但会和地址转换要看的协议有关。9.为什么这么做 定期广播并不是所期望的,假设一个以太网上有100台主机,每隔10分钟广播地址转换信息(可能通过参数设置),这样每隔6秒钟就有一个包。这完全合理,但有用吗?工作站一般不会互相通信(因此转换表中有100个没用的表项),它们主要和大型机,文件服务器或网桥通信,而仅和很少数量的主机通信(例如交互谈话)。本文描述的协议只在需要时发送信息,并且每台机器每次启动时只发一次。 这种包格式不允许在一个包中进行多于一个的转换。这是为了简单。如果复杂的话,包将较难被分析,并且很多信息是没用的。想想一个有四种协议的网桥告诉工作站四个协议地址,而其中三个工作站从来都不会用到。 这种包格式允许应答包重用请求包的存储空间,应答包和请求包具有相同的长度,有些字段也相同。 硬件字段(ar$hrd)的值来自一个列表。现在只有为10兆以太网定义的一个值(ares_hrd$Ethernet = 1)。已经在讨论在Packet Radio Networks上使用这个协议,这需要为希望使用这个协议的其它硬件介质分配值。 对于10兆以太网,协议字段(ar$pro)的值来自集合ether_type$,这是对已分配的协议类型的自然重用。把它和操作码(ar$op)结合起来,将有效地减半可使用这个协议转换的协议的数量,同时将对网络监控和排错造成更多的困难(见下面网络监控和排错)。希望不会有32768个协议,但Murphy制造了一些不允许我们作这个假设的规则。 理论上,长度字段(ar$hln和ar$pln)是多余的,因为通过硬件类型(在ar$hrd中)和协议类型(在ar$pro中)就可以决定协议地址的长度。它们被包括是为了可选的一致性检查和网络监控和排错(见下面)。 操作码决定了是请求(可能导致一个应答)还是对先前请求的应答。16比特长了一些,但这个字段是必须的。 发送者的硬件地址和协议地址绝对是有用的,通过它们才能从转换表中得到结果。 在请求包格式中,目的协议地址是必须的,这样机器才能决定是否把发送者信息放到转换表中,是否发送应答。如果假设应答是由请求引起的,那么在应答包中这个字段不是必须的。包括它是为了完整性,网络监控,和使上面描述的算法更简单(把发送者信息放到转换表中后才去看操作码)。 目的硬件地址被包括进来是为了完整性和网络监控。它在请求包中毫无意义,因为机器要问的就是这个数字。它在应答包中是处理请求机器的地址。在某些实现中(例如不检察14比特的以太网头),把这个字段作为包的目的硬件地址发送到硬件驱动器,存在寄存器或栈空间中。 地址间没有填充字节。包数据被看作字节流,其中只有3个字节对可看作字(ar$hrd,ar$pro和ar$op),它们在发送时高位字节在前。10.网络监控和排错 以上的地址转换协议允许机器在以太网上获得高层协议活动(例如CHAOS,Internet,PUP,DECnet)的信息。它能决定哪个以太网地址正在使用(通过值),以及每个协议类型的协议地址。事实上,监控者不必使用任何一种高层协议。它象下面这样工作: 当收到地址转换包,它总是把<协议类型,发送者协议地址,发送者硬件地址>存入转换表。硬件和协议地址的长度可从包的ar$hln和ar$pln字段得到。如果操作码是应答,监控者可以丢弃这个包。如果操作码是请求,并且目的协议地址与监控者的协议地址相同,监控者通常会发应答包。监控者将只得到一个映射,因为请求的应答将被直接发送到请求主机。监控者可试着发自己的请求,但要小心,这会造成两个监控者陷入请求发送循环。 由于没有把协议和操作码合并成一个字段,监控者不必知道每个高层协议的请求操作码对应的应答操作码。长度字段要带有可“分析”协议地址的足够信息,虽然它并不带有协议地址的意义。 地址转换协议的一个成功实现还可为不成功的实现排错。假设一个硬件驱动者成功地广播了以太网类型为ether_type$ADDRESS_RESOLUTION的包。由于实现的错误或维护表的复杂性,包格式可能不正确。因为请求是广播,监控者会收到这个包,如果需要可显示出来进行排错。11.一个例子 假设在同一根10兆以太网电缆上有机器X和Y。它们有以太网地址EA(X)和EA(Y),DOD Internet地址IPA(X)和IPA(Y)。假设Internet的以太网类型为ET(IP)。机器X刚启动,并且它迟早都会向机器Y发包。X知道要发包给IPA(Y),并把IPA(Y)告诉硬件驱动者(这里是以太网驱动者)。驱动者让地址转换模块把转换成48比特以太网地址,但因为X刚启动,它没有这些信息。它先不发包,生成一个地址转换包, (ar$hrd) = ares_hrd$Ethernet (ar$pro) = ET(IP) (ar$hln) = EA(X)的长度 (ar$pln) = (IPA(X)的长度 (ar$op)  = ares_op$REQUEST (ar$sha) = EA(X) (ar$spa) = IPA(X) (ar$tha) = 任意值 (ar$tpa) = IPA(Y)并广播到电缆上的所有机器。 机器Y收到这个包,判断自己是否懂这种硬件类型(以太网),是否理解这种协议(Internet),包是否是给自己的((ar$tpa)=IPA(Y))。然后把映射到EA(X)的信息记下来(可能会覆盖已有表项)。然后又意识到是请求,于是就交换字段,把EA(Y)填入发送者以太网地址字段(ar$sha),把操作码设为应答,再把包直接发送(不是广播)到EA(X)。这个时候,Y已经知道怎样向X发送,而X还不知道怎样向Y发送。s 机器X收到Y发送的包,生成到EA(Y)的映射,意识到是个应答包,于是丢弃。下次X的Internet模块试图向Y发送包,地址转换就会成功了,并且包也能到达。如果Y的Internet模块要向X发送,它也会成功,因为Y已经从X的地址转换请求中记住了需要的信息。12.相关情况 也许希望转换表会过期,这些的实现超出本协议的范围。这里有一个较详细的描述(感谢MOON@SCRC@MIT-MC)。 当主机移动时,假设移动时清除了地址转换表,那么从该主机发起的任何连接都可以工作。但是发起过到该主机连接的其它主机并没有任何理由会知道去丢弃它们的旧地址。而48比特以太网地址是唯一的,任何时候都是固定的,不会变。如果主机名(和其它协议地址)在不同物理硬件上被重新分配,主机就“移动”了。而且从经验来说,总会存在由于硬件或软件错误产生的错误路由信息,但这种错误不允许永远存在。也许发起某个连接的失败,会使地址转换模块认为由于对方当机或转换表项错误等原因而不可到达对方。从而删除这个信息。也许收到一个来自某个主机的包,会更新用来向该主机发送的转换表项的时钟。如果一定时间没有收到来自某个主机的包,这条转换表项会被删除。这将产生为每个收到的包扫描转换表的额外负担。或许使用散列或索引会快一些。 收到地址转换包的建议算法试图缩短主机移动以后的恢复时间。如果<协议类型,发送者协议地址>已经在转换表中,那么发送者的硬件地址将覆盖这个表项。因此在良好的以太网上,当请求广播到达后,每个工作站都将得到这个新的硬件地址。 另一种方法是有一个守护进程在处理超时。经过一定时间,守护进程考虑删除一个表项。它先用表里的以太网地址直接发送地址转换请求包(如果需要可重传几次)。如果在一段短时间内,没有收到应答,则删除表项。这个请求是直接发送的,不会影响以太网上的每个工作站。删除表项就是把必须重新获得的有用信息删除。 因为主机只发送关于它们自身的信息,而不会发送任何其它主机的信息,重启动一个主机会使它的地址映射表成为最新的。通过机器间的传输,错误信息不会永远存在。机器中唯一可存在的错误信息是不知道其它机器已经修改了48比特以太网地址。也许手工更新(或清除)地址映射表就够了。 如果认为重要的话,这篇文档需要更多地思考。任何地址转换类型的协议都用的到。RFC826——An Ethernet Address Resolution Protocol or Converting Network Protocol Addresses to 48.bit Ethernet Address for Transmission on Ethernet Hardware                 以太网地址转换协议或转换网络协议地址为48比特以太网地址用于在以太网硬件上传输1RFC文档中文翻译计划