diff options
Diffstat (limited to 'doc/rfc/rfc826.txt')
-rw-r--r-- | doc/rfc/rfc826.txt | 470 |
1 files changed, 470 insertions, 0 deletions
diff --git a/doc/rfc/rfc826.txt b/doc/rfc/rfc826.txt new file mode 100644 index 0000000..8d5aae2 --- /dev/null +++ b/doc/rfc/rfc826.txt @@ -0,0 +1,470 @@ +Network Working Group David C. Plummer +Request For Comments: 826 (DCP@MIT-MC) + November 1982 + + + An Ethernet Address Resolution Protocol + -- or -- + Converting Network Protocol Addresses + to 48.bit Ethernet Address + for Transmission on + Ethernet Hardware + + + + + + Abstract + +The implementation of protocol P on a sending host S decides, +through protocol P's routing mechanism, that it wants to transmit +to a target host T located some place on a connected piece of +10Mbit Ethernet cable. To actually transmit the Ethernet packet +a 48.bit Ethernet address must be generated. The addresses of +hosts within protocol P are not always compatible with the +corresponding Ethernet address (being different lengths or +values). Presented here is a protocol that allows dynamic +distribution of the information needed to build tables to +translate an address A in protocol P's address space into a +48.bit Ethernet address. + +Generalizations have been made which allow the protocol to be +used for non-10Mbit Ethernet hardware. Some packet radio +networks are examples of such hardware. + +-------------------------------------------------------------------- + +The protocol proposed here is the result of a great deal of +discussion with several other people, most notably J. Noel +Chiappa, Yogen Dalal, and James E. Kulp, and helpful comments +from David Moon. + + + + +[The purpose of this RFC is to present a method of Converting +Protocol Addresses (e.g., IP addresses) to Local Network +Addresses (e.g., Ethernet addresses). This is a issue of general +concern in the ARPA Internet community at this time. The +method proposed here is presented for your consideration and +comment. This is not the specification of a Internet Standard.] + +Notes: +------ + +This protocol was originally designed for the DEC/Intel/Xerox +10Mbit Ethernet. It has been generalized to allow it to be used +for other types of networks. Much of the discussion will be +directed toward the 10Mbit Ethernet. Generalizations, where +applicable, will follow the Ethernet-specific discussion. + +DOD Internet Protocol will be referred to as Internet. + +Numbers here are in the Ethernet standard, which is high byte +first. This is the opposite of the byte addressing of machines +such as PDP-11s and VAXes. Therefore, special care must be taken +with the opcode field (ar$op) described below. + +An agreed upon authority is needed to manage hardware name space +values (see below). Until an official authority exists, requests +should be submitted to + David C. Plummer + Symbolics, Inc. + 243 Vassar Street + Cambridge, Massachusetts 02139 +Alternatively, network mail can be sent to DCP@MIT-MC. + +The Problem: +------------ + +The world is a jungle in general, and the networking game +contributes many animals. At nearly every layer of a network +architecture there are several potential protocols that could be +used. For example, at a high level, there is TELNET and SUPDUP +for remote login. Somewhere below that there is a reliable byte +stream protocol, which might be CHAOS protocol, DOD TCP, Xerox +BSP or DECnet. Even closer to the hardware is the logical +transport layer, which might be CHAOS, DOD Internet, Xerox PUP, +or DECnet. The 10Mbit Ethernet allows all of these protocols +(and more) to coexist on a single cable by means of a type field +in the Ethernet packet header. However, the 10Mbit Ethernet +requires 48.bit addresses on the physical cable, yet most +protocol addresses are not 48.bits long, nor do they necessarily +have any relationship to the 48.bit Ethernet address of the +hardware. For example, CHAOS addresses are 16.bits, DOD Internet +addresses are 32.bits, and Xerox PUP addresses are 8.bits. A +protocol is needed to dynamically distribute the correspondences +between a <protocol, address> pair and a 48.bit Ethernet address. + +Motivation: +----------- + +Use of the 10Mbit Ethernet is increasing as more manufacturers +supply interfaces that conform to the specification published by +DEC, Intel and Xerox. With this increasing availability, more +and more software is being written for these interfaces. There +are two alternatives: (1) Every implementor invents his/her own +method to do some form of address resolution, or (2) every +implementor uses a standard so that his/her code can be +distributed to other systems without need for modification. This +proposal attempts to set the standard. + +Definitions: +------------ + +Define the following for referring to the values put in the TYPE +field of the Ethernet packet header: + ether_type$XEROX_PUP, + ether_type$DOD_INTERNET, + ether_type$CHAOS, +and a new one: + ether_type$ADDRESS_RESOLUTION. +Also define the following values (to be discussed later): + ares_op$REQUEST (= 1, high byte transmitted first) and + ares_op$REPLY (= 2), +and + ares_hrd$Ethernet (= 1). + +Packet format: +-------------- + +To communicate mappings from <protocol, address> pairs to 48.bit +Ethernet addresses, a packet format that embodies the Address +Resolution protocol is needed. The format of the packet follows. + + Ethernet transmission layer (not necessarily accessible to + the user): + 48.bit: Ethernet address of destination + 48.bit: Ethernet address of sender + 16.bit: Protocol type = ether_type$ADDRESS_RESOLUTION + Ethernet packet data: + 16.bit: (ar$hrd) Hardware address space (e.g., Ethernet, + Packet Radio Net.) + 16.bit: (ar$pro) Protocol address space. For Ethernet + hardware, this is from the set of type + fields ether_typ$<protocol>. + 8.bit: (ar$hln) byte length of each hardware address + 8.bit: (ar$pln) byte length of each protocol address + 16.bit: (ar$op) opcode (ares_op$REQUEST | ares_op$REPLY) + nbytes: (ar$sha) Hardware address of sender of this + packet, n from the ar$hln field. + mbytes: (ar$spa) Protocol address of sender of this + packet, m from the ar$pln field. + nbytes: (ar$tha) Hardware address of target of this + packet (if known). + mbytes: (ar$tpa) Protocol address of target. + + +Packet Generation: +------------------ + +As a packet is sent down through the network layers, routing +determines the protocol address of the next hop for the packet +and on which piece of hardware it expects to find the station +with the immediate target protocol address. In the case of the +10Mbit Ethernet, address resolution is needed and some lower +layer (probably the hardware driver) must consult the Address +Resolution module (perhaps implemented in the Ethernet support +module) to convert the <protocol type, target protocol address> +pair to a 48.bit Ethernet address. The Address Resolution module +tries to find this pair in a table. If it finds the pair, it +gives the corresponding 48.bit Ethernet address back to the +caller (hardware driver) which then transmits the packet. If it +does not, it probably informs the caller that it is throwing the +packet away (on the assumption the packet will be retransmitted +by a higher network layer), and generates an Ethernet packet with +a type field of ether_type$ADDRESS_RESOLUTION. The Address +Resolution module then sets the ar$hrd field to +ares_hrd$Ethernet, ar$pro to the protocol type that is being +resolved, ar$hln to 6 (the number of bytes in a 48.bit Ethernet +address), ar$pln to the length of an address in that protocol, +ar$op to ares_op$REQUEST, ar$sha with the 48.bit ethernet address +of itself, ar$spa with the protocol address of itself, and ar$tpa +with the protocol address of the machine that is trying to be +accessed. It does not set ar$tha to anything in particular, +because it is this value that it is trying to determine. It +could set ar$tha to the broadcast address for the hardware (all +ones in the case of the 10Mbit Ethernet) if that makes it +convenient for some aspect of the implementation. It then causes +this packet to be broadcast to all stations on the Ethernet cable +originally determined by the routing mechanism. + + + +Packet Reception: +----------------- + +When an address resolution packet is received, the receiving +Ethernet module gives the packet to the Address Resolution module +which goes through an algorithm similar to the following. +Negative conditionals indicate an end of processing and a +discarding of the packet. + +?Do I have the hardware type in ar$hrd? +Yes: (almost definitely) + [optionally check the hardware length ar$hln] + ?Do I speak the protocol in ar$pro? + Yes: + [optionally check the protocol length ar$pln] + Merge_flag := false + If the pair <protocol type, sender protocol address> is + already in my translation table, update the sender + hardware address field of the entry with the new + information in the packet and set Merge_flag to true. + ?Am I the target protocol address? + Yes: + If Merge_flag is false, add the triplet <protocol type, + sender protocol address, sender hardware address> to + the translation table. + ?Is the opcode ares_op$REQUEST? (NOW look at the opcode!!) + Yes: + Swap hardware and protocol fields, putting the local + hardware and protocol addresses in the sender fields. + Set the ar$op field to ares_op$REPLY + Send the packet to the (new) target hardware address on + the same hardware on which the request was received. + +Notice that the <protocol type, sender protocol address, sender +hardware address> triplet is merged into the table before the +opcode is looked at. This is on the assumption that communcation +is bidirectional; if A has some reason to talk to B, then B will +probably have some reason to talk to A. Notice also that if an +entry already exists for the <protocol type, sender protocol +address> pair, then the new hardware address supersedes the old +one. Related Issues gives some motivation for this. + +Generalization: The ar$hrd and ar$hln fields allow this protocol +and packet format to be used for non-10Mbit Ethernets. For the +10Mbit Ethernet <ar$hrd, ar$hln> takes on the value <1, 6>. For +other hardware networks, the ar$pro field may no longer +correspond to the Ethernet type field, but it should be +associated with the protocol whose address resolution is being +sought. + + +Why is it done this way?? +------------------------- + +Periodic broadcasting is definitely not desired. Imagine 100 +workstations on a single Ethernet, each broadcasting address +resolution information once per 10 minutes (as one possible set +of parameters). This is one packet every 6 seconds. This is +almost reasonable, but what use is it? The workstations aren't +generally going to be talking to each other (and therefore have +100 useless entries in a table); they will be mainly talking to a +mainframe, file server or bridge, but only to a small number of +other workstations (for interactive conversations, for example). +The protocol described in this paper distributes information as +it is needed, and only once (probably) per boot of a machine. + +This format does not allow for more than one resolution to be +done in the same packet. This is for simplicity. If things were +multiplexed the packet format would be considerably harder to +digest, and much of the information could be gratuitous. Think +of a bridge that talks four protocols telling a workstation all +four protocol addresses, three of which the workstation will +probably never use. + +This format allows the packet buffer to be reused if a reply is +generated; a reply has the same length as a request, and several +of the fields are the same. + +The value of the hardware field (ar$hrd) is taken from a list for +this purpose. Currently the only defined value is for the 10Mbit +Ethernet (ares_hrd$Ethernet = 1). There has been talk of using +this protocol for Packet Radio Networks as well, and this will +require another value as will other future hardware mediums that +wish to use this protocol. + +For the 10Mbit Ethernet, the value in the protocol field (ar$pro) +is taken from the set ether_type$. This is a natural reuse of +the assigned protocol types. Combining this with the opcode +(ar$op) would effectively halve the number of protocols that can +be resolved under this protocol and would make a monitor/debugger +more complex (see Network Monitoring and Debugging below). It is +hoped that we will never see 32768 protocols, but Murphy made +some laws which don't allow us to make this assumption. + +In theory, the length fields (ar$hln and ar$pln) are redundant, +since the length of a protocol address should be determined by +the hardware type (found in ar$hrd) and the protocol type (found +in ar$pro). It is included for optional consistency checking, +and for network monitoring and debugging (see below). + +The opcode is to determine if this is a request (which may cause +a reply) or a reply to a previous request. 16 bits for this is +overkill, but a flag (field) is needed. + +The sender hardware address and sender protocol address are +absolutely necessary. It is these fields that get put in a +translation table. + +The target protocol address is necessary in the request form of +the packet so that a machine can determine whether or not to +enter the sender information in a table or to send a reply. It +is not necessarily needed in the reply form if one assumes a +reply is only provoked by a request. It is included for +completeness, network monitoring, and to simplify the suggested +processing algorithm described above (which does not look at the +opcode until AFTER putting the sender information in a table). + +The target hardware address is included for completeness and +network monitoring. It has no meaning in the request form, since +it is this number that the machine is requesting. Its meaning in +the reply form is the address of the machine making the request. +In some implementations (which do not get to look at the 14.byte +ethernet header, for example) this may save some register +shuffling or stack space by sending this field to the hardware +driver as the hardware destination address of the packet. + +There are no padding bytes between addresses. The packet data +should be viewed as a byte stream in which only 3 byte pairs are +defined to be words (ar$hrd, ar$pro and ar$op) which are sent +most significant byte first (Ethernet/PDP-10 byte style). + + +Network monitoring and debugging: +--------------------------------- + +The above Address Resolution protocol allows a machine to gain +knowledge about the higher level protocol activity (e.g., CHAOS, +Internet, PUP, DECnet) on an Ethernet cable. It can determine +which Ethernet protocol type fields are in use (by value) and the +protocol addresses within each protocol type. In fact, it is not +necessary for the monitor to speak any of the higher level +protocols involved. It goes something like this: + +When a monitor receives an Address Resolution packet, it always +enters the <protocol type, sender protocol address, sender +hardware address> in a table. It can determine the length of the +hardware and protocol address from the ar$hln and ar$pln fields +of the packet. If the opcode is a REPLY the monitor can then +throw the packet away. If the opcode is a REQUEST and the target +protocol address matches the protocol address of the monitor, the +monitor sends a REPLY as it normally would. The monitor will +only get one mapping this way, since the REPLY to the REQUEST +will be sent directly to the requesting host. The monitor could +try sending its own REQUEST, but this could get two monitors into +a REQUEST sending loop, and care must be taken. + +Because the protocol and opcode are not combined into one field, +the monitor does not need to know which request opcode is +associated with which reply opcode for the same higher level +protocol. The length fields should also give enough information +to enable it to "parse" a protocol addresses, although it has no +knowledge of what the protocol addresses mean. + +A working implementation of the Address Resolution protocol can +also be used to debug a non-working implementation. Presumably a +hardware driver will successfully broadcast a packet with Ethernet +type field of ether_type$ADDRESS_RESOLUTION. The format of the +packet may not be totally correct, because initial +implementations may have bugs, and table management may be +slightly tricky. Because requests are broadcast a monitor will +receive the packet and can display it for debugging if desired. + + +An Example: +----------- + +Let there exist machines X and Y that are on the same 10Mbit +Ethernet cable. They have Ethernet address EA(X) and EA(Y) and +DOD Internet addresses IPA(X) and IPA(Y) . Let the Ethernet type +of Internet be ET(IP). Machine X has just been started, and +sooner or later wants to send an Internet packet to machine Y on +the same cable. X knows that it wants to send to IPA(Y) and +tells the hardware driver (here an Ethernet driver) IPA(Y). The +driver consults the Address Resolution module to convert <ET(IP), +IPA(Y)> into a 48.bit Ethernet address, but because X was just +started, it does not have this information. It throws the +Internet packet away and instead creates an ADDRESS RESOLUTION +packet with + (ar$hrd) = ares_hrd$Ethernet + (ar$pro) = ET(IP) + (ar$hln) = length(EA(X)) + (ar$pln) = length(IPA(X)) + (ar$op) = ares_op$REQUEST + (ar$sha) = EA(X) + (ar$spa) = IPA(X) + (ar$tha) = don't care + (ar$tpa) = IPA(Y) +and broadcasts this packet to everybody on the cable. + +Machine Y gets this packet, and determines that it understands +the hardware type (Ethernet), that it speaks the indicated +protocol (Internet) and that the packet is for it +((ar$tpa)=IPA(Y)). It enters (probably replacing any existing +entry) the information that <ET(IP), IPA(X)> maps to EA(X). It +then notices that it is a request, so it swaps fields, putting +EA(Y) in the new sender Ethernet address field (ar$sha), sets the +opcode to reply, and sends the packet directly (not broadcast) to +EA(X). At this point Y knows how to send to X, but X still +doesn't know how to send to Y. + +Machine X gets the reply packet from Y, forms the map from +<ET(IP), IPA(Y)> to EA(Y), notices the packet is a reply and +throws it away. The next time X's Internet module tries to send +a packet to Y on the Ethernet, the translation will succeed, and +the packet will (hopefully) arrive. If Y's Internet module then +wants to talk to X, this will also succeed since Y has remembered +the information from X's request for Address Resolution. + +Related issue: +--------------- + +It may be desirable to have table aging and/or timeouts. The +implementation of these is outside the scope of this protocol. +Here is a more detailed description (thanks to MOON@SCRC@MIT-MC). + +If a host moves, any connections initiated by that host will +work, assuming its own address resolution table is cleared when +it moves. However, connections initiated to it by other hosts +will have no particular reason to know to discard their old +address. However, 48.bit Ethernet addresses are supposed to be +unique and fixed for all time, so they shouldn't change. A host +could "move" if a host name (and address in some other protocol) +were reassigned to a different physical piece of hardware. Also, +as we know from experience, there is always the danger of +incorrect routing information accidentally getting transmitted +through hardware or software error; it should not be allowed to +persist forever. Perhaps failure to initiate a connection should +inform the Address Resolution module to delete the information on +the basis that the host is not reachable, possibly because it is +down or the old translation is no longer valid. Or perhaps +receiving of a packet from a host should reset a timeout in the +address resolution entry used for transmitting packets to that +host; if no packets are received from a host for a suitable +length of time, the address resolution entry is forgotten. This +may cause extra overhead to scan the table for each incoming +packet. Perhaps a hash or index can make this faster. + +The suggested algorithm for receiving address resolution packets +tries to lessen the time it takes for recovery if a host does +move. Recall that if the <protocol type, sender protocol +address> is already in the translation table, then the sender +hardware address supersedes the existing entry. Therefore, on a +perfect Ethernet where a broadcast REQUEST reaches all stations +on the cable, each station will be get the new hardware address. + +Another alternative is to have a daemon perform the timeouts. +After a suitable time, the daemon considers removing an entry. +It first sends (with a small number of retransmissions if needed) +an address resolution packet with opcode REQUEST directly to the +Ethernet address in the table. If a REPLY is not seen in a short +amount of time, the entry is deleted. The request is sent +directly so as not to bother every station on the Ethernet. Just +forgetting entries will likely cause useful information to be +forgotten, which must be regained. + +Since hosts don't transmit information about anyone other than +themselves, rebooting a host will cause its address mapping table +to be up to date. Bad information can't persist forever by being +passed around from machine to machine; the only bad information +that can exist is in a machine that doesn't know that some other +machine has changed its 48.bit Ethernet address. Perhaps +manually resetting (or clearing) the address mapping table will +suffice. + +This issue clearly needs more thought if it is believed to be +important. It is caused by any address resolution-like protocol. + |