Annotation of embedaddon/ipguard/doc/rfc826.txt, revision 1.1

1.1     ! misho       1: Network Working Group                                   David C. Plummer 
        !             2: Request For Comments:  826                                  (DCP@MIT-MC)
        !             3:                                                            November 1982
        !             4: 
        !             5: 
        !             6:             An Ethernet Address Resolution Protocol
        !             7:                             -- or --
        !             8:               Converting Network Protocol Addresses
        !             9:                    to 48.bit Ethernet Address
        !            10:                        for Transmission on
        !            11:                         Ethernet Hardware
        !            12: 
        !            13: 
        !            14: 
        !            15: 
        !            16: 
        !            17:                            Abstract
        !            18: 
        !            19: The implementation of protocol P on a sending host S decides,
        !            20: through protocol P's routing mechanism, that it wants to transmit
        !            21: to a target host T located some place on a connected piece of
        !            22: 10Mbit Ethernet cable.  To actually transmit the Ethernet packet
        !            23: a 48.bit Ethernet address must be generated.  The addresses of
        !            24: hosts within protocol P are not always compatible with the
        !            25: corresponding Ethernet address (being different lengths or
        !            26: values).  Presented here is a protocol that allows dynamic
        !            27: distribution of the information needed to build tables to
        !            28: translate an address A in protocol P's address space into a
        !            29: 48.bit Ethernet address.
        !            30: 
        !            31: Generalizations have been made which allow the protocol to be
        !            32: used for non-10Mbit Ethernet hardware.  Some packet radio
        !            33: networks are examples of such hardware.
        !            34: 
        !            35: --------------------------------------------------------------------
        !            36: 
        !            37: The protocol proposed here is the result of a great deal of
        !            38: discussion with several other people, most notably J. Noel
        !            39: Chiappa, Yogen Dalal, and James E. Kulp, and helpful comments
        !            40: from David Moon.
        !            41: 
        !            42: 
        !            43: 
        !            44: 
        !            45: [The purpose of this RFC is to present a method of Converting
        !            46: Protocol Addresses (e.g., IP addresses) to Local Network
        !            47: Addresses (e.g., Ethernet addresses).  This is a issue of general
        !            48: concern in the ARPA Internet community at this time.  The
        !            49: method proposed here is presented for your consideration and
        !            50: comment.  This is not the specification of a Internet Standard.]
        !            51: 
        !            52: Notes:
        !            53: ------       
        !            54: 
        !            55: This protocol was originally designed for the DEC/Intel/Xerox
        !            56: 10Mbit Ethernet.  It has been generalized to allow it to be used
        !            57: for other types of networks.  Much of the discussion will be
        !            58: directed toward the 10Mbit Ethernet.  Generalizations, where
        !            59: applicable, will follow the Ethernet-specific discussion.
        !            60: 
        !            61: DOD Internet Protocol will be referred to as Internet.
        !            62: 
        !            63: Numbers here are in the Ethernet standard, which is high byte
        !            64: first.  This is the opposite of the byte addressing of machines
        !            65: such as PDP-11s and VAXes.  Therefore, special care must be taken
        !            66: with the opcode field (ar$op) described below.
        !            67: 
        !            68: An agreed upon authority is needed to manage hardware name space
        !            69: values (see below).  Until an official authority exists, requests
        !            70: should be submitted to
        !            71:        David C. Plummer
        !            72:        Symbolics, Inc.
        !            73:        243 Vassar Street
        !            74:        Cambridge, Massachusetts  02139
        !            75: Alternatively, network mail can be sent to DCP@MIT-MC.
        !            76: 
        !            77: The Problem:
        !            78: ------------
        !            79: 
        !            80: The world is a jungle in general, and the networking game
        !            81: contributes many animals.  At nearly every layer of a network
        !            82: architecture there are several potential protocols that could be
        !            83: used.  For example, at a high level, there is TELNET and SUPDUP
        !            84: for remote login.  Somewhere below that there is a reliable byte
        !            85: stream protocol, which might be CHAOS protocol, DOD TCP, Xerox
        !            86: BSP or DECnet.  Even closer to the hardware is the logical
        !            87: transport layer, which might be CHAOS, DOD Internet, Xerox PUP,
        !            88: or DECnet.  The 10Mbit Ethernet allows all of these protocols
        !            89: (and more) to coexist on a single cable by means of a type field
        !            90: in the Ethernet packet header.  However, the 10Mbit Ethernet
        !            91: requires 48.bit addresses on the physical cable, yet most
        !            92: protocol addresses are not 48.bits long, nor do they necessarily
        !            93: have any relationship to the 48.bit Ethernet address of the
        !            94: hardware.  For example, CHAOS addresses are 16.bits, DOD Internet
        !            95: addresses are 32.bits, and Xerox PUP addresses are 8.bits.  A
        !            96: protocol is needed to dynamically distribute the correspondences
        !            97: between a <protocol, address> pair and a 48.bit Ethernet address.
        !            98: 
        !            99: Motivation:
        !           100: -----------
        !           101: 
        !           102: Use of the 10Mbit Ethernet is increasing as more manufacturers
        !           103: supply interfaces that conform to the specification published by
        !           104: DEC, Intel and Xerox.  With this increasing availability, more
        !           105: and more software is being written for these interfaces.  There
        !           106: are two alternatives: (1) Every implementor invents his/her own
        !           107: method to do some form of address resolution, or (2) every
        !           108: implementor uses a standard so that his/her code can be
        !           109: distributed to other systems without need for modification.  This
        !           110: proposal attempts to set the standard.
        !           111: 
        !           112: Definitions:
        !           113: ------------
        !           114: 
        !           115: Define the following for referring to the values put in the TYPE
        !           116: field of the Ethernet packet header:
        !           117:        ether_type$XEROX_PUP,
        !           118:        ether_type$DOD_INTERNET,
        !           119:        ether_type$CHAOS, 
        !           120: and a new one:
        !           121:        ether_type$ADDRESS_RESOLUTION.  
        !           122: Also define the following values (to be discussed later):
        !           123:        ares_op$REQUEST (= 1, high byte transmitted first) and
        !           124:        ares_op$REPLY   (= 2), 
        !           125: and
        !           126:        ares_hrd$Ethernet (= 1).
        !           127: 
        !           128: Packet format:
        !           129: --------------
        !           130: 
        !           131: To communicate mappings from <protocol, address> pairs to 48.bit
        !           132: Ethernet addresses, a packet format that embodies the Address
        !           133: Resolution protocol is needed.  The format of the packet follows.
        !           134: 
        !           135:     Ethernet transmission layer (not necessarily accessible to
        !           136:         the user):
        !           137:        48.bit: Ethernet address of destination
        !           138:        48.bit: Ethernet address of sender
        !           139:        16.bit: Protocol type = ether_type$ADDRESS_RESOLUTION
        !           140:     Ethernet packet data:
        !           141:        16.bit: (ar$hrd) Hardware address space (e.g., Ethernet,
        !           142:                         Packet Radio Net.)
        !           143:        16.bit: (ar$pro) Protocol address space.  For Ethernet
        !           144:                         hardware, this is from the set of type
        !           145:                         fields ether_typ$<protocol>.
        !           146:         8.bit: (ar$hln) byte length of each hardware address
        !           147:         8.bit: (ar$pln) byte length of each protocol address
        !           148:        16.bit: (ar$op)  opcode (ares_op$REQUEST | ares_op$REPLY)
        !           149:        nbytes: (ar$sha) Hardware address of sender of this
        !           150:                         packet, n from the ar$hln field.
        !           151:        mbytes: (ar$spa) Protocol address of sender of this
        !           152:                         packet, m from the ar$pln field.
        !           153:        nbytes: (ar$tha) Hardware address of target of this
        !           154:                         packet (if known).
        !           155:        mbytes: (ar$tpa) Protocol address of target.
        !           156: 
        !           157: 
        !           158: Packet Generation:
        !           159: ------------------
        !           160: 
        !           161: As a packet is sent down through the network layers, routing
        !           162: determines the protocol address of the next hop for the packet
        !           163: and on which piece of hardware it expects to find the station
        !           164: with the immediate target protocol address.  In the case of the
        !           165: 10Mbit Ethernet, address resolution is needed and some lower
        !           166: layer (probably the hardware driver) must consult the Address
        !           167: Resolution module (perhaps implemented in the Ethernet support
        !           168: module) to convert the <protocol type, target protocol address>
        !           169: pair to a 48.bit Ethernet address.  The Address Resolution module
        !           170: tries to find this pair in a table.  If it finds the pair, it
        !           171: gives the corresponding 48.bit Ethernet address back to the
        !           172: caller (hardware driver) which then transmits the packet.  If it
        !           173: does not, it probably informs the caller that it is throwing the
        !           174: packet away (on the assumption the packet will be retransmitted
        !           175: by a higher network layer), and generates an Ethernet packet with
        !           176: a type field of ether_type$ADDRESS_RESOLUTION.  The Address
        !           177: Resolution module then sets the ar$hrd field to
        !           178: ares_hrd$Ethernet, ar$pro to the protocol type that is being
        !           179: resolved, ar$hln to 6 (the number of bytes in a 48.bit Ethernet
        !           180: address), ar$pln to the length of an address in that protocol,
        !           181: ar$op to ares_op$REQUEST, ar$sha with the 48.bit ethernet address
        !           182: of itself, ar$spa with the protocol address of itself, and ar$tpa
        !           183: with the protocol address of the machine that is trying to be
        !           184: accessed.  It does not set ar$tha to anything in particular,
        !           185: because it is this value that it is trying to determine.  It
        !           186: could set ar$tha to the broadcast address for the hardware (all
        !           187: ones in the case of the 10Mbit Ethernet) if that makes it
        !           188: convenient for some aspect of the implementation.  It then causes
        !           189: this packet to be broadcast to all stations on the Ethernet cable
        !           190: originally determined by the routing mechanism.
        !           191: 
        !           192: 
        !           193: 
        !           194: Packet Reception:
        !           195: -----------------
        !           196: 
        !           197: When an address resolution packet is received, the receiving
        !           198: Ethernet module gives the packet to the Address Resolution module
        !           199: which goes through an algorithm similar to the following.
        !           200: Negative conditionals indicate an end of processing and a
        !           201: discarding of the packet.
        !           202: 
        !           203: ?Do I have the hardware type in ar$hrd?
        !           204: Yes: (almost definitely)
        !           205:   [optionally check the hardware length ar$hln]
        !           206:   ?Do I speak the protocol in ar$pro?
        !           207:   Yes:
        !           208:     [optionally check the protocol length ar$pln]
        !           209:     Merge_flag := false
        !           210:     If the pair <protocol type, sender protocol address> is
        !           211:         already in my translation table, update the sender
        !           212:        hardware address field of the entry with the new
        !           213:        information in the packet and set Merge_flag to true. 
        !           214:     ?Am I the target protocol address?
        !           215:     Yes:
        !           216:       If Merge_flag is false, add the triplet <protocol type,
        !           217:           sender protocol address, sender hardware address> to
        !           218:          the translation table.
        !           219:       ?Is the opcode ares_op$REQUEST?  (NOW look at the opcode!!)
        !           220:       Yes:
        !           221:        Swap hardware and protocol fields, putting the local
        !           222:            hardware and protocol addresses in the sender fields.
        !           223:        Set the ar$op field to ares_op$REPLY
        !           224:        Send the packet to the (new) target hardware address on
        !           225:            the same hardware on which the request was received.
        !           226: 
        !           227: Notice that the <protocol type, sender protocol address, sender
        !           228: hardware address> triplet is merged into the table before the
        !           229: opcode is looked at.  This is on the assumption that communcation
        !           230: is bidirectional; if A has some reason to talk to B, then B will
        !           231: probably have some reason to talk to A.  Notice also that if an
        !           232: entry already exists for the <protocol type, sender protocol
        !           233: address> pair, then the new hardware address supersedes the old
        !           234: one.  Related Issues gives some motivation for this.
        !           235: 
        !           236: Generalization:  The ar$hrd and ar$hln fields allow this protocol
        !           237: and packet format to be used for non-10Mbit Ethernets.  For the
        !           238: 10Mbit Ethernet <ar$hrd, ar$hln> takes on the value <1, 6>.  For
        !           239: other hardware networks, the ar$pro field may no longer
        !           240: correspond to the Ethernet type field, but it should be
        !           241: associated with the protocol whose address resolution is being
        !           242: sought.
        !           243: 
        !           244: 
        !           245: Why is it done this way??
        !           246: -------------------------
        !           247: 
        !           248: Periodic broadcasting is definitely not desired.  Imagine 100
        !           249: workstations on a single Ethernet, each broadcasting address
        !           250: resolution information once per 10 minutes (as one possible set
        !           251: of parameters).  This is one packet every 6 seconds.  This is
        !           252: almost reasonable, but what use is it?  The workstations aren't
        !           253: generally going to be talking to each other (and therefore have
        !           254: 100 useless entries in a table); they will be mainly talking to a
        !           255: mainframe, file server or bridge, but only to a small number of
        !           256: other workstations (for interactive conversations, for example).
        !           257: The protocol described in this paper distributes information as
        !           258: it is needed, and only once (probably) per boot of a machine.
        !           259: 
        !           260: This format does not allow for more than one resolution to be
        !           261: done in the same packet.  This is for simplicity.  If things were
        !           262: multiplexed the packet format would be considerably harder to
        !           263: digest, and much of the information could be gratuitous.  Think
        !           264: of a bridge that talks four protocols telling a workstation all
        !           265: four protocol addresses, three of which the workstation will
        !           266: probably never use.
        !           267: 
        !           268: This format allows the packet buffer to be reused if a reply is
        !           269: generated; a reply has the same length as a request, and several
        !           270: of the fields are the same.
        !           271: 
        !           272: The value of the hardware field (ar$hrd) is taken from a list for
        !           273: this purpose.  Currently the only defined value is for the 10Mbit
        !           274: Ethernet (ares_hrd$Ethernet = 1).  There has been talk of using
        !           275: this protocol for Packet Radio Networks as well, and this will
        !           276: require another value as will other future hardware mediums that
        !           277: wish to use this protocol.
        !           278: 
        !           279: For the 10Mbit Ethernet, the value in the protocol field (ar$pro)
        !           280: is taken from the set ether_type$.  This is a natural reuse of
        !           281: the assigned protocol types.  Combining this with the opcode
        !           282: (ar$op) would effectively halve the number of protocols that can
        !           283: be resolved under this protocol and would make a monitor/debugger
        !           284: more complex (see Network Monitoring and Debugging below).  It is
        !           285: hoped that we will never see 32768 protocols, but Murphy made
        !           286: some laws which don't allow us to make this assumption.
        !           287: 
        !           288: In theory, the length fields (ar$hln and ar$pln) are redundant,
        !           289: since the length of a protocol address should be determined by
        !           290: the hardware type (found in ar$hrd) and the protocol type (found
        !           291: in ar$pro).  It is included for optional consistency checking,
        !           292: and for network monitoring and debugging (see below). 
        !           293: 
        !           294: The opcode is to determine if this is a request (which may cause
        !           295: a reply) or a reply to a previous request.  16 bits for this is
        !           296: overkill, but a flag (field) is needed.
        !           297: 
        !           298: The sender hardware address and sender protocol address are
        !           299: absolutely necessary.  It is these fields that get put in a
        !           300: translation table.
        !           301: 
        !           302: The target protocol address is necessary in the request form of
        !           303: the packet so that a machine can determine whether or not to
        !           304: enter the sender information in a table or to send a reply.  It
        !           305: is not necessarily needed in the reply form if one assumes a
        !           306: reply is only provoked by a request.  It is included for
        !           307: completeness, network monitoring, and to simplify the suggested
        !           308: processing algorithm described above (which does not look at the
        !           309: opcode until AFTER putting the sender information in a table).
        !           310: 
        !           311: The target hardware address is included for completeness and
        !           312: network monitoring.  It has no meaning in the request form, since
        !           313: it is this number that the machine is requesting.  Its meaning in
        !           314: the reply form is the address of the machine making the request.
        !           315: In some implementations (which do not get to look at the 14.byte
        !           316: ethernet header, for example) this may save some register
        !           317: shuffling or stack space by sending this field to the hardware
        !           318: driver as the hardware destination address of the packet.
        !           319: 
        !           320: There are no padding bytes between addresses.  The packet data
        !           321: should be viewed as a byte stream in which only 3 byte pairs are
        !           322: defined to be words (ar$hrd, ar$pro and ar$op) which are sent
        !           323: most significant byte first (Ethernet/PDP-10 byte style).  
        !           324: 
        !           325: 
        !           326: Network monitoring and debugging:
        !           327: ---------------------------------
        !           328: 
        !           329: The above Address Resolution protocol allows a machine to gain
        !           330: knowledge about the higher level protocol activity (e.g., CHAOS,
        !           331: Internet, PUP, DECnet) on an Ethernet cable.  It can determine
        !           332: which Ethernet protocol type fields are in use (by value) and the
        !           333: protocol addresses within each protocol type.  In fact, it is not
        !           334: necessary for the monitor to speak any of the higher level
        !           335: protocols involved.  It goes something like this:
        !           336: 
        !           337: When a monitor receives an Address Resolution packet, it always
        !           338: enters the <protocol type, sender protocol address, sender
        !           339: hardware address> in a table.  It can determine the length of the
        !           340: hardware and protocol address from the ar$hln and ar$pln fields
        !           341: of the packet.  If the opcode is a REPLY the monitor can then
        !           342: throw the packet away.  If the opcode is a REQUEST and the target
        !           343: protocol address matches the protocol address of the monitor, the
        !           344: monitor sends a REPLY as it normally would.  The monitor will
        !           345: only get one mapping this way, since the REPLY to the REQUEST
        !           346: will be sent directly to the requesting host.  The monitor could
        !           347: try sending its own REQUEST, but this could get two monitors into
        !           348: a REQUEST sending loop, and care must be taken.
        !           349: 
        !           350: Because the protocol and opcode are not combined into one field,
        !           351: the monitor does not need to know which request opcode is
        !           352: associated with which reply opcode for the same higher level
        !           353: protocol.  The length fields should also give enough information
        !           354: to enable it to "parse" a protocol addresses, although it has no
        !           355: knowledge of what the protocol addresses mean.
        !           356: 
        !           357: A working implementation of the Address Resolution protocol can
        !           358: also be used to debug a non-working implementation.  Presumably a
        !           359: hardware driver will successfully broadcast a packet with Ethernet
        !           360: type field of ether_type$ADDRESS_RESOLUTION.  The format of the
        !           361: packet may not be totally correct, because initial
        !           362: implementations may have bugs, and table management may be
        !           363: slightly tricky.  Because requests are broadcast a monitor will
        !           364: receive the packet and can display it for debugging if desired.
        !           365: 
        !           366: 
        !           367: An Example:
        !           368: -----------
        !           369: 
        !           370: Let there exist machines X and Y that are on the same 10Mbit
        !           371: Ethernet cable.  They have Ethernet address EA(X) and EA(Y) and
        !           372: DOD Internet addresses IPA(X) and IPA(Y) .  Let the Ethernet type
        !           373: of Internet be ET(IP).  Machine X has just been started, and
        !           374: sooner or later wants to send an Internet packet to machine Y on
        !           375: the same cable.  X knows that it wants to send to IPA(Y) and
        !           376: tells the hardware driver (here an Ethernet driver) IPA(Y).  The
        !           377: driver consults the Address Resolution module to convert <ET(IP),
        !           378: IPA(Y)> into a 48.bit Ethernet address, but because X was just
        !           379: started, it does not have this information.  It throws the
        !           380: Internet packet away and instead creates an ADDRESS RESOLUTION
        !           381: packet with
        !           382:        (ar$hrd) = ares_hrd$Ethernet
        !           383:        (ar$pro) = ET(IP)
        !           384:        (ar$hln) = length(EA(X))
        !           385:        (ar$pln) = length(IPA(X))
        !           386:        (ar$op)  = ares_op$REQUEST
        !           387:        (ar$sha) = EA(X)
        !           388:        (ar$spa) = IPA(X)
        !           389:        (ar$tha) = don't care
        !           390:        (ar$tpa) = IPA(Y)
        !           391: and broadcasts this packet to everybody on the cable.
        !           392: 
        !           393: Machine Y gets this packet, and determines that it understands
        !           394: the hardware type (Ethernet), that it speaks the indicated
        !           395: protocol (Internet) and that the packet is for it
        !           396: ((ar$tpa)=IPA(Y)).  It enters (probably replacing any existing
        !           397: entry) the information that <ET(IP), IPA(X)> maps to EA(X).  It
        !           398: then notices that it is a request, so it swaps fields, putting
        !           399: EA(Y) in the new sender Ethernet address field (ar$sha), sets the
        !           400: opcode to reply, and sends the packet directly (not broadcast) to
        !           401: EA(X).  At this point Y knows how to send to X, but X still
        !           402: doesn't know how to send to Y.
        !           403: 
        !           404: Machine X gets the reply packet from Y, forms the map from
        !           405: <ET(IP), IPA(Y)> to EA(Y), notices the packet is a reply and
        !           406: throws it away.  The next time X's Internet module tries to send
        !           407: a packet to Y on the Ethernet, the translation will succeed, and
        !           408: the packet will (hopefully) arrive.  If Y's Internet module then
        !           409: wants to talk to X, this will also succeed since Y has remembered
        !           410: the information from X's request for Address Resolution.
        !           411: 
        !           412: Related issue:
        !           413: ---------------
        !           414: 
        !           415: It may be desirable to have table aging and/or timeouts.  The
        !           416: implementation of these is outside the scope of this protocol.
        !           417: Here is a more detailed description (thanks to MOON@SCRC@MIT-MC).
        !           418: 
        !           419: If a host moves, any connections initiated by that host will
        !           420: work, assuming its own address resolution table is cleared when
        !           421: it moves.  However, connections initiated to it by other hosts
        !           422: will have no particular reason to know to discard their old
        !           423: address.  However, 48.bit Ethernet addresses are supposed to be
        !           424: unique and fixed for all time, so they shouldn't change.  A host
        !           425: could "move" if a host name (and address in some other protocol)
        !           426: were reassigned to a different physical piece of hardware.  Also,
        !           427: as we know from experience, there is always the danger of
        !           428: incorrect routing information accidentally getting transmitted
        !           429: through hardware or software error; it should not be allowed to
        !           430: persist forever.  Perhaps failure to initiate a connection should
        !           431: inform the Address Resolution module to delete the information on
        !           432: the basis that the host is not reachable, possibly because it is
        !           433: down or the old translation is no longer valid.  Or perhaps
        !           434: receiving of a packet from a host should reset a timeout in the
        !           435: address resolution entry used for transmitting packets to that
        !           436: host; if no packets are received from a host for a suitable
        !           437: length of time, the address resolution entry is forgotten.  This
        !           438: may cause extra overhead to scan the table for each incoming
        !           439: packet.  Perhaps a hash or index can make this faster.
        !           440: 
        !           441: The suggested algorithm for receiving address resolution packets
        !           442: tries to lessen the time it takes for recovery if a host does
        !           443: move.  Recall that if the <protocol type, sender protocol
        !           444: address> is already in the translation table, then the sender
        !           445: hardware address supersedes the existing entry.  Therefore, on a
        !           446: perfect Ethernet where a broadcast REQUEST reaches all stations
        !           447: on the cable, each station will be get the new hardware address.
        !           448: 
        !           449: Another alternative is to have a daemon perform the timeouts.
        !           450: After a suitable time, the daemon considers removing an entry.
        !           451: It first sends (with a small number of retransmissions if needed)
        !           452: an address resolution packet with opcode REQUEST directly to the
        !           453: Ethernet address in the table.  If a REPLY is not seen in a short
        !           454: amount of time, the entry is deleted.  The request is sent
        !           455: directly so as not to bother every station on the Ethernet.  Just
        !           456: forgetting entries will likely cause useful information to be
        !           457: forgotten, which must be regained.
        !           458: 
        !           459: Since hosts don't transmit information about anyone other than
        !           460: themselves, rebooting a host will cause its address mapping table
        !           461: to be up to date.  Bad information can't persist forever by being
        !           462: passed around from machine to machine; the only bad information
        !           463: that can exist is in a machine that doesn't know that some other
        !           464: machine has changed its 48.bit Ethernet address.  Perhaps
        !           465: manually resetting (or clearing) the address mapping table will
        !           466: suffice.
        !           467: 
        !           468: This issue clearly needs more thought if it is believed to be
        !           469: important.  It is caused by any address resolution-like protocol.
        !           470: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>