Annotation of researchv10dc/vol2/ipc/ipcpaper.rf, revision 1.1.1.1

1.1       root        1: .lf 1 ipcpaper
                      2: .ND
                      3: .TL
                      4: Interprocess Communication
                      5: .br
                      6: in the Ninth Edition Unix System
                      7: .AU
                      8: D. L. Presotto
                      9: D. M. Ritchie
                     10: .AI
                     11: AT&T Bell Laboratories
                     12: Murray Hill, New Jersey 07974
                     13: .AB
                     14: When processes wish to communicate, they must first establish communication,
                     15: and then decide what to say.
                     16: The stream mechanisms introduced in the Eighth Edition Unix system\*(<,\*([.1\*(.]\*(>,
                     17: .FS
                     18: Unix is a trademark of AT&T.
                     19: .FE
                     20: which have now become part of AT&T's Unix System V\*(<,\*([.2\*(.]\*(>,
                     21: provide a flexible way for processes
                     22: to speak with devices and with
                     23: each other:
                     24: an existing stream connection is named by a file descriptor,
                     25: and the usual read, write, and I/O control requests apply.
                     26: Processing modules may be inserted dynamically
                     27: into a stream connection, so
                     28: network protocols, terminal processing, and device drivers separate
                     29: cleanly.
                     30: .PP
                     31: Simple extensions provide new ways of establishing communication.
                     32: In our system, the traditional Unix IPC mechanism, the pipe, is
                     33: a cross-connected stream.
                     34: .PP
                     35: A new request associates a stream with a named file.
                     36: When the file is opened,
                     37: operations on the file are operations on the
                     38: stream.
                     39: .PP
                     40: Open files may be passed from
                     41: one process to another over a stream.
                     42: .PP
                     43: These low-level mechanisms allow 
                     44: construction of flexible and general
                     45: routines for connecting local and remote processes.
                     46: .AE
                     47: .LP
                     48: .SH
                     49: Introduction
                     50: .PP
                     51: The Ninth Edition version of Unix\(rg operating system
                     52: is used in the Information Sciences
                     53: Research Division of AT&T Bell Laboratories, and at a few sites elsewhere.
                     54: It is named, by our custom,
                     55: after its manual.
                     56: .PP
                     57: The work reported here provides convenient ways
                     58: for programs to establish communication with unrelated
                     59: processes, on the same or different machines.
                     60: The communication we are interested in is conducted by
                     61: ordinary read and write calls, occasionally supplemented
                     62: by I/O control requests, so that it resembles\(emand, where possible,
                     63: is indistinguishable from\(emI/O to files.
                     64: Moreover, we wish to commence communication in ways that resemble
                     65: the opening of ordinary files, or at least takes advantage of
                     66: the properties of the file system name space.
                     67: .PP
                     68: In particular, we study how to
                     69: .IP 1)
                     70: provide objects nameable as files that invoke useful services,
                     71: such as connecting to other machines over various media,
                     72: .IP 2)
                     73: make it easy to write the programs that provide the services.
                     74: .PP
                     75: .SH
                     76: Recapitulation
                     77: .PP
                     78: The Eighth Edition system introduced a new way of communicating with
                     79: terminal and network devices\*(<,\*([.1\*(.]\*(>,
                     80: and a generalization of the internal interface to the file system\*(<.\*([.3,\|4\*(.]\*(>.
                     81: Because the new mechanisms build on these ideas, we
                     82: review the nomenclature and mechanisms
                     83: of our I/O and file systems.
                     84: .SH
                     85: .I "Streams
                     86: .PP
                     87: A
                     88: .I "stream
                     89: is a full-duplex connection between a process and a device
                     90: or another process.
                     91: It consists of several linearly connected processing modules,
                     92: and is analogous to a Shell pipeline, except that
                     93: data flows in both directions.
                     94: The modules in a stream communicate
                     95: by passing messages to their neighbors.
                     96: A module provides only one entry point to each neighbor, namely
                     97: a routine that accepts messages.
                     98: .PP
                     99: At the end of the stream closest to the process
                    100: is a set of routines that provide the interface to the rest of the system.
                    101: A user's
                    102: .I "write
                    103: and
                    104: I/O control requests are turned into messages sent along the stream,
                    105: and
                    106: .I "read
                    107: requests take data from the stream and pass it to the user.
                    108: At the other end of the stream is either a
                    109: device driver module, or another process.
                    110: Data arriving from the stream at a driver module
                    111: is transmitted to the device, and
                    112: data and state transitions detected by the device are
                    113: composed into messages and sent into the stream towards the user process.
                    114: Pipes, which are streams connecting processes,
                    115: are bidirectional;
                    116: a writer at either end generates stream messages that are picked up by the reader
                    117: at the other.
                    118: .PP
                    119: Intermediate modules process messages in various ways.
                    120: They come in pairs, for handling messages
                    121: in each of the two directions, and each pair is symmetrical;
                    122: their read and write interfaces are identical.
                    123: .PP
                    124: The end modules in a device stream become connected automatically when
                    125: the process opens the device;
                    126: streams between processes are created by a
                    127: .I pipe
                    128: call.
                    129: Intermediate modules are attached dynamically by request of the user's program.
                    130: They are addressed like a stack with its top close to the process,
                    131: so installing one is called `pushing' a new module.
                    132: .PP
                    133: For example,
                    134: Figure 1 shows a stream device that has just
                    135: been opened.
                    136: The top-level routines, drawn as a pair of half-open rectangles
                    137: on the left, are invoked by users'
                    138: .I read
                    139: and
                    140: .I write
                    141: calls.
                    142: The
                    143: writer
                    144: routine sends messages to the device driver shown on the right.
                    145: Data arriving from the device becomes
                    146: messages sent to the top-level
                    147: reader
                    148: routine, which returns the data to the user process
                    149: when it executes
                    150: .I read .
                    151: .so pfig1
                    152: .PP
                    153: Figure 2 shows a stream with intermediate modules.
                    154: This arrangement might be used when a terminal is connected to the computer
                    155: through a network.
                    156: The leftmost intermediate module carries out processing
                    157: (such as character-erase and line-kill) needed for terminals, while
                    158: the rightmost intermediate module does the
                    159: flow- and error-control
                    160: protocol needed to interface to the network.
                    161: .so pfig2
                    162: .PP
                    163: Finally, Figure 3
                    164: shows the connections for a pipe.
                    165: .so pfig3
                    166: .SH
                    167: .I "File Systems
                    168: .PP
                    169: Weinberger\*([.3\*(.]
                    170: generalized the file system
                    171: by identifying a small set of primitive operations on files
                    172: (read, write, look up name, truncate, get status, etc.: a total of 11)
                    173: and modifying the
                    174: .I mount
                    175: request so that it specifies a file system type and, where appropriate,
                    176: a stream.
                    177: When file operations are requested, the calls to the underlying
                    178: primitives are routed through a switch table indexed by the
                    179: type.
                    180: Where the standard file system type performs operations directly
                    181: on a disk,
                    182: a second type generates remote procedure calls
                    183: across the associated stream.
                    184: At the other end of the stream, which usually goes over
                    185: a network to another machine, is a server process
                    186: that answers the calls to read and write data and perform the other operations.
                    187: This scheme thus provides a remote file system.
                    188: In general structure, this arrangement is analogous
                    189: to that used by AT&T's RFS
                    190: and Sun Microsystems' NFS.
                    191: .PP
                    192: Pike's `face server'\*([.5\*(.]
                    193: appears to be an ordinary remote file system,
                    194: but his server simulates a hierarchy containing images classified by
                    195: machine, person name, and resolution.
                    196: The apparent structure of the hierarchy as viewed by
                    197: a client differs considerably from
                    198: its actual layout on the server's machine.
                    199: .PP
                    200: Killian\*([.4\*(.]
                    201: added a file system type that
                    202: appears to be a directory containing the names (process ID numbers)
                    203: of currently running processes.
                    204: Once a process file is opened, its memory may be read or written,
                    205: and control operations can start it or stop it.
                    206: This simplifies the construction of sophisticated debuggers,
                    207: for example Cargill's process-inspector
                    208: .I pi \*(<.\*([.6\*(.]\*(>.
                    209: .SH
                    210: Establishing Communication
                    211: .PP
                    212: Traditional Unix systems provide few ways for a process
                    213: to establish communication with another.
                    214: The oldest one, the pipe, has proved astonishingly valuable
                    215: despite its limitations, and indeed remains central in the design
                    216: we shall describe.
                    217: Its cardinal limitation is, of course, that it is anonymous,
                    218: and cannot be used to create a channel between unrelated processes.
                    219: .PP
                    220: More recently,
                    221: AT&T's System V has offered a variety of communication mechanisms including
                    222: semaphores, messages, and shared memory.
                    223: They are all useful in certain circumstances, but programs that
                    224: use them are all special-purpose; they know that they are communicating
                    225: over a certain kind of channel, and must use special calls and techniques.
                    226: System V also provides named pipes (FIFOs).
                    227: They reside in the file system, and ordinary I/O operations
                    228: apply to them.
                    229: They can provide a convenient place for processes to meet.
                    230: However, because the messages of all writers are intermingled,
                    231: writers must observe a carefully designed, application-specific protocol
                    232: when using them.
                    233: Moreover, FIFOs supply only one-way communication;
                    234: to receive a reply from a process reached through
                    235: a FIFO, a return channel must be constructed somehow.
                    236: .PP
                    237: Berkeley's 4.2 BSD system introduced
                    238: .I sockets
                    239: (communication connection points)
                    240: that exist in domains (naming spaces).
                    241: The design is powerful enough to provide most of the needed facilities,
                    242: but is uncomfortable in various ways.
                    243: For example, unless extensive libraries are used, creating a new
                    244: domain implies additions to the kernel.
                    245: Consider the problem of adding a `phone' domain, in which the addresses
                    246: are telephone numbers.
                    247: Should complicated negotiations with various kinds of
                    248: automatic dialers be added to the kernel?
                    249: If not, how can the required code be invoked in user mode
                    250: when a program calls
                    251: 4.2 BSD's
                    252: .I connect
                    253: primitive?
                    254: .PP
                    255: Another problem with the socket interface is that it exposes
                    256: peculiarities of the domain;
                    257: various domains support very different kinds of name
                    258: (for example, 32-bit Internet address versus character string), and it is difficult
                    259: to deal with the names in a general way.
                    260: Similarly, the details of option processing and other aspects of
                    261: each domain's protocols complicate an interface that attempts generality.
                    262: .SH
                    263: New System Mechanisms
                    264: .PP
                    265: Two small additions to the operating system allowed us to build
                    266: a variety of communication mechanisms, which will be
                    267: described below.
                    268: .SH
                    269: .I "Generalized Mounting
                    270: .PP
                    271: Traditionally, the
                    272: .I mount
                    273: request attaches a disk containing
                    274: a new piece of the file system tree at a leaf of the existing structure.
                    275: In the Ninth Edition, it takes the form
                    276: .DS
                    277: .ft CW
                    278:        mount(type, fd, name, flag);
                    279: .ft
                    280: .DE
                    281: in which
                    282: .I type
                    283: identifies the kind of file system,
                    284: .I fd
                    285: is a file descriptor,
                    286: .I name
                    287: is a string identifying a file, and
                    288: .I flag
                    289: may specify a few options.
                    290: Like its original version, this call attaches a new file system structure
                    291: atop the file
                    292: .I name
                    293: in the existing file hierarchy.
                    294: The operating system gains access to the contents of newly-attached file tree
                    295: by communicating over the descriptor
                    296: .I fd,
                    297: according to a protocol appropriate for the new file system
                    298: .I type.
                    299: For example, ordinary disk volumes have type
                    300: .I ordinary,
                    301: and the file descriptor is the special file for
                    302: the disk, while
                    303: remote file systems use type
                    304: .I remote,
                    305: and the descriptor
                    306: refers to a stream connection to a server that understands
                    307: the appropriate RPC messages.
                    308: Some types are handled entirely internally;
                    309: for example, the `proc' type ignores the file descriptor.
                    310: .PP
                    311: We added a new, very simple, file system type.
                    312: Its
                    313: .I mount
                    314: request merely attaches the file descriptor (which must be a stream) to
                    315: the file.
                    316: Subsequently, when processes open and do I/O on that file,
                    317: their requests refer to the stream mounted on the file.
                    318: Often, the stream is one end of a pipe created by a server
                    319: process, but it can equally well be a connection to a device,
                    320: or a network connection to a process on another machine.
                    321: The effect is similar to a System V FIFO that has already been opened
                    322: by a server, but more general: communication is full-duplex,
                    323: the server can be on another machine, and (because the connection is a stream),
                    324: intermediate processing modules may be installed.
                    325: .SH
                    326: .I "Passing Files
                    327: .PP
                    328: By itself, a mounted stream shares an important difficulty
                    329: of the FIFO;
                    330: several processes attempting to use it simultaneously must
                    331: somehow cooperate.
                    332: Another addition facilitates this cooperation:
                    333: an open file may be passed
                    334: from one process to another across a pipe connection.
                    335: The primitives may be written
                    336: .DS
                    337: .ft CW
                    338:        sendfile(wpipefd, fd);
                    339: .ft
                    340: .DE
                    341: in the sender process, and
                    342: .DS
                    343: .ft CW
                    344:        (fd1, info) = recvfile(rpipefd);
                    345: .ft
                    346: .DE
                    347: in the receiver.
                    348: By using
                    349: .I sendfile,
                    350: the sender transmits a copy of its file descriptor
                    351: .I fd
                    352: over the pipe to the receiver;
                    353: when the receiver accepts it by
                    354: .I recvfile,
                    355: it gains a new open file denoted by
                    356: .I fd1.
                    357: (Other information, such as the user- and group-id of the sender,
                    358: is also passed.)
                    359: The facility may be used only locally, over a pipe;
                    360: we do not attempt to extend it to remote systems.
                    361: .PP
                    362: A similar facility is available in the 4.3 BSD system\*(<,\*([.7\*(.]\*(>,
                    363: but is little-used, possibly because in earlier versions
                    364: the related socket facilities were buggy.
                    365: It will appear in future versions of Unix System V.
                    366: .SH
                    367: Simple Examples
                    368: .PP
                    369: A graded set of examples will illustrate how these mechanisms
                    370: can solve problems that vex other systems.
                    371: .SH
                    372: .I "Talking to Users
                    373: .PP
                    374: When a user logs in to traditional Unix systems, an entry is made in the
                    375: .I /etc/utmp
                    376: file, recording the login name and the terminal or network channel
                    377: being used.
                    378: Although this file is often used merely to show who is where,
                    379: it is also used to establish communication with the user.
                    380: For example, the
                    381: .I write
                    382: command and the mail-notification service look up
                    383: a user's name, and send a message
                    384: to the corresponding terminal.
                    385: This simple scheme does not work well with windowing terminals,
                    386: because the messages disturb the protocol between
                    387: the host and the terminal, and because there is no obvious way
                    388: to relate the terminal's special file to a particular window.
                    389: Even without windows, there are security problems and other difficulties
                    390: that follow from letting users write on each other's terminals.
                    391: .PP
                    392: We use stream-mounting to interpose a program
                    393: between a terminal special file and the terminal itself.
                    394: The program, called
                    395: .I vismon ,
                    396: mounts one end of a pipe on the user's terminal.
                    397: Normally it occupies an inconspicuous window, displaying system
                    398: activity and announcing arriving mail.
                    399: When some other process opens and writes on the special file
                    400: for the terminal, the mounted stream receives the data;
                    401: .I vismon
                    402: creates a new window, and copies this data to it.
                    403: The new window has a shell, so that if the message was
                    404: from a
                    405: .I write
                    406: command, the recipient can write back.
                    407: .PP
                    408: Communication between the terminal and the windowing
                    409: multiplexor on the host is not disturbed;
                    410: it continues to flow to the terminal itself, not to
                    411: .I vismon,
                    412: because the
                    413: .I mount
                    414: operation affects only the interpretation of file names,
                    415: not existing file descriptors.
                    416: .SH
                    417: .I "Network Calling: Simple Form
                    418: .PP
                    419: Making a network connection is a complicated activity.
                    420: There is often name translation of various kinds,
                    421: and sometimes negotiations with various entities.
                    422: With the Datakit\(rg VCS network\*(<,\*([.8\*(.]\*(>,
                    423: for example, a call is placed
                    424: by negotiating with a node controller.
                    425: When dialing over the switched telephone system, one must talk
                    426: to any of several kinds of automatic dialers.
                    427: Setting up a connection on an Internet
                    428: under any of the extant protocols requires translation of
                    429: a symbolic name to a net address, and then special communication
                    430: with the remote host.
                    431: These setup protocols should certainly not be in kernel code, so
                    432: most systems package them in user-callable libraries.
                    433: .PP
                    434: With our primitives, it is straightforward to encapsulate a
                    435: network-connection algorithm to a single executable program.
                    436: A application desiring to make an outward connection calls a simple routine
                    437: that creates a pipe, forks, and in the child process executes the
                    438: network dialer program.
                    439: The dialer passes back either an error code, or a file descriptor
                    440: referring to an open connection to the other machine.
                    441: The pseudo-code for this library routine,
                    442: neglecting error-checking and closing down the pipe, is:
                    443: .DS
                    444: .ft CW
                    445:        netcall(address)
                    446:        {       int p[2];
                    447: .sp .25
                    448:                pipe(p);
                    449:                if (fork()!=0)
                    450:                        execute("/etc/netcaller", address, p[0]);
                    451:                status = wait();
                    452:                if (bad(status))
                    453:                        return(errcode);
                    454:                passedinfo = recvfile(p[1]);
                    455:                return(passedinfo.fd);
                    456:        }
                    457: .ft
                    458: .DE
                    459: The
                    460: .ft CW
                    461: /etc/netcaller
                    462: .ft
                    463: program can be arbitrarily complicated, but does not occupy the
                    464: same address space as its caller.
                    465: In this way, if something in the network interface changes,
                    466: only one program needs to be fixed and reinstalled.
                    467: Its job is to create the connection, and pass its descriptor
                    468: for the open connection; it then terminates, and is no
                    469: longer involved in the connection.
                    470: Along the way, it may negotiate permissions and provide the caller's
                    471: identity reliably, because it can be a privileged (set-uid) program.
                    472: Thus, the segregation of the program that does the actual call setup
                    473: from its client is important.
                    474: When connections are made by library routines,
                    475: the operating system must know enough about
                    476: the call setup protocols to authenticate the caller to the target system.
                    477: In the method described above, this task need not be done in kernel code.
                    478: Even shared libraries, which do reduce the bulk of
                    479: code included with each program that makes network connections,
                    480: run in the protection domain of the person who
                    481: executes them.
                    482: .SH
                    483: .I "Process Connections
                    484: .PP
                    485: Suppose you are writing a multi-player game,
                    486: in which several people interact with each other.
                    487: One design uses a pair of programs:
                    488: a controller process that runs throughout the game and
                    489: coordinates
                    490: the play, and a player program, with one instance for each player,
                    491: that communicates with the controller.
                    492: .PP
                    493: When the controller starts,
                    494: it creates a conventionally-located file, stream-mounts
                    495: one end of a pipe on this file,
                    496: and waits for connection messages to arrive from players.
                    497: When the player program is run, it opens
                    498: the communication file, and creates its own pipe.
                    499: It starts communication by sending one end of this pipe to the
                    500: game controller over the communication file.
                    501: .PP
                    502: As each passed pipe appears on the controller's connection stream,
                    503: it accepts the connection with
                    504: .I recvfile.
                    505: Thereafter, each player transmits moves and receives replies
                    506: over its end of the pipe;
                    507: the controller reads players' moves and transmits replies
                    508: over the end it received.
                    509: It maintains the global state of the game, and uses the
                    510: .I select (2)
                    511: mechanism
                    512: to multiplex connection requests and the communication with the
                    513: player programs.
                    514: .SH
                    515: The Connection Server
                    516: .PP
                    517: The final example illustrates a general
                    518: connection server.
                    519: It combines ideas used by the initial network-calling
                    520: scheme and the game design, described above,
                    521: to create a flexible switchboard
                    522: through which programs can connect to remote or local services.
                    523: .PP
                    524: Two things are necessary for handling server-client relationships:
                    525: first, some program must establish itself as a server,
                    526: and wait for requests for the service;
                    527: and second, programs must make requests.
                    528: We will first describe the external appearance of the scheme (the
                    529: library entry points), then the addressing and naming, and then the implementation.
                    530: .PP
                    531: A program that desires to make a connection calls the routine
                    532: .I ipcopen,
                    533: passing a string
                    534: of characters that specifies the address and the desired service at
                    535: that address.
                    536: .DS
                    537: .ft CW
                    538: fd = ipcopen(service);
                    539: .ft
                    540: .DE
                    541: The
                    542: .I ipcopen
                    543: routine returns a file descriptor connected to the requested server.
                    544: If it fails, a string describing the error is available.
                    545: .PP
                    546: In order to announce a service,
                    547: .I ipccreat
                    548: is used;
                    549: its argument is a string that names the service.
                    550: The return value is a file descriptor
                    551: .I fd
                    552: that is a channel on which connection requests will be sent.
                    553: .DS
                    554: .ft CW
                    555: fd = ipccreat(service);
                    556: .ft
                    557: .DE
                    558: To wait for requests, the server uses the
                    559: .I ipclisten
                    560: routine.  Its argument is the same
                    561: .I fd
                    562: returned by
                    563: .I ipccreat:
                    564: .DS
                    565: .ft CW
                    566: ip = ipclisten(fd);
                    567: .ft
                    568: .DE
                    569: .I Ipclisten
                    570: returns when some program calls
                    571: .I ipcopen
                    572: with an argument corresponding to the service, in a way discussed below.
                    573: The return value
                    574: is a structure containing
                    575: information about the caller, such as the user name, and,
                    576: where relevant, the name of the machine from which the call was placed.
                    577: This new connection may be rejected:
                    578: .DS
                    579: .ft CW
                    580: ipcreject(ip, errcode);
                    581: .ft
                    582: .DE
                    583: or it may be accepted:
                    584: .DS
                    585: .ft CW
                    586: fd = ipcaccept(ip, cfd);
                    587: .ft
                    588: .DE
                    589: If the server itself is capable of handling all communication with
                    590: its client, it passes a null file descriptor as
                    591: .I cfd,
                    592: and uses the return value of
                    593: .I ipcaccept
                    594: as a file descriptor to communicate with its client.
                    595: Depending on the locations of the server and the client,
                    596: this may be either a pipe, or a stream connection to a remote machine.
                    597: .PP 
                    598: Sometimes, the purpose of a server is not to communicate directly,
                    599: but to set up another connection on behalf of its client.
                    600: A network dialing server, for example, receives the desired address
                    601: in the
                    602: .I ip
                    603: structure returned by
                    604: .I ipclisten,
                    605: and connects to this address with network-specific primitives.
                    606: If the connection succeeds, the server sends the descriptor
                    607: for the connection to the client using the
                    608: .I cfd
                    609: argument of
                    610: .I ipcaccept.
                    611: .PP
                    612: The various file descriptors in these calls all work properly
                    613: with the
                    614: .I select
                    615: system call, so a single program may issue several
                    616: .I ipccreat
                    617: calls, and wait a connection to appear before committing
                    618: itself to using
                    619: .I ipclisten
                    620: on any one of them.
                    621: .SH
                    622: .I Addresses
                    623: .PP
                    624: The arguments supplied to
                    625: .I ipcopen
                    626: and
                    627: .I ipccreat
                    628: are strings with several components
                    629: separated by exclamation mark `!' characters.
                    630: The first part is interpreted as a file name.
                    631: If it is absolute, it is used as is; otherwise, it is interpreted as
                    632: a file in the directory
                    633: .I /cs,
                    634: which we use, conventionally, to collect rendezvous points.
                    635: For example, a game controller like that discussed
                    636: in a previous section might announce itself with
                    637: .DS
                    638: .ft CW
                    639: ipccreat("mazewar");
                    640: .ft
                    641: .DE
                    642: The player program could then connect to the controller with
                    643: .DS
                    644: .ft CW
                    645: ipcopen("mazewar");
                    646: .ft
                    647: .DE
                    648: In this simple case, the IPC routines merely accomplish a convenient
                    649: packaging of the scheme discussed above.
                    650: .PP
                    651: When a multi-component argument is given to
                    652: .I ipcopen,
                    653: the server selected by the first component receives the remaining
                    654: components
                    655: as part of the
                    656: .I ip
                    657: structure returned by its
                    658: .I ipclisten,
                    659: and interprets them according to its own conventions.
                    660: For example, there is a dialing server for each kind of network.
                    661: If the first component of an
                    662: .I ipcopen
                    663: specifies a network server,
                    664: the remaining components conventionally supply an address
                    665: within that network, and possibly a service obtainable at that address.
                    666: We have three kinds of networks:
                    667: .I tcp
                    668: (TCP/IP connection),
                    669: .I dk
                    670: (Datakit connection), and
                    671: .I phone
                    672: (dial-up telephone).
                    673: Each network server adopts the convention that a missing service name
                    674: means a connection to an end-point that allows one to log in by hand.
                    675: Therefore, calling
                    676: .I ipcopen
                    677: with the strings
                    678: .DS
                    679: .ft CW
                    680:        tcp!research.att.com
                    681:        dk!nj/astro/research
                    682:        phone!201-582-5940
                    683: .ft
                    684: .DE
                    685: gets connections over which one will receive a `login:' greeting,
                    686: each over a different kind of network.
                    687: The servers are responsible for the details of name translation,
                    688: performing the appropriate connection protocol, and so forth.
                    689: Some examples of named services at particular locations are
                    690: .DS
                    691: .ft CW
                    692:        tcp!dutoit.att.com!whoami
                    693:        dk!research!smtp
                    694: .ft
                    695: .DE
                    696: The first is a debugging service that echoes facts about the
                    697: connection and the user ID of the person who requests it.
                    698: The second illustrates how remote mail is sent:
                    699: by connecting to the
                    700: .I smtp
                    701: server (mail receiver) on the appropriate machine.
                    702: .SH
                    703: .I "IPC Implementation
                    704: .PP
                    705: For a simple service, the
                    706: .I ipccreat
                    707: routine works just like the
                    708: game-manager program described above; it first creates a file in the
                    709: .I /cs
                    710: directory corresponding to the name of the service, then makes
                    711: a pipe and stream-mounts one end of the pipe on this file.
                    712: For complex services, which have a `!' in their names, the
                    713: simple service named to the left of the `!' must be created first;
                    714: when
                    715: .I ipccreat
                    716: is handed the name of such a service, it uses
                    717: a version of
                    718: .I ipcopen
                    719: referring to the simple, underlying server, and passes it the remainder
                    720: of the name.
                    721: In either case,
                    722: .I ipccreat
                    723: returns its own end of its pipe, ready to receive requests.
                    724: .PP
                    725: The
                    726: .I ipcopen
                    727: routine uses a technique that resembles that used by the
                    728: simple network calling routine described above, but differs
                    729: in detail.
                    730: It opens the file in
                    731: .I /cs
                    732: corresponding to the desired service, makes a pipe, and hands
                    733: one end of the pipe to the server.  It then sends the actual contents
                    734: of the request (the full address) to its end of the pipe,
                    735: and waits for an acceptance or rejection message to appear on
                    736: this pipe.
                    737: .PP
                    738: The server
                    739: .I ipclisten
                    740: call waits for a stream (passed by someone's
                    741: .I ipcopen )
                    742: to appear on the file descriptor mounted on its
                    743: .I /cs
                    744: communication file; as each appears,
                    745: it reads the request block from the passed stream,
                    746: and returns it to the server.
                    747: .PP
                    748: After analyzing the request, the server calls either
                    749: .I ipcaccept
                    750: or
                    751: .I ipcreject;
                    752: each sends an appropriate message back to the client over the passed
                    753: stream.
                    754: .I Ipcaccept
                    755: has two cases:
                    756: when its
                    757: .I cfd
                    758: argument is empty, the same pipe sent to
                    759: the server by the client is used for communication; when
                    760: .I cfd
                    761: is non-empty,
                    762: that file descriptor is sent back to the client.
                    763: .I Ipcopen
                    764: returns the appropriate descriptor.
                    765: .PP
                    766: .SH
                    767: .I "Network Managers"
                    768: .PP
                    769: The IPC routines discussed above handle both clients and servers
                    770: that are local to a single system, and are also sufficient to accomplish
                    771: outgoing network connections.
                    772: One missing piece is how to write the programs
                    773: that accept connections from a network, and arrange to invoke
                    774: the appropriate local services.
                    775: We call such programs
                    776: .I managers.
                    777: .PP
                    778: The networking part of a manager is specific to its
                    779: network, and usually must conduct dialogues both with the
                    780: operating system and with its remote client.
                    781: For example, the manager for TCP/IP must arrange
                    782: to receive IP packets sent to certain port numbers,
                    783: and analyze the packets to determine what service is being
                    784: requested;
                    785: then it must select a port number for
                    786: the conversation, communicate it to the peer, and arrange to collect
                    787: packets on this port number.
                    788: Finally, the manager must supply the selected local service.
                    789: Each network manager could have
                    790: .I "ad hoc"
                    791: code for this part of the job;
                    792: instead, they depend on a more general program called the
                    793: .I "service manager.
                    794: .SH
                    795: .I "The Service Manager
                    796: .PP
                    797: By using
                    798: .I ipccreat,
                    799: a process establishes itself as a server and prepares to receive requests.
                    800: While it is serving, it must remain in existence.
                    801: For some servers, like the multi-player game controller that
                    802: continues to run as users enter and leave the game,
                    803: the longevity of the server is appropriate.
                    804: However, many, or even most, useful services do not necessarily
                    805: need individual long-lived servers, because the service merely involves
                    806: execution of a particular program.
                    807: For example, services like
                    808: .I rlogin,
                    809: .I telnet,
                    810: .I smtp
                    811: and
                    812: .I ftp,
                    813: as well as simpler ones that merely provide the
                    814: date, or send a file to a line printer, can all
                    815: be accomplished merely by running the appropriate program
                    816: with input and output connected to the right place.
                    817: Even when the characteristics of such services differ
                    818: in detail, there are general patterns.
                    819: Some, for example, require no authentication, some require checking
                    820: of authentication according to an automatic scheme, and others
                    821: always insist on a password.
                    822: .PP
                    823: The observation that many services share a common structure
                    824: suggested a common solution: the Service Manager.
                    825: It is started when the operating system is booted, and is
                    826: driven by a specification file;
                    827: each entry in the file
                    828: contains the name of the service, and a list of actions
                    829: to be performed when that service is requested.
                    830: The service manager issues
                    831: .I ipccreat
                    832: for the name given in each entry; when another process uses
                    833: .I ipcopen
                    834: to request the service, the service manager carries out each
                    835: encoded action.
                    836: .PP
                    837: The most important action specifies a command to be executed;
                    838: for example, the line
                    839: .DS
                    840: .ft CW
                    841:        date            cmd(date)
                    842: .ft
                    843: .DE
                    844: means that connecting to the service
                    845: .I date
                    846: would run the `date' command.
                    847: Other actions may specify the user ID under which the program
                    848: is run:
                    849: .DS
                    850: .ft CW
                    851:        uucp            user(uucp)+cmd(/usr/lib/uucp/uucico)
                    852: .ft
                    853: .DE
                    854: This service specifies a passwordless connection to the
                    855: .I uucp
                    856: file-transfer program;
                    857: a locally-conventional TCP/IP port
                    858: number is used for such connections, and a corresponding convention
                    859: is used on our Datakit network.
                    860: There are other built-in actions:
                    861: .DS
                    862: .ft CW
                    863:        login           ttyld+password
                    864: .ft
                    865: .DE
                    866: means that the
                    867: .I login
                    868: service needs to install the line discipline module for terminal
                    869: processing, and also to execute the
                    870: .I login
                    871: command;
                    872: .DS
                    873: .ft CW
                    874:        oklogin         auth+ttyld+login
                    875: .ft
                    876: .DE
                    877: is similar, but allows passwordless login.
                    878: Authorization is checked by the
                    879: .I auth
                    880: specification, which determines whether the call came from a
                    881: trusted host on a trusted network, so that the passed user ID
                    882: can be believed.
                    883: .SH
                    884: Uses
                    885: .PP
                    886: The techniques described in this paper permit a general approach
                    887: to network and local connections in which most of the work
                    888: is done in a few user-mode programs.
                    889: As an example of the benefits of the scheme, we have unified
                    890: various commands that do remote login over two kinds of networks
                    891: (TCP/IP and Datakit).
                    892: A single command,
                    893: .I con,
                    894: tries various networks and uses the first over which a connection
                    895: can be made.
                    896: The traditional names (like
                    897: .I rlogin )
                    898: are retained as links, but the only effect of using them is to
                    899: influence the order in which networks are tried.
                    900: The stream implementation makes the transport layers of the networks
                    901: sufficiently similar
                    902: that the same code can be used once the connection is established;
                    903: the techniques described here make even the connection interface uniform.
                    904: .PP
                    905: These same techniques extend well to inter-network connectivity.
                    906: For example, all our machines have a
                    907: Datakit interface, but only a few have Ethernet connections.
                    908: Nevertheless, from a Datakit-only machine,
                    909: it is easy to connect to another machine that
                    910: has only Ethernet, even one that does not run the
                    911: Ninth Edition system.
                    912: There are two schemes.
                    913: In the first,
                    914: the local operating system contains the TCP/IP protocol
                    915: code, and below the TCP/IP level, the `device' interface is
                    916: actually a Datakit connection to another local machine on both networks.
                    917: Because Datakit channels and the network layer expected by
                    918: TCP/IP have stream interfaces, they are easily connected;
                    919: on the gateway machine,
                    920: the IP packets are routed appropriately.
                    921: This approach transparently handles other services, like UDP,
                    922: that use the IP protocol.
                    923: .PP
                    924: The other scheme uses the methods described in this paper.
                    925: On the Datakit-only machine,
                    926: the TCP network dialout program does not
                    927: use TCP/IP at all, and indeed TCP/IP code need not be configured into
                    928: the operating system;
                    929: instead, it creates a Datakit transport-level connection
                    930: to a protocol-conversion server on a gateway machine.
                    931: A complementary server on the gateway accepts TCP/IP
                    932: connections on behalf of the Datakit-only machine, and forwards them.
                    933: The difference between the two schemes is invisible to
                    934: users of connection-oriented protocols, although it does not support
                    935: connectionless protocols like UDP.
                    936: .SH
                    937: Conclusion
                    938: .PP
                    939: Unix has always had a rich file system structure,
                    940: both in its naming scheme (hierarchical directories)
                    941: and in the properties of open files (disk files, devices, pipes).
                    942: The Eighth Edition exploited the file system even more insistently
                    943: than its predecessors
                    944: or contemporaries of the same genus.
                    945: Remote file systems, process files, and the face server
                    946: all create objects with names that can
                    947: be handed as usefully to an existing tool
                    948: as to a new one designed to take advantage of the object's special
                    949: properties.
                    950: Similarly, the stream I/O system
                    951: provides a framework for making file descriptors
                    952: act in the standard way most programs already expect,
                    953: while providing a richer underlying behavior,
                    954: for handling network protocols, or processing appropriate
                    955: for terminals.
                    956: .PP
                    957: The developments described here follow the same path;
                    958: they encourage use of the file name space
                    959: to establish communication between processes.
                    960: In the best of cases,
                    961: merely opening a named file is enough.
                    962: More complicated situations require more involved negotiations,
                    963: but the file system still supplies the point of contact.
                    964: Moreover, the necessary negotiations
                    965: may be encapsulated in a common form that hides the differences between
                    966: local and any of a variety of remote connections.
                    967: .SH
                    968: References
                    969: .PP
                    970: .]<
                    971: .ds [F 1
                    972: .]-
                    973: .ds [A D. M. Ritchie
                    974: .ds [K bltj
                    975: .ds [T A Stream Input-Output System
                    976: .ds [J AT&T Bell Laboratories Technical Journal
                    977: .ds [D October 1984
                    978: .ds [V 63
                    979: .ds [N 8
                    980: .nr [T 0
                    981: .nr [A 0
                    982: .nr [O 0
                    983: .][ 1 journal-article
                    984: .ds [F 2
                    985: .]-
                    986: .ds [A AT&T
                    987: .ds [T UNIX System V Release 3 STREAMS Programmer's Guide
                    988: .ds [K systemv streams
                    989: .ds [D 1986
                    990: .ds [V 307-227
                    991: .nr [T 0
                    992: .nr [A 0
                    993: .nr [O 0
                    994: .][ 0 other
                    995: .ds [F 3
                    996: .]-
                    997: .ds [A P. J. Weinberger
                    998: .ds [K remote
                    999: .ds [T The Version 8 Network File System
                   1000: .ds [J USENIX Summer Conference Proceedings
                   1001: .ds [D June 1984
                   1002: .ds [C Salt Lake City, UT
                   1003: .nr [T 0
                   1004: .nr [A 0
                   1005: .nr [O 0
                   1006: .][ 1 journal-article
                   1007: .ds [F 4
                   1008: .]-
                   1009: .ds [A T. J. Killian
                   1010: .ds [T Processes as Files
                   1011: .ds [J USENIX Summer Conference Proceedings
                   1012: .ds [D June 1984
                   1013: .ds [C Salt Lake City, UT
                   1014: .nr [T 0
                   1015: .nr [A 0
                   1016: .nr [O 0
                   1017: .][ 1 journal-article
                   1018: .ds [F 5
                   1019: .]-
                   1020: .ds [A R. Pike
                   1021: .as [A " and D. L. Presotto
                   1022: .ds [T Face the Nation
                   1023: .ds [J USENIX Summer Conference Proceedings
                   1024: .ds [D June 1985
                   1025: .ds [C Portland, OR
                   1026: .nr [T 0
                   1027: .nr [A 0
                   1028: .nr [O 0
                   1029: .][ 1 journal-article
                   1030: .ds [F 6
                   1031: .]-
                   1032: .ds [A T. A. Cargill
                   1033: .ds [T The Blit Debugger
                   1034: .ds [J Journal of Systems and Software
                   1035: .ds [V 3
                   1036: .ds [N 4
                   1037: .ds [D December 1983
                   1038: .ds [P 277-284
                   1039: .nr [P 1
                   1040: .ds [K pi
                   1041: .nr [T 0
                   1042: .nr [A 0
                   1043: .nr [O 0
                   1044: .][ 1 journal-article
                   1045: .ds [F 7
                   1046: .]-
                   1047: .ds [A Computer Systems Research Group, U.C. Berkeley
                   1048: .ds [T Unix Programmer's Reference Manual: 4.3 Berkeley Software Distribution
                   1049: .ds [K fourthree bsd
                   1050: .ds [D April, 1986
                   1051: .ds [C Berkeley, California
                   1052: .nr [T 0
                   1053: .nr [A 0
                   1054: .nr [O 0
                   1055: .][ 0 other
                   1056: .ds [F 8
                   1057: .]-
                   1058: .ds [A A. G. Fraser
                   1059: .ds [T Datakit\-A Modular Network for Synchronous and Asynchronous Traffic
                   1060: .ds [J Proc. Int. Conf. on Commun.
                   1061: .ds [D June 1980
                   1062: .ds [C Boston, MA
                   1063: .nr [T 0
                   1064: .nr [A 0
                   1065: .nr [O 0
                   1066: .][ 1 journal-article
                   1067: .nr [W \w'1'
                   1068: .]>
                   1069: .nr [W \w'1'

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.