Internet Draft J. Noel Chiappa Expires: yyy xx, 2000 zzz xx, 1999 Endpoints and Endpoint Names: A Proposed Enhancement to the Internet Architecture Status of this Memo This document is an Internet Draft. Internet Drafts are working documents of the Internet Engineering Task Force (IETF), its Areas, and its Working Groups. Note that other groups may also distribute working documents as Internet Drafts. Internet Drafts are draft documents valid for a maximum of six months. Internet Drafts may be updated, replaced, or obsoleted by other documents at any time. It is not appropriate to use Internet Drafts as reference material or to cite them other than as a 'working draft' or 'work in progress.' Please check the Internet Draft abstract listing (in the file 1id-abstracts.txt) contained in the Internet Drafts shadow directories (cd internet-drafts, on ds.internic.net, nic.ddn.mil, nic.nordu.net, or munnari.oz.au) to learn the current status of any Internet Draft. This draft document will be submitted to the RFC Editor as an Informational RFC. Distribution of this document is unlimited. Please send comments to jnc@lcs.mit.edu. Extended Abstract Early work on internetworking used a minimal number of different fundamental objects in the network, and names for them; among them were "host-names" and "addresses". Experience with internetworking, along with further reflection on exactly what the fundamental objects in networking are, have resulted in two conclusions. First, early work on networking was not careful to distinguish between the concepts of an object, and the name(s) of that object. This has resulted in widespread confusion between the properties of the name, and those of the object itself. Secondly, the set of fundamental objects recognized was not rich enough. Thus, difficulties have arisen when solutions to various problems demanded that objects which were previously hidden 'inside' or 'behind' other objects be recognized as separate entities. This paper discusses these issues in detail, and, as a result, defines, and proposes explicit recognition of, a new fundamental object in internetworking, the "endpoint". It further proposes the creation of an explicit naming space, the "endpoint name", for these objects. It gives several examples of existing problems with internetworking which will be easier to solve if endpoints are explicitly recognized and named, and examines the pros and cons of a number of potential types of names for endpoints. Acknowledgments A basic analysis of naming and objects in networks which introduced the notion that explicit recognition of another important class of fundamental objects was needed was performed by Jerry Saltzer, in [Saltzer82]. In addition to this, and the other sources mentioned in the list of references, the ideas in this document have been shaped by (incessant :-) conversation with the members of the IETF, particularly the members of the Big-Internet mailing list. Space, and time to research the issue in detail, prohibit mentioning everyone who should be named here, and my apologies to them all. However, a special mention must go to Dave Oran, who pointed out to me that the objects which should be named in any new namespace in the Internet architecture are not physical hosts (as in the Saltzer paper), but more abstract entities; this lead to the creation of the "endpoint" concept. Thanks also go to several people who found the time and energy to read an earlier version of this document, and send in (gratefully appreciated) comments on the text: Brian Carpenter, Avri Doria, Robert Elz, Johna Till Johnson, Frank Kasteholz, and Stev Knowles. My apologies if I missed anyone who participated during the many years this paper took to finish off. This paper is respectfully dedicated to the memory of Bosko Brckic and Admira Ismic, and the countless others who have suffered because of the irrationality of their compatriots, in Yugoslavia and around the world. Note It is intended that before final publication, to reduce the bulk of this paper and keep it more sharply focused, most of the more generic material on general large scale network system design (contained in Sections 7 and 11) will be moved to a separate paper which is specifically about such general system design principles. This material is placed here temporarily as it is an important part of the logic behind this proposal, and it is not, so far as is known to the author, available elsewhere. 1 Introduction As mentioned, early work on internetworking used a minimal number of different fundamental objects, along with names for them, and did not always clearly distinguish between the objects and the names. An example of such an early work is [Shoch], which says: 'The "name" of a resource indicates *what* we seek, an "address" indicates *where* it is, and a "route" tells us *how to get there*.' The use of this set of terms seems to have grown out of earlier exploratory experience with networking, such as the ARPANET [Heart, Feinler]. There, "address" had a very simple and straightforward meaning, it being the concatenation of the number of the IMP the host was attached to, and the port number on the IMP to which the host was attached. "host-names" were undoubtly introduced in a fairly ad-hoc way to make the user interface more palatable. However, a crucial (and unfortunately little-noticed) paper [Saltzer82] pointed out that networking had gone astray. It pointed out both of the problems mentioned above in the Abstract: 'This confusion stems sometimes from making *too tight an association between various types of network objects and the most common form for their names*. *It also stems from trying to discuss the issues with too few well-defined concepts at hand*.' These problems are particularly true of the term "address", which is used for several different functions, as discussed below. This multiplicity of roles has led to substantial difficulties as the functionality and scale of internetworking have grown, as might be expected. However, up to this point, little or nothing has been done to attack in the Internet (i.e. TCP/IP) architecture the problems pointed out by Saltzer. As a result, this paper proposes a more limited and clear definition and use of the term "address", by picking one of the current uses and limiting the term to refer to that particular one. (The author has no illusions that this suggestion will be widely adopted anytime soon, however.) Also, as mentioned above, this paper defines a new kind of fundamental object, the "endpoint", which already exists in the internetwork, but simply has not been formally recognized. 2 Terminology of Naming and Binding Before proceeding to the technical details, it is important to understand some definitions about objects, names, and related subjects. The terms "object" and "name" are hopefully self-explanatory: it is crucial to differentiate between the thing itself, and any identifier (in the generic sense) by which we refer to it. In this paper, whenever the term "name" is used, unless otherwise explicitly indicated, the meaning given to it is the generic one of "an identifier (of no specific syntax or properties) for an object". Thus, the phrase "name of a host" does *not* refer to an existing system of printable strings (e.g "lcs.mit.edu"), or somesuch; it refers, instead, to the abstract concept of an identifier for a host. (The term "host-name" is used to refer to such printable strings, at the possible risk of some confusion, because it is of long-standing use in the networking community.) This may seem confusing (and some might suggest use of a different term for "name"), but the use of the term "name" in this manner is established in the literature (along with subsidiary terminology such as "namespace"), and while use of the term "name" has perhaps been confused in the networking community, it seems a major distraction to try and tackle that issue now. 2.1 Bindings and Namespaces The association between a name and an object is called a "binding"; bindings may also map from one kind of name for an given object, to another name. It is important to realize that a single instance of an object (i.e. a member of an "object class") may have more than one name. Moreover, each of those names may be drawn from the same class of names (or "namespace"), i.e. a many-to-one binding; alternatively, each of the names may be from a different namespace, i.e. multiple one-to-one bindings. For example, the person writing this document is an instance of the object class of humans, and has several names, from different kinds of namespaces, such as his 'name' name ('J. Noel Chiappa'), his Social Security Number (a government supplied personal identification number in the U.S.A.), etc. However, all the names refer to the same object; the author. 2.2 Structure and Representation of Names The *form* of the names in a namespace is usually driven by the use to which the name will be put. Any structure in the name is usually intended to make some operation on or with the name (be it looking it up in a directory, or whatever) easier. For example, Unix filenames and DNS names have hierarchical levels, indicated in the name, to allow them to be looked up in hierachical directories. IP addresses have structure in them to help them be routed. Names may also have multiple "representations", or ways of encoding the same individual name. For instance, the IP address "18.8.0.8" (in decimal, printed notation) is the same exact name as the bit string "00010010 00001000 00000000 00001000" in an IP packet header; they are just different ways of encoding the exact same information, just as 12 base 8, and 10 base 10, are the same number. A collection of bindings in which a system records and looks up the connections is called a "context" (sometimes loosely referred to as a "directory", although this term has other meanings). A context may either map from names for objects to a direct attachment to the object, or from one class of name for an object to another kind of name for the same object, or perhaps some other useful mapping. 3 Existing Objects and Namspaces in the TCP/IP Architecture The TCP/IP architecture did not make a clear distinction between objects and the names of those objects; it also used basically those namespaces which were in the existing NCP protocol architecture; i.e. addresses, and host-names. 3.1 IP Addresses In fact, however, IP addresses are basically the *only* name used throughout the TCP/IP architecture, however. They are: - Used directly by the routers, as the data in the packet which the routers look at to forward (i.e. process) user data packets. - Used to name the place in the internetwork (i.e. the destination) to which the packet is to be directed to; i.e. the place in the internetwork where that host is connected; this is referred to as the "network attachment point", or "interface"). - Used to name the host which is doing the end-end communication. They are the only information identifying the hosts on each end which appear in any TCP/IP packet headers. They are thus part of the identification of a TCP connection, together with a TCP port (which simply disambiguates among multiple TCP connections on a single host). As we will see later, loading all three of these functions onto a single name, and "field" (i.e. a group of bits in a packet, containing a specific item of information) in the packet, has problems (discussed below), and it is perhaps best to split these three functions up, to be performed by separate names or fields. (It should be noted that the use of the term "host" here is for ease of comprehension, and is not absolutely accurate. A more accurate term would be "endpoint", or "end-to-end entity", but this paper will defer using that very abstract term until it is more necessary for exactness.) 3.2 IP Host-Names The other existing namespace in the TCP/IP architecture is that of host-names. Host-names were, and remain, fairly peripheral in the TCP/IP architecture. Host-names are human-readable strings, which now contain built in hierarchical structure, and can be looked up in a distributed, replicated, database called the Domain Name System [Mockapetris], which maps from DNS names to IP addresses. However, this lookup is usually done as the first step in an application, which from then on uses the IP address as the 'name' of the entity it is communicating with. In fact, it is possible to open a TCP connection, indeed to run a TCP/IP application, without use of a DNS name at all. All that is really needed is the IP address. (Using the terminology above, the DNS name actually names an entry in the DNS directory; this entry has, as one of its attributes, one or more IP addresses.) 4 Problems With the Existing IP Object Naming Architecture A number of problems arise, and a number of capabilities are harder to provide, because of the fact that one name (the IP address) is used to identify two completely different things (the host and the interface). As Saltzer puts it: "One way or another, the permanent binding of attachment point name to [host] name has made some function harder to accomplish...." This is absolutely on target, as the examples here indicate. 4.1 Problems with Host Mobility For instance, a host may wish to move to a different place in the internetwork, while keeping a TCP connection open. (This facility is called "mobility", to distinguish it from the case where the host moves, but does not wish to keep any connections open, which is referred to as "portability".) This is difficult, although not impossible, in TCP/IP, as it stands. The problem is that TCP connections (and which packets belong to a given connection) are uniquely identified by the combination of their (IP_source_address, IP_source_port, IP_destination_address, and IP_destination_port). To get the packets to a different place in the network, a different IP destination address ought to be used, but if a different address is in fact used, the packets will not be recognized as belonging to that connection. Proposed techniques for supporting this facility include using the IP Source Routing option or encapsulation. Note, however, that in both of these cases, the name which identifies the host (the IP address in the useful packet) is no longer the name of the interface; that is carried either in the SR option, or in the wrapper packet. Providing the mobile host functionality has required use of two separate names for the two concepts given above. There is another ways to solve this particular problem, if we do not restrict ourselves to the internetwork layer. We could change the definition of TCP to allow a given connection to change the values of (IP_address, IP_port) (either source, or destination), and thus move to a different location. This is slightly complex to do, and leaves us without an invariant name for a connection. It also has the disdvantage that a similar mechanism would have to be created for every different client protocol of IP; a single generic mechanism would be better. More will be said about this approach after an alternative is introduced. 4.2 Problems with Other Capabilities Other examples are plentiful. Among the things which are made more difficult by the lack of differentiation between the names of host, and the interface(s) through which it is attached to the internetwork, are: mobile processes, multi-homed hosts (which present many issues, which will not be explored here in detail), and automatic address reassignment to match changing network topology (since an address hierarchy is to some degree isomorphic to the topology it names). Many of these, like mobile hosts, can be attacked via various ad-hoc mechanisms, but some are very hard. For instance, consider a mobile process, which has a TCP connection open on port X. It wishes to move from the host with IP address A to the host with IP address B. It might be possible to use mobile host mechanisms to accomplish this, but difficulties remain. First, if there were two TCP connections from host A to some distant host H, H might become confused if A had apparently simultaneously moved to B, and stayed where it was. Secondly, if some process on B *is already using* port X, a collision over that port number will occur. Again, if the transport layer could be redone, the solution of being able to change port numbers on the fly would solve this problem, but the alternative proposed here is felt to be superior. Thus, the failure to differentiate between two different classes of objects (the host itself, and the interface through which it attaches to the internetwork), along with the names for those separate objects (using the term "address" for both kinds of name) leads to a number of problems which cannot be solved cleanly in the current architecture, although various ad hoc solutions can be constructed. A case can be made that a proper solution to this entire class of problems (and more which are as yet uncovered) requires a major change, to separate these concepts. How should this be done? 5 A Better Definition for "Address" As has been noted above, the term "address" is currently used to describe a number of conceptually quite different things, resulting in confusion and poor engineering analysis. Either the term must be deprecated, or a better definition must be created and adopted. The latter is preferred here, as the term is quite popular in networking, and will continue to confuse people unless they start to use it in a non-confusing way. It is proposed that "address" be generally defined to be "the name of an interface"; the "network attachment point", remember, is the place in the internetwork where a host is connected; this usually means a network interface. The packet headers at the network/internetworking layer may carry the address, as the data item used in determining where the packets go (as do Ethernet and IP), or they may not (as does X.25). 5.1 Structure of Addresses Addresses may be effectively flat, such as in the Ethernet, or they may have built in structure, as do the addresses in all current internetworking protocols. If they have structure, that structure is usually hierarchical structure, put there to help the reduce the overhead of running the routing mechanisms in the internetwork; i.e. those mechanisms (routing protocols, etc) which distribute information on where things are in the internetwork, and compute routes from sources to destinations. At this point, it is worth noting that the addressing architecture for a internetwork usually makes provisions for naming topological aggregates as well as individual interfaces; these names for topological aggregates are usually called 'addresses' as well, so perhaps a more exact term for the name of a interface would be "interface address". As a side note, any such structure in the addresses must be basically purely related to topology. The temptation is great to make it also related to administrative concerns, but for the structure to be useful in helping reduce the overhead of the routing mechanisms, it must defer to actual topology first, and administrative boundaries only secondarily. However, a full exploration of the topic of structure in addresses, and how this structure is used by the routing architecture, is a complex one which is beyond the scope of this paper. (See [Chiappa95] for a fuller exploration of this topic.) 5.2 Abstract Definition of "Address" This definition seems precise, but there are peculiar instances in which it is not quite adequate, as a result of which an alternate, somewhat more abstract definition is also provided. A sample problematic case comes with a computer running a 'virtual machine' operating system. Does each virtual machine have a separate 'address' or not? This depends on exactly what virtual configuration is modeled by the operating system; one model is that there is a virtual network inside the computer, to which each virtual machine is attached through a virtual interface, with the operating system containing a virtual router which forwards packets through in each direction. Other models are possible, such as the different virtual machines all sharing an interface, and the traffic being disambiguated using some sort of names for the individual machines; however, the first is the most transparent. Another case comes with some switching fabrics, where a number of otherwise totally independant hosts may share the same physical wire to the network. Does this interface (i.e. the wire) have one 'address', or several? To the extent that the local network header has to contain a different 'destination physical address' to get traffic correctly to each of the various hosts, it is clear that each host has a different address. Thus, the exact definition of "address", at least in an internetwork with routers, ought to be "the name of a place to which the 'last hop' router will deliver a packet", or, more formally, "the name of a network connection entity to which the system of routers will deliver a packet". 5.3 Other Terminology We noted above that there are several different meanings for the term "address", currently. We have proposed restricting the meaning of the term "address" to correspond, more or less, with the second. We thus need terms for the other two. One term that has been proposed for the first, which is the field in the packets that the routers look at to forward user data packets, is "selector". This term actually has a slightly broader meaning than "address", in that it refers to *any* field in the packet which is used by the routers to decide where to forward the traffic to. Thus, in an virtual circuit architecture, the "connection identifier" field in the packet is the selector. Datagram architectures conventionally use the address as the selector, but this may not always be the case. The other name which is needed is a name for the host which is doing the end-end communication. This is the topic of the rest of this paper. To recap, however, a "network attachment point", or "address", is (or ought to be), in order of increasing formality: - the name of an interface to the (inter)network - the name of a network attachment point - the name of a place to which the 'last hop' router will deliver a packet - the name of a network connection entity to which the system of routers will deliver a packet 6 A New Fundamental Object, the Endpoint Up until now, this paper has assumed that the fundamental object (other than the interface) which should be named was the host. This is a fairly obvious choice; everyone has a good idea what a host is. Also, it is clear that for functionality like mobile hosts, the host is the other kind of object which needs a separate namespace, distinct from the place where it attaches to the internetwork. This turns out to not be the best choice. There are instances in which having a host be the other fundamental object does not turn out cleanly. For instance, in a system with mobile processes, which can move from host to host while keeping reliable connections open, it can be somewhat tricky, as noted above, to keep straight which connections go where. A more abstract object, drawn from the philosophical design base of internetworking, seems to actually be the best choice. This is the "endpoint". What exactly is an endpoint anyway? 6.1 Endpoints and End-End Design The case has been made that many functions of network communication, such as reliability, can only be implemented on an "end to end" basis, i.e. between the ultimate source of the data, and the ultimate consumer. [Saltzer84] puts it concisely: "The function in question can completely and correctly be implemented only with the knowledge and help of the application [entity] standing at the endpoints of the communication system." An "endpoint" is thus defined as one participant of an end-end communication; i.e. the fundamental agent of end-end communication. It is the entity which is performing a reliable communication on an end-end basis. In most circumstances, this concept maps in a fairly direct and straightforward way to the concept of "host". (I.e. if this definition is a little too abstract to be useful in thinking about endpoints, just substitute the concept "simple host" in whatever scenario was being considered.) There are circumstances, however, such as mobile processes, when an endpoint is clearly not a concrete object like a host, but a more abstract construct. Note that an "endpoint" is a purely networking concept. Many people, in trying to think about endpoints, try to use existing fundamental concepts from elsewhere in informations systems, such as "process", and attach the term "endpoint" to them. This is wrong. Concepts such as "process" are operating system concepts, and name fundamentally different things. There might in *some circumstances* be a mapping from endpoints to processes, or from endpoints to hosts, but it's not universal. An endpoint is a new concept, a fundamental object of networking, and *requires* an independent existence. 6.2 Endpoints and Fatesharing An alternative way to characterize endpoints uses the design principle of "fatesharing" [Clark]. Fatesharing is a concept of internetworking which states that the most robust design occurs when the "critical state" (i.e. non-replaceable information about the status of the communication between two end-to-end entities) is co-located with the end-to-end entities themselves. As that paper puts it: 'The fate-sharing model suggests that it is acceptable to lose the state associated with [the communications of] an entity if, at the same time, the entity itself is lost.' To put it more crudely (in the military environment which provided some of the impetus for the design of TCP/IP), it doesn't matter if the connection information is vaporized, if the application which is using the connection is necessarily vaporized at the same time. An "endpoint" may thus be alternately viewed as a "fatesharing region"; i.e. a boundary drawn around a set of state and/or computations such that it lives or dies as a unit. Note that each process running an application might be seen as an independant endpoint, since processes are the entities which are communicating. Also, processes, and the state associated with them, can normally be terminated individually. However, in most operating systems (virtual machine operating systems, and system which support mobile processes are exceptions), the division of the state in the system is not clean enough to fully apply the "fatesharing region" analysis given above, showing that the processes in this system are not true endpoints. In a similar vein, some application might decide that, for the purposes of providing a high-reliabilty and/or high-availability service, it wishes to provide for reliable replication of state across redundant server machines, so that the failure of one machine can be completely hidden from the clients of that service. (We will leave aside questions of whether this is the best system-wide way to provide that capability.) To the extent that a single end-end entity, and a single fatesharing region of state, encompass several machines, that group of machines could be thought of, and named, as a single endpoint. Again, note that an "endpoint" is a purely networking concept, and cannot be mapped directly to a concept from elsewhere in informations systems, such as "process". There might in some circumstances be a such a mapping, but it's not universal; endpoints are a networking concept, and have to be understood on their own. 6.3 Endpoints and Transport Protocols Note that a single endpoint has, from the point of view of the network, effectively all the functionality that a host has now. I.e. it can have multiple connections in a given transport protocol (e.g. TCP); it can also have a number of separate transport protocols (e.g. TCP and UDP). An endpoint is not just one TCP connection, or one transport layer; it is the entire TCP, with all its open connections, other transport protocols, and everything else that is currently thought of as being in a host. Thus, for example, the the TCP port is still used in exactly the same fashion as previously; it is used to distinguish incoming packets for the multiple TCP connections a single endpoint can have. A given TCP connection is globally uniquely identified by the combination of source endpoint and port, and the destination endpoint and port. To recap, however, an "endpoint" is, in order of increasing formality: - one participant of an end-end communication - the fundamental agent of end-end communication - the entity which is performing a reliable communication on an end-end basis - a fatesharing region - a boundary drawn around a set of state and/or computations such that it lives or dies as a unit 7 The Layer Model of Data Communication Systems Before moving on to see where this new concept ought to fit in the protocol architecture, it is necessary to examine the concept of layers in some detail. It has been commonplace for some time now to define complete networking and internetworking systems in terms of layered models. The ISO reference model is one such. [ISO] However, it is unwise to keep the reference model static over a long time (in terms of number of layers, and what functionality is at each layer), since this will limit the natural development of the overall functional partitioning of data communication architectures, as more understanding and experience are gained. 7.1 A New Layer Model In actuality, the layering of internetwork architectures is not a simple ladder, but a more complex stucture. Many different local "network" layers appear underneath a single, ubiquitous, "internetwork" layer which provides an absolute minimum set of facilities which must be provided uniformly, on a system-wide bases. More importantly, above this rests a tree of "transport" and "application" layers, with each layer from the "internetwork" layer on up supporting multiple client layers. Note that this paper does not follow slavishly the ISO model, which does not distinguish "network" and "internetwork" layers below "transport". As noted above, such rigidity can be detrimental to discussion, evolution, and understanding of new communication architectures. This modified model, and terminology, provide a clearer set of terms for use with the latest developments in communication systems. The functional difference between the service model of the network layer and the internetwork layer is minimal; they both provide an unreliable datagram service. The difference is the scope of that service; a network layer is inherently limited in scope, usually to one particular infrastructure technology, such as Ethernet or X.25. An internetwork layer is explicitly created to provide a uniform service interface across many different infrastructure technologies. 7.2 Layering and General System Modularization Principles This tendency to use designs which are basically layered, but with multiple potential clients of most layers, may be easily related to general system design principles. Most system architecture work is done by using functional division into modules, and, moreover, modules in which dependency loops are avoided. [Schroeder, Dijkstra] The structure of the typical internetwork architecture is thus seen as nothing more than the application of this software system design principle to the protocols of the distributed system which is the network. To recap, however, the layer names used below in this paper are: "network" - all mechanism pertaining to a single communication network which is not convered by the "physical" and "link" layers; examples are the MAC layer in 802.5, and the call signalling of X.25. "internetwork" - the layer immediately above the network layer, the layer which is responsible for delivering packets, unreliably, from one place anywhere in internetwork to another. "transport" - the layer immediately above the internetwork layer, which is usually responsible for providing the appropriate level of reliability for the end-end channel. 8 Which Architectectural Level is Appropriate for the Endpoint Within this layered model, however, the question arises as to at which layer should endpoints appear? The two most obvious possibilities are either the internetwork layer, or the transport layer. It seems fairly obvious that the correct answer is the internetwork layer, for a number of reasons. 8.1 Why the Internetwork Layer? First, if it is decided to add support for explicit naming of endpoints, this allows the naming of endpoints to be provided once, rather than needing to replicate it for each transport layer. There does not seem to be any need for the flexibility of allowing different transport layers to define their own endpoint namespaces. Moreover, a single endpoint name can then be used to refer to an entire collection of transport communications, using different transport protocols, all of which may be associated with a single actual endpoint. The entire set may be dealt with as an aggregate, e.g. for purposes of changing the address to endpoint name binding. Second, any mechanism provided using the address to endpoint name binding is thus available to all transports. For example, if it is decided to support "visible" mobility (i.e. mobility in which the non-mobile entity is aware that the other end has moved, e.g. to prevent "triangle" routing through a base station) by the ability to change the endpoint-address binding, this basic mobility mechanism, once implemented at the internetwork layer, would automatically be available to all transport layers. Numerous other applications for using an address to endpoint name binding hidden in the internetwork layer exist, such as support of multi-homed hosts (i.e. ones with more than a single interface, and thus, even in the current system, more than one address). Finally, the internetwork layer has the job of carrying packets, unreliably, from one entity to another in the internetwork. The transport layer communicates between fate-sharing regions, i.e. endpoints. If the transport layer is to be simplified as much as possible, and know only of endpoints, then the entities the internetwork layer deals with, as far as its clients are concerned, ought to be endpoints. In short, they are at the internetworking layer to allow the binding from the interface to the endpoint to be examined or changed in that layer. If one wants to be able to pick up a transport layer connection and move it to a different place, invisibly to the transport layer, it has to happen *below* the transport layer. 8.2 Use of Endpoints in the Internetwork Layer This does not mean that endpoints are ubiquitous in the internet layer; e.g. routing is not concerned with them. It is perfectly appropriate to visualize the internetwork layer as being split into two sub-layers, one of which, the lower, knows only about interfaces and addresses, and the higher of which knows about endpoints as well, and maintains the binding between interfaces and endpoints. Alternatively, one can visualize endpoints and their bindings as residing in a "shim" layer which is interpolated between the existing internetwork and transport layers. This option is discarded since layers should only be inroduced when needed, and there does not seem to be a major utility in being able to use the internetwork layer without dealing with endpoints. If needed, a special endpoint name meaning "the internetwork layer at this address as a whole" could be defined to serve that purpose. It thus seems that the appropriate layer to know about the address to endpoint name binding is the internetwork layer. 9 Namespaces for Endpoints Having decided that we need to recognize endpoints, and name them, the next question is "what should the names of endpoints look like"; i.e. how many namespaces do we need for endpoints, and what do those names look like. To answer that question, it is necessary to answer the question of what these names are going to be used for. Remember, "the form of the names in a namespace is usually driven by the use to which the name will be put". Unfortunately, there is no clear answer to the question of where, and how, these names are going to be used. Moreover, several potential uses have requirements which are effectively diametrically opposed, so perhaps there is no single namespace that will do what we want. Instead, we might have multiple namespaces for endpoints, each with different characteristics that suit them to different uses. If so, presumably there would be in addition some system to map from one namespace to another. 9.1 Useful Characteristics of Endpoint Names Some likely useful characteristics of endpoint names, and the ramifications of those characteristics, will be explored first. 9.1.1 Global Uniqueness One likely important characteristic of at least one kind of endpoint name eventually adopted is that they are unique (i.e. no two endpoints anywhere in the network can have the same name). This uniqueness can be ualified in two ways: spatial and temporal. The first refers to the scope over which a name is unique, and means that at any given time, no two endpoints with identical names are active. The second refers to the time period over which the uniqueness of a name is valid, and at the extreme, no two endpoints can ever be referred to with the same name. The former seems more useful, but the latter is potentially useful as well. If the system will not function correctly if two endpoints with identical names exist, then ensuring uniqueness is an especially important goal. This is the characteristic of endpoint names which may present the most difficulty. It is important to understand that the system should not depend on the assumption that two endpoints with identical names do not exist. Such a condition is bound to occur sooner or later, either through human error, faulty software, or some similar cause. Should this happen, the system must detect it, and call attention to it, so that it may be corrected. Should the system fail to do so, it would probably either fail in some hard-to-understand way, or, even worse, continue to function, but erratically, without detecting that there is a problem. So, the system must detect this failure in cases where it would be a problem, but it is not necessary to provide an automated solution, if it happens rarely enough. A number of strategies exist for ensuring this uniqueness. One is to require that all endpoint names be registered in a directory; if an endpoint attempts to check to make sure that its name is registered, and another endpoint is already registered with that name, the newcomer can detect a problem right away. Another strategy is a probabilistic one. If the namespace for endpoints is very, very large, then if an endpoint randomly chooses one to use for itself, the chances that it has picked a duplicate name are very small. The possibility of failure should not concern anyone, since, as pointed out above, duplicate endpoint names are likely to be encountered *anyway*. In the low-probability event that a duplicate name is picked, the mechanisms to handle duplicates caused by error should handle this case too. 9.1.2 Topological Insensitivity Another important characteristic of an endpoint name, for most purposes, is that it ought to be "topologically insensitive"; i.e. it does not depend on the location of the endpoint in the network. In particular, it ought to stay the same if the endpoint is detached from the network and re-attached to a different place on the network. If the name is linked to its location in the network (as an address is), then if an endpoint moves to a new location (either because of mobility, or because of a change in service provider, or whatever), and thus receives a new endpoint name, without a more complex mechanism it will be impossible to tell that it is the same endpoint. It is possible to work around this, obviously, but it does introduce complexity. The advantage (in simplicity, etc) of having one name which is invariant when an endpoint moves is one of the chief advantages of naming endpoints, so it would be extremely foolish to discard it. 9.1.3 Portability This is closely related to, but not exactly the same, as topological insensitivity. It means that the endpoint can move from machine to machine in the network. For example, it a particular machine has two endpoints associated with it, and it is desired to move one endpoint to another machine, unless the scheme for naming endpoints allows one to be disassociated with its "host" machine, and associated with a new one, this will not be possible. 9.1.4 Local Creatability In some circumstances, operational considerations make it likely that a useful characteristic of endpoint names (and endpoints) is that they can be created locally, without reference to a central endpoint name allocation authority. To put it another way, it is useful to be able allocate as many new endpoint names as you like, without ever having to go back to a central registry to get more. 9.1.5 Anonymity There are circumstances in which it is desirable to have endpoint names which are anonymous; i.e. there is no way for one entity which is communicating with a remote entity to find out anything about the remote entity. All the first entity has to identify the remote entity is a endpoint name which, while it can be used to identify the remote endpoint, and communications from it, cannot be used to find out anything more about the remote entity. 9.1.5 Distributed Catalogueabilty Another likely important characteristic of any globally unique endpoint name is that these names probably, but not necessarily, ought to be a form that can be catalogued and looked up; i.e. a binding from the name to other useful information is easily found in some sort of distributed database of these bindings. It is generally useful to have, somewhere in the architecture (often at a low level), names which can be used (i.e. turned into useful information) without any further reference to a catalog (e.g. hardware network addresses), although this can be worked around, of course. For instance, a name might come with a list of addresses for repositories of bindings in which it can be found; this is both inconvenient (for human use), as well as having the disadvantage that the utility of the name will degrade as those addresses become invalid, either because the repository is no longer there, or because the repository no longer contains correct information about the bindings of the name. 9.1.6 Embedded Organizational Affiliation Another characteristic suggested for endpoint names is that it be possible to tell, from looking at the endpoint name, what the organizational affiliation was. It is not clear how useful this is. Since this is only one attribute about a name, and, equally, one that could be kept in a catalogue, as one of many attributes of a name, this is probably not the best use of structure in an endpoint name. The most appropriate use of structure in a name for use in a large-scale communication system is to help with finding the name in a distributed catalogue. This structure might indicate organizational affiliation as a side-effect, but that is secondary to the main goal, finding the entry in a catalogue. 9.1.7 Fixed Length This is a final potentially useful characteristic of endpoint names, but it is a syntactic attribute, rather than a semantic one, and thus rather less important. Obviously, software for fixed-length fields is slightly easier to write than software for variable length fields, and potentially more efficient. However, using a fixed length has proven in the past to usually be painful, and the benefits of such a limitation would have to be weighed most carefully before it could be accepted as the best choice. Obviously, not all of the characteristics in the lengthy list above have to be met, and some are potentially in conflict - e.g. 'local creatability' and 'fixed length' almost certainly conflict. Some that seem to be in conflict are not necessarily so - for example, 'anonymity and 'catalogueabilty' might seem to be in conflict, but it is easy to provide both, by having part of the namespace that is anonymous, and part which is catalogued. However, the more of these characteristics that can be provided, the more powerful and useful the namespace will be. 9.2 Potential Uses of Endpoint names Here are some potential uses for endpoint names, along with the implications for the form of endpoint names. 9.2.1.1 Unique Identification of Endpoints The most obvious use of endpoint names is to globally uniquely identify endpoints in some transaction. That is, two participants in a conversation can be sure that the identity of the entity of the other end is what they think it is, if endpoints are globally uniquely named. (There does not seem to be any reasonable use for endpoint names which are not globally unique, in terms of simply identifying endpoints.) This is particularly true of long-lived communications; they can be sure that the identity of the other end remains constant, even if the endpoint moves, etc. Communications relating to dealing with the fact that one end is moving will be made simpler if there is an invariant name for the entity that is moving, one that stays the same for the entire time. 9.2.1.2 Form of Names for Unique Identification Other than the characteristics of topological insensitivity, and global uniqueness, names with a variety of characteristics are suitable for this use. One question that would need to be answered immediately about these names is whether or not they would be used directly by people. It is desirable to have, somewhere in the overall design, names which are amenable to human use; people may pass these around 'out of band' to inform other people of the 'location' of useful things. (If it seems from this text that the author views the needs of humans as somewhat less important, in the long run, than the needs of the machines, there is perhaps some truth to that! :-) It is not clear if endpoint names, even ones used for long-term identification of endpoints, need to have this characteristic. Perhaps some other namespace will be the one used by humans, and endpoint names can be looked up, when needed, from these names. If the endpoint names are not directly human-usable, probably those names will be the ones that can be looked up in a directory, and the endpoint names will not need to have that capability. 9.2.2.1 Endpoint Names in All Packets Another possible use is to put them in the headers of every packet, to identify the endpoint for which a given packet is destined. Thus, when the packet gets to the eventual destination interface, if there are multiple endpoints at that interface, the packet can be delivered to the correct one. Note that the routers would not generally make decisions about what path to send a packet along using this field, since it is assumed that such names are not topologically sensititive. (It was at one time thought that thes endpoint names might usefully form part of the names of flows, but later developments appear to reduce the chance that this is useful. [Castineyra]) Note, at this point, that whether or not the packets include addresses is a separate question; as addresses must, of necessity, be variable length, and include a lot of structure, there are good reasons for proposing designs (e.g. flow-based forwarding systems) in which addresses are not included in most packets. Further discussion of this topic is beyond the scope of this paper, however. 9.2.2.2 Form of Names for Inclusion in All Packets This use would tend to lead towards names that are as short as possible (since they will be present in every packet, and thus represent overhead), and fixed length (to ease processing costs, again since they are always present). The first question that would need to be answered here is whether or not these names would be globally unique or not. Unlike the identification function mentioned above, names with a smaller scope could perform this function as well as fully globally unique names. As long as the packet can be fairly reliably delivered to the scope in which the non-globally unique name can be correctly resolved, global uniqueness is not needed. Obviously, names which are globally unique are potentially more useful, but have the disadvantage that they would have to be longer, in addition to which we would need a more complex allocation mechanism, particularly if they were to be reliably globally unique. If we did have non-globally unique names for endpoints in packets, we would probably still need some globally unique names (such as the one referred to above), and a mechanism to allocate the locally-unique short ones, and map from them to the globally unique ones. 9.2.3.1 Endpoint Names in the Checksums of All Packets If one important function of endpoint names is to make sure that packets have arrived at the endpoint for which they were destined, there is an interesting technique for providing this functionality, without actually including the names in each packet, with obvious ramifications for the form of the endpoint names (i.e. relaxed constraints). There is a technique which allows one to 'include' a data item in a packet without actually having a field containing the data item be present in the packet, if that data item is the same for every packet of a given connection. That technique is to include the data item in the "pseudo-header"; i.e. a header which is not actually present in the packet, but which is constructed at the endpoint on each end, as part of the computation of the end-end checksum. [Postel80] In the pseudo-headers used to date, all the items used in the pseudo-header actually occur in each packet, and in simplistic implementations the contents are copied into the pseudo-header for each incoming or outgoing packet, before computing the "partial checksum" of the pseudo-header. (Unless the pseudo-header is physically located in memory immediately preceeding the actual checksummed area of the packet, it is first necessary to compute an intermediate checksum result for the pseudo-header, and feed that intermediate result into the computation of the full checksum on the actual packet.) An obvious optimization is to compute the partial checksum for those parts of the pseudo-header which are normally invariant for the life of the connection (such as addresses, protocol, etc), and save that, to save recomputing it on each packet. The obvious next step is to have that pseudo-header include items (such as endpoint names) which are not actually in each packet. No computational per-packet overhead is incurred by adding these items, but if a packet is received with an end-end checksum computed with 'incorrect' values for these items (i.e. not what the receiver expects), it will fail the end-end checksum on the receiving end. If we take the simple step of saying that endpoint names are exchanged when the connection is set up, then we can specify that the pseduo-header used in computing the end-end checksum of data packets include the endpoint names. That way, if a packet arrives, somehow, at the incorrect endpoint, if the packet is not rejected for other reasons before it arrives at the checksum routine (for an invalid port number, say), the checksum calculation will reject the packet. It may seem a bit bizarre, that the checksum is being used to cover items that are not actually transmitted, but it is quite functional. One might argue that there is a slight loss of reliability, since in the current pseudo-header, the data item is effectively 'in' the packet twice; once as the actual fields, and once folded into the checksum. In this scheme, the endpoint names are only included once, and in a compressed version, to boot. They are therefore more susceptible to undetected errors. This is, strictly speaking, true, but closer anlysis shows that this is actually not very likely. The chance of a packet arriving at an incorrect endpoint, but one which both i) still gives the correct checksum value (when the checksum is computed with the wrong endpoint name in the pseudo-header), and ii) in which the packet appears to be a valid packet for an open connection on that endpoint (i.e. port and sequence numbers, etc match) is still a lot smaller than the chances of accepting a damaged packet which is actually for that connection, but one which still produces the correct checksum. Thus, if the risk of undetected data errors is seen as acceptable, then that event is still more likely than failing to detect a packet arriving at an incorrect destination. 9.2.3.2 Form of Names for Inclusion in Checksums One major advantage of this technique is that one could then use endpoint names, for reliable identification purposes in each packet, without the overhead of carrying the names in each packet. This would allow such things as much longer endpoint names,and variable length names, that would not be as plausible if the full endpoint name were included in each packet. So, this tends to remove limits on the form of endpoint names, while not much reducing their utility. As a side benefit, as mentioned above, if the items included in the pseudo-header which are invariant over the life of the connection are put together, one can precompute the partial checksum of those items at the time the connection is opened, and avoid the overhead of computing that partial checksum on all packets. This is particularly true of variable length names, which are slightly more expensive to handle. Thus, variable-length names (always preferable for their flexibility) could be added, at no per-packet overhead cost. 9.3 Other Characteristics of Endpoint Names One question that arises is whether a single endpoint could or would have more than one endpoint name. It seems fairly unusual that a single endpoint would need more than one EID. The whole concept of an endpoint is that it *is* indivisible, so it's not as if the endpoint is going to split in two, and each half needs a distinct name to take away with it, or anything like that. Still, it might be useful to allow an endpoint to have more than one endpoint name, so that it can masquerade as multiple endpoints. Perhaps there are in fact circumstances in which it might be useful to relax that, just as there are cases in which we allow one interface (the object) to have more than one address (the name for the object). One possibility which has been mooted is for use with multi-level secure systems which, will probably need an endpoint name per sensitivity level, if someone decides to get serious about security. Security concerns might dictate a separate name for each level, although looked at from a fate-sharing viewpoint, the system would still be a single entity. The disadvantage of having several endpoint names for one endpoint is hopefully obvious; if one has one endpoint, and two endpoint names, one can't tell by inspecting the names that they refer to the same endpoint. The other case of non-one-to-one mapping between endpoints and endpoint names, i.e. of having two endpoints with one name, is not at all desirable. One cannot differentiate between the different endpoints based on the name. (This does not cover such things as the redundant server machine example given above.) 10 Some Examples of Endpoint Names With the above background as a guide, we can now look at some of the types of names that have been suggested for use as endpoint names. It is not clear at this point which namespace, or combination of them, is the appropriate selection. More needs to be fully decided about the rest of the system, and what the endpoint names would be used for, before such a determination could be made. However, some of the candidates which have been discussed at greater or lesser length can be detailed here. 10.1 Addresses One obvious suggestion is to name endpoints from the same namespace as interfaces; i.e. the address namespace. This is probably not a good idea, going back to the concept that "the form of the names in a namespace is usually driven by the use to which the name will be put". The names for interfaces (addresses) are structured to be used by the routing; i.e. they have a hierarchical structure which is visible to many of the entities which use the routing. The hierarchy is related to the actual topology of the network. They are not densely allocated (since they are set up to allow growth without renumbering). In many ways, the form of addresses is driven by the requirements of the uses to which they will be put, and these requirements are almost certain to be, in many ways, exactly opposite to those of addresses. Additionally, addresses are topologically sensitive, whereas an explicit goal of endpoint names, mentioned above as highly desireable, is to *not* be topologically sensitive. While it would be possible to define part of the address space to not be topologically sensititve, it seems an inevitable source of confusion. Better to keep the two well separated. With this in mind, all of the other suggest endpoint namespaces have the characteristicthat they be topologically invariant. (This is only really useful for the globally unique names, since the utility of topological invariance for names with only limited scope is limited; they provide mobility, etc, but only within that limited scope). 10.2 Endpoint Identifiers (EID's) An EID is an endpoint name which is fixed length, 'shortish' (i.e. 48 to 64 bits or so, enough to provide globally unique names for some time to come at modest usage rates), globally unique, and topologically insensitive. The 'shortish' attribute comes from the fact that they would be included in all packets, so examination of a packet would show the globally unqiue identity of the endpoint to which the packet is destined (and probably its source as well). One issue to note with EID's, particularly smaller ones, is that they do need an allocation system; some sort of administrative structure to allocate them. As an aside, such an allocation structure might well provide structure in the EID's themselves that could be exploited in a directory of EID's, to allow occasional EID->something translations. This should not be difficult to manage; we have a mechanism to allocate unique 32-bit numbers now, ones that necessarily have more structure in them than EID's do. If addresses are asssigned by some more automatic system (which is what needs to happen for them anyway), the existing number allocation system could be used for EID's. The other issue with EID's is the fixed length. This has a number of ramifications, above and beyond the issue of running out of them. For instance, it would probably be difficult to arrange to local creation of EID's, to use in identifying sub-computations. 10.2.1 IPv4 Addresses as EID's One possible example of an EID is to reinterpret the IPv4 address as an EID. This was, in fact, the case in the scheme which was the original motivation for EID's - one which allowed interoperable migration of IPv4 [Postel81] from an 'address based' paradigm to an 'endpoint-name based' paradigm, as part of a deployment of a new routing and addressing architecture for IPv4. [Chiappa91] The basic concept was that the 32 bit 'address' fields in the IPv4 packet, and the names in them, would be reinterpreted as endpoint names; EID's. This would allow definition of an entire new addressing structure and namespace, one with a syntax, scaling and organization more suited to use with routing in a global-scale communication network with flexible capabilities (such as support for Quality-of-Service, etc). [Little] The new routing and addressing system could then be deployed as an adjunct to the existing internetwork layer. Once that was done, it would be easier to replace the rest of the original internetwork layer, if and when that became desireable, since there would be a major piece in common between the old and new; the routing and addressing architecture. The EID concept actually killed several birds with one stone here. First, it would provide an interoperable deployment path for a new routing and addressing architecture; no host modifications of any kind were *required* before the new system could be deployed. Second, it would upgrade the basic architecture by separating out the addressing and endpoint naming functions. Third, and very importantly, it would also extend the lifetime of the existing IPv4 packet format. This is because a fixed-size space used for unique names will provide, in practice, many more names than a space of similar size used for structured, topologically-sensitive names (i.e. addresses). The namespace utilization (i.e. the ratio of the number of actually used names, to the number of theoretically possible names) is poor with addresses, because of the large amount of structure they need. For instance, it's very hard to use a fixed size namespace well, since some branches of the address hierarchy are denser than others, and in the less dense branches, space is not utilized well. Even without this effect, if the branches are all equally well populated, the cumulative inefficiencies of a multi-layer addressing hierarchy are substantial. For instance, in a hypothetical addressing hierarchy where there are five levels of abstraction, and each level manages a 30% utilization rate (not bad, for addresses), then the overall utilization efficiency is less than 1%. On the other hand, unique ID's can be allocated more in a serial manner, which can lead to very dense utilization. If the space is allocated in small blocks, in serial fashion, it can be assumed that, on average, extremely high utilization is obtained at the time the namespace fills up. The calculation is identical to the calculation of the utilization of disk space, allocated in blocks: if an average name user has N blocks of names, then all but the last are full, and, on average, the last will be half full. Thus, the utilization will be (N + 1)/2N. It does not take a very high average number of namespace blocks per name user to asymptote to effectively 100% usage. Of course, very large users may allocate more than one block at once, which would reduce the utilization, and there might also be a hierarchy of allocation authorities, which would have the same effect. However, careful tuning of the block size at each level in the distribution system (to balance between unused space, and the overhead of going back to the next higher level of allocation authority for another block) should minimize this; the usage will sill be very high, compared to addresses. Thus, given the denser utilization of the limited size IPv4 32-bit namespace, this would dramatically extend the lifetime of IPv4, and with much less disruption to the hosts. By making the 32-bit fields and names into EID's and allowing maximum utilization of the namespace, IPv4 could support, more or less unchanged, up to perhaps 10^9 hosts (assuming 25% utilization of a flat namespace, which should be reachable with reasonable allocation policies); this is a *lot* of hosts. The ramifications of this extension of the lifetime of IPv4 on the overall process of evolution of the network architecture are beyond the scope of this paper, but it would obviously provide a lot of time to investigate, design, experiment with, and modify, more advanced successors to IPv4. 10.2.2 IEEE 48-bit Interface Addresses as EID's Another possible allocation mechanism that has been suggested is to use an existing space of unique names, such as the IEEE 48-bit physical interface naming space. Use of this particular namespace does present some problems, such as: how to deal with the duplicate numbered interfaces which occasionally crop up; what to do when an interface, with embedded number, is moved from one machine to another; etc. It does provide a source of relatively unique numbers which needs no further organizational support, though. 10.2.3 Part of the IPv6 128-bit Addresses as EID's Another option which has been examined at some length is the possibility of specifying that part of the IPv6 address be used as an EID. [O'Dell] The GSE proposal includes a number of ideas that are not related to the thrust of this document though, in particular the idea that the information about the location of the host, and/or information related to the path to be used to get to it, be inserted by border routers as the packets leave the local region. 10.2.4 Utility of EID's as Endpoint Names It must be understood, when evaluating the utility of EID's as endpoint names, that a great deal of their charm arose from their ability, if the option of reinterpreting IPv4 addresses as EIDS was chosen, to i) provide an interoperable deployment path for something that was a radical change to the existing internetwork level architecture, something which is a substantial accomplishment, and ii) extend the lifetime of the existing packet format to the maximum degree. However, one should not lose sight of the fact that the mode of operation here, in which endpoint names appear in full in every packet, and the names have the characteristics of EID's, in the end represents an answer to a very restricted question; how to work within an existing design. If one were to design a complete communications architecture from scratch, one might well find that an alternative namespace for endpoints is actually superior. 10.3 Endpoint Selectors (ESEL's) ESEL's, again, are endpoint names which would be present in all packets. However, unlike EID's, they are not globally unique, but only unique in some more local scope. This would allow them to be shorter, and, also, probably somewhat easier to allocate. At one extreme, ESEL's would only be unique at a given interface address. The names could thus be fairly short, say a byte or two. While not providing a globally unique name, they do allow for several endpoints to be co-located, and for incoming packets to be demultiplexed between them. Other methods are available to do this, however, including use of flow-identifiers to direct packets without other endpoint identification to the appropriate endpoint. Obviously, if ESEL's were used, and several different endpoints were at a given address, some out of band mechanism would be needed to inform a given distant entity what the ESEL was for a particular endpoint that that distant entity wished to communicate with. It would probably not be useful to store this information in the DNS, as it is likely to be too dynamic. 10.3.1 Reuse of Existing Fields as ESEL's One interesting variant on the ESEL idea is to effectively reuse existing fields to provide ESEL functionality; the most obvious example is the TCP port. If a single host support more than one endpoint, and the selection of which endpoint is actually desired is accomplished by passing a full endpoint name at the time the connection is opened, from then on incoming packets can be directed to the correct endpoint by use of the port. Of course, this has the potential to conflict with the portability characteristic, in that that port may already be assigned on a distant host. However, a mechanism which can inform the far end of the connection that other end has moved to a new machine could also give it the new port. 10.4 Domain Name System (DNS) Names An obvious, ready-made, namespace for endpoint are DNS names. These have the advantage of being an existing system, with an allocation system all worked out. Among other advantages of DNS names, since they are variable length, and composed of a variable number of levels, there is no danger of running out of them, and new ones can be allocated locally by appending some locally unique identifier to the DNS name of the entity creating the new endpoint name. They would probably not be suitable for inclusion in each packet, of course, at least not directly; this would limit their ability to be used as demultiplexors. However, an additional ESEL field in the packets would provide this capability; the full DNS-type endpoint name would still be used both at the time the connection is set up, and in the end-end checksum pseudo-header. 10.5 Public Keys One interesting idea for what endpoint names might look like comes to light when it is considered that in the network of the future, it will be necessary to have encryption keys, or other "secrets" (a term for any information which is held privately) for use in authentication. For an entity to simply have a globally unique name is not enough; any other entity can masquerade as that entity by simply knowing that endpoint's name. Use of public-private key systems (where non-symmetrical keys are used for the encryption and decryption process, and one is known publicly, and the other known only to the 'owner' of the key-pair) provides an obvious source of endpoint names; the public keys. One big advantage of using these is that rather than needing to associate a public key with an endpoint name (a process needing a mechanism that is in itself a point of attack, let alone extra complexity), one data item serves two purposes, indivisibly. Also, these keys are large enough that the resulting namespace is large enough that collisions are, for all practical purposes, impossible. (Since a name collision would imply that either party can read the other's confidential material, a name collision here has other negative consequences as well!) These names do have several disadvantages: since they are effectively randomly scattered across the namespace, it will be difficult to use these names in a catalog, and they are probably too long to use directly in each packet for endpoint identification If private keys are used, it is critical that any fields containing them *not* be fixed length. Either of two circumstances might call for changing the length; the key length may need to be extended, to keep the effective real-time computational difficult constant over time, or because an algorithm has been broken, and a replacement needs a different key size. 10.6 Uniform Resource Names Uniform Resource Names (URN's, [Sollins], [Moats]) are another possible source of endpoint names. URN's are intended to serve as persistent, location-independent, names for a number of different classes of objects. Sub-sets of the URN namespace might have restricted syntax, and different sub-sets of the URN might have separate allocation and resolution mechanisms. Almost any possible form of names for endpoints, including DNS names, could thus be embedded in a subset of the URN namespace used to name endpoints. (All comments above, about the advantages and disadvantages of DNS names, would thus follow to use of URN names that had the characteristics of DNS names.) The advantages of using a subset of URN's (presumably one specifically tailored to the needs of naming endpoints) to name endpoints remains unclear, though. 10.7 Other Possibilities One can continue to invent other possibilies for endpoint names. One suggestion is to use fine-grained physical location (perhaps from a system like GPS) as part of an endpoint name. Another suggestion is to make some sort of timestamp part of an endpoint name. Both of these provide some information on the origin of the name, information which may also be of use in some other way, and are strategies which increase the probability that the names are globally unique. Any such alternatives would have to undergo engineering analysis to decide if the advantages of a such a name are worth the costs of using it, an analysis which cannot be performed here. 11 Do we Really Need Endpoints and Endpoint Names? Is such a major change needed? Are there not other, simpler, solutions (such as allowing a TCP connection to be indentified by changing host/port pairs)? The answers to these question comes from design principles for large scale systems. There is some skepticism that such generic principles exist, or that they would apply in this case, but the author has no doubts on either score, and strongly believes that they are worth taking note of. Once these principles are outlined, that framework can be used to examine the worth of explicit recognition of endpoints, and endpoint names. 11.1 Increased Functionality and System Death by Entropy First, a common 'failure mode' for large systems is the accretion of many small, poorly integrated changes. A large system will, over its lifetime, generally be called upon to support needs which were unforseen at the time the system was originally designed. Often, the changes made to support these additional requirements are added by engineers other than the original designers. In those circumstance, those engineers usually take the path of least effort (and intellectual arrogance :-), and, rather than perform a sweeping upgrade to the architecture which provides the desired capability as part of a coherent rethink, add a small change which does just what is needed. This kind of caution is often what is needed; however, there are circumstances in which it is inappropriate. If another similar missing capability is detected, and another small change added, these changes take on the appearance of 'warts' on the design. Had the engineers performed a more global analysis of the situation, it would have shown that a more thoroughgoing upheaval would not only provide a single (usually simpler) mechanism to meet both needs, but the resulting system would be better situated to support more unforseen needs than the original system. This seems to be exactly the situation at the moment with the Internet architecture; either a number of small, poorly designed and integrated changes can be made to the internetwork layer to support such capabilities as multi-homed hosts and mobile hosts, or a more sweeping rethink and redesign can be performed. This should produce not only a design with cleaner functionality (and more of it), but a refreshed architecture with a longer useful life. 11.2 Shared Mechanisms and System Scale The second system design principle worth noting is that in small systems, it often works to intermingle the support of two functions in a single mechanism. As a general system design principle, as systems get larger, one winds up pulling functions apart into separate mechanisms. The reason is obvious: a small system can withstand functions X and Y being done half-way well by one mechanism, but as the system gets larger, X and Y usually have to be done much better. Generally, there are problems of scaling, etc, and one can't do both things any more with just one mechanism; one winds up with two, each of which does one thing well. Another way to look at this is to recognize that the less something does, the less chance there is that it has been done wrong, in ways that won't appear until too later. Things which do just one thing, and well, seem to age better than things that try to do several things at once, and do none well. One non-obvious corollary to this system design principle is that systems which explicitly utilize two separate mechanisms have, in the long run, greater simplicity than those with only one. This may seem counterintuitive, that two mechanisms wind up simpler than one, but the reason is simple. As the users try and do more things with the system, and expand its capabilities, the lack of sound underlying mechanisms causes capabilities to be added in an ugly and complex way. In the long run, the decision to take the "simpler" approach of a single mechanism is seen to be a false economy. A classic example of this general principle, of small systems being able to do two things with one mechanism, is the ARPANET, which performed both routing and congestion control with one mechanism [Heart, McQuillan]. Current designs perform them with two separate mechanisms [Castineyra, Partridge]. The mechanisms will have to interact, certainly, but that is a very different thing from using a single mechanism. Again, this is exactly the situation with the Internet; the two functions of interface identification and host identification used to be performed with one mechanism, one name, the IP address. Two different namespaces are needed, each with different characteristics appropriate to the tasks they have to do. 11.3 Incremental Interoperable Change Finally, large scale communication networks present a unique challenge to the system designer. It seems that in general the best method of handling extension of a system is a process of incremental change, where experience is used, together with analysis, to plot future changes. This is simply a reflection of the fact that human foresight is a limited tool, and one subject to error. Experience often provides lessons which it is impossible to forsee, with the result that the best method of evolving a new design is a process in which there is rapid feedback from real experience. This model works well for individual systems, but not so well in large scale networks. The problem is that upgrading a stand-alone system is a problem with localized impact; a new version can be deployed one machine at a time. An installed and functioning communication system, upon which a large user community relies, presents a fundamentally different challenge, since to make a change requires a process of interoperable deployment. This acts to limit the kinds of changes that are practical. The design philosophy that must apply in these large communication networks is "maximize the lifetime (and flexibility) of the architecture". Design tradeoffs (i.e. optimizations) that will adversely affect the flexibility, adaptability and lifetime of the design are not not necessarily wise choices; they may cost more than they save. Such optimizations might be the correct choices in a stand-alone system, where the replacement costs are relatively small, and the process is easier to manage; in the global communication network, the replacement costs are very much higher, and the process is incredibly difficult. It is impossible to predict what the Internet is going to look like over a long time period. This being the case, it is impossible to "build to requirments", since we have no idea what those requirements will be. We have to perform the unique challenge of producing a design that that function perfectly well under conditions which the designers don't have the slightest imagination of. This has been achieved by past designers, and in those cases where it has been achieved, some of this success is due to luck, but not all of it. In information systems, the best path to achieving it seems to be a process of trying to understand the fundamentals of what is really happening in terms of the information handling, and providing a system which supplies those fundamentals in a clear way, but in a design that contains flexibility, adaptability, and generality. This generality, of course, has costs. Is there almost certainly some useless extra and unneeded generality, in a system designed with this kind of methodology? Of course. However, the costs of the extra generality that turns out not to be needed are almost certainly less than the costs of not having any of the generality that one cannot *at this point in time* predict the need for; much of that generality will one day prove useful, and in retrospect a bargain. 12 Advantages Of Explicit Recognition and Naming of Endpoints Bearing the above system design principles in mind, it is now possible to again ask the questions about whether such a major change is needed, and whether there are not other, simpler, solutions, and answer these questions in that light. The single most important reason to explicitly recognize and name endpoints in the internetwork level is unfortunately not a concrete one involving a specific facility or capability. It is, rather, the indistinct and abtruse one that endpoints exist (in some abstract way), whether we deign to recognize them or not, and attempting to create architectures which do not explicitly recognize them *must inevitably* lead to designs which are not as flexible, clean, etc as those that do. Put in more concrete terms, this argument for explicit recognition of endpoints, and naming of them, says that doing so will result in substantial improvements in overall utility, directness, simplicity, robustness, flexibility, etc; these are all properties which are treasured highly in designs that have to have a long life-time. To come at the same basic point, but from another angle, it is important to recognize and name endpoints, as a separate and distinct class of entities from interfaces. At the moment, we have no namespace at all for the former. The three different uses for existing IP addresses (as laid out in section 3.1) in fact are a perfect example of the system design principle laid out in section 11.2 - that a single mechanism may work well to perform several functions when a system is small, but will show increasing difficulties as the system gets larger. A separate endpoint naming space will separate out endpoint identification from addressing, allowing (for instance) different addressing schemes to be used without host involvement. 12.1 Advantages Of Explicit Recognition and Naming of Endpoints in IPv4 At a more mundane and practical level (but not one without significant benefits), interpretation of the existing 32-bit fields and names in IPv4 as EID's would allow deployment of a new addressing structure without mandating changes to the hosts. It would also significantly extend the usable lifetime of that 32-bit space, and thus of the IPv4 packet format. Author's Address J. Noel Chiappa Grafton, VA 22392 Phone: (757) 898-8183 EMail: jnc@lcs.mit.edu References [Castineyra] Isidro Castineyra, J. Noel Chiappa, Charles Lynn, Ram Ramanathan, Martha Steenstrup, "The Nimrod Routing Architecture", RFC xxx, University of Southern California, Information Sciences Institute, Marina Del Rey, Calif., yyyy 19zz. [Chiappa91] J. Noel Chiappa, "A New IP Routing and Addressing Architecture", Internet-Draft, September 1991. [Chiappa95] J. Noel Chiappa and Yakov Rekhter, "Fundamentals of Routing and Addressing In Extremely Large Networks", RFC, in preparation. [Clark] David D. Clark, "The Design Philosophy of the DARPA Internet protocols", Proceedings of the SIGCOMM '88 Symposium, Computer Communications Review, Vol. 18, No. 4, pp. 106-114, August 1988. [Cohen] Danny Cohen, "On Names, Addresses and Routings", Internet Experiment Note #23, University of Southern California, Information Sciences Institute, Marina Del Rey, Calif., 1978. [Dijkstra] E.W. Dijkstra, "The Structure of the 'THE' Multi- Programming System", CACM 11, 5 (May 1968), pp. 341-46. [Feinler] Elizabeth Feinler and Jon Postel, Eds., "ARPANET Protocol Handbook," SRI International, Melo Park, Calif., January, 1978. [Heart] Frank Heart, Robert Kahn, S. Ornstein, William Crowther and David Walden, "The Interface Message Processor for the ARPA Computer Network", AFIPS Conf. Proc. 36, pp. 551-567, June 1970. [ISO] International Organization for Standardization, "Information Processing Systems - Open Systems Interconnection - Basic Reference Model", ISO-7498-1984, October, 1984. [Little] Michael Little, "Goals and functional requirements for inter-autonomous system routing", RFC 1126, University of Southern California, Information Sciences Institute, Marina Del Rey, Calif., October 1989. [McQuillan] John M. McQuillan, Ira Richer and Eric C. Rosen, "The New Routing Algorithm for the ARPANET", IEEE Transactions on Communications, COM-28(5); pp. 711-719, May 1980. [Moats] R. Moats, "URN Syntax", RFC 2141 University of Southern California, Information Sciences Institute, Marina Del Rey, Calif., May 1997 [Mockapetris] Paul Mockapetris, "Domain Names - Concepts and Facilities", RFC 1034, University of Southern California, Information Sciences Institute, Marina Del Rey, Calif., November 1987. [O'Dell] "GSE - An Alternate Addressing Architecture for IPv6", Mike O'Dell, (Work in progress). [Partridge] Craig Partridge, "Proposed Flow Specification", RFC 1363, University of Southern California, Information Sciences Institute, Marina Del Rey, Calif., September 1992. [Postel80] Jon Postel, "User Datagram Protocol", RFC 768, University of Southern California, Information Sciences Institute, Marina Del Rey, Calif., August 1980. [Postel81] Jon Postel, "Internet Protocol", RFC 791, University of Southern California, Information Sciences Institute, Marina Del Rey, Calif., September 1981. [Saltzer82] Jerome H. Saltzer, "On The Naming and Binding of Network Destinations," in 'Local Computer Networks', edited by P. Ravasio et al., North Holland, Amsterdam, 1982, pp. 311-317. RFC 1498, University of Southern California, Information Sciences Institute, Marina Del Rey, Calif., September 1992. [Saltzer84] Jerome H. Saltzer, David Reed and David Clark, "End-To-End Arguments in System Design", ACM Transactions on Computer Systems, Vol. 2, No. 4, November 1984. [Schroeder] Michael D. Schroeder, David D. Clark, Jerome H. Saltzer, Douglas H. Well, "Final Report of the Multics Kernel Design Project", TR-196, M.I.T. Laboratory for Computer Science, Mass., June, 1977. [Shoch] John F. Shoch, "Inter-Network Naming, Addressing and Routing", Internet Experiment Note #19, University of Southern California, Information Sciences Institute, Marina Del Rey, Calif., 1978. Also in 'IEEE Proc. COMPCON Fall 1978', pp. 72-79. [Sollins] Karen Sollins, and Larry M. Masinter, "Functional Requirements for Uniform Resource Names," RFC 1737, University of Southern California, Information Sciences Institute, Marina Del Rey, Calif., December 1994. Expires: yyy xx, 2000 zzz xx, 1999