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>