Programmieren von UNIX-Netzwerken Netzwerk-APIs: Sockets und XTI Bearbeitet von Hans Hajer, W. Richard Stevens 2. Auflage 2000. Buch. XXVI, 982 S. Hardcover ISBN 978 3 446 21334 0 Format (B x L): 21 x 24,4 cm Gewicht: 2300 g Weitere Fachgebiete > EDV, Informatik > Programmiersprachen: Methoden > Netzwerkprogrammierung, Web Services schnell und portofrei erhältlich bei Die Online-Fachbuchhandlung beck-shop.de ist spezialisiert auf Fachbücher, insbesondere Recht, Steuern und Wirtschaft. Im Sortiment finden Sie alle Medien (Bücher, Zeitschriften, CDs, ebooks, etc.) aller Verlage. Ergänzt wird das Programm durch Services wie Neuerscheinungsdienst oder Zusammenstellungen von Büchern zu Sonderpreisen. Der Shop führt mehr als 8 Millionen Produkte.
CARL HANSER VERLAG W. Richard Stevens Programmieren von UNIX-Netzwerken Netzwerk-APIs: Sockets und XTI 2. Auflage 3-446-21334-1 www.hanser.de
XXIII Vorwort Einführung Zur Netzwerkprogrammierung gehört das Erstellen von Programmen, die mit anderen Programmen über ein Computernetzwerk kommunizieren. Ein Programm wird üblicherweise als Client und das andere Programm als Server bezeichnet. Die meisten Betriebssysteme stellen für die Kommunikation über das Netzwerk normalerweise vorkompilierte Programme zur Verfügung Beispiele aus der TCP/IP-Welt sind Web-Clients und -Server, FTP- und Telnet-Clients/Server. Dieses Buch beschäftigt sich allerdings damit, wie Sie Ihre eigenen Netzwerkprogramme schreiben. Wir schreiben diese Netzwerkprogramme mit Hilfe eines Application Program Interface oder API. An dieser Stelle beschreiben wir zwei APIs: 1. Die Sockets, die man manchmal aufgrund ihrer Herkunft aus dem Berkeley-Unix auch als Berkeley- Sockets bezeichnet. 2. Das XTI (X/Open Transport Interface), einer leichten Abwandlung des Transport Layer Interface (TLI), das von AT&T entwickelt wurde. Alle Beispiele im Text sind dem Betriebssystem Unix entnommen, obwohl die meisten benötigten Grundlagen und Konzepte für die Netzwerkprogrammierung systemunabhängig sind. Die Beispiele basieren auch auf der TCP/IP Protokoll-Suite der Versionen 4 und 6. Für den Aufbau von Netzwerkprogrammen muß man das Betriebssystem und die darunterliegenden Netzwerkprotokolle kennen. Dieses Buch baut auf den ersten vier Büchern des Autors auf, die im Text wie folgt abgekürzt werden: APUE: Advanced Programming in the UNIX Environment [Stevens 1992] TCPv1: TCP/IP Illustrated, Volume 1 [Stevens 1994] TCPv3: TCP/IP Illustrated, Volume 2 [Wrigth und Stevens 1994] und TCPv3: TCP/IP Illustrated, Volume 1 [Stevens 1996] Diese zweite Ausgabe des Werkes Programmierung von UNIX Netzwerken (Carl Hanser Verlag 1992) enthält weiterhin Informationen über Unix und die TCP/IP-Protokolle. Damit sich der fortgeschrittene Anwender ausführlicher über die einzelnen Themen informieren kann, finden Sie im Text zusätzlich viele Hinweise auf die anderen vier Werke. Dies gilt insbesondere im Falle von TCPv2, das die aktuelle 4.4BSD-Implementierung der Netzwerk-Programmierfunktionen für das Socket-API (socket, bind, connect etc.) beschreibt. Wenn man einmal die Implementierung einer Funktion verstanden hat, ist deren Einsatz in einer Anwendung sehr viel einleuchtender. Änderungen zur ersten Ausgabe Die zweite Ausgabe stellt eine vollständige Überarbeitung der ersten Ausgabe dar. Diese Änderungen wurden aufgrund der Rückmeldungen notwendig, die ich im Rahmen meines Unterrichts in den Jahren 1990-1996 und bei diversen Diskussionen in den Newsgroups erhielt und die mich auf verschiedene The-
XXIV Vorwort men hinwiesen, die ständig mißverstanden wurden. Nachfolgend finden Sie die wichtigsten Änderungen dieser neuen Ausgabe: In allen Beispielen wird mit ANSI C gearbeitet. Die früheren Kapitel 6 ( Berkeley Sockets ) und 8 ( Bibliotheksfunktionen ) wurden auf 25 Kapitel erweitert. Tatsächlich stellt die Erweiterung dieses Materials wahrscheinlich die größte Änderung zwischen der ersten und der zweiten Version dar. Die meisten Abschnitte in Kapitel 6 wurden zu vollständigen Kapiteln ausgebaut und mit ausführlichen Beispielen versehen. Der TCP- und UDP-Teil des alten Kapitels 6 wurde abgetrennt. Wir decken nunmehr die TCP-Funktionen und ein vollständiges Client-Server-TCP ab, dem die UDP-Funktionen und das Client-Server- UDP folgt. Insbesondere Einsteiger tun sich damit sehr viel leichter als mit einer ausführlichen Beschreibung der connect-funktion und den Hinweisen auf die semantischen Unterschiede zwischen TCP und UDP. Das frühere Kapitel 7 ( System V Transport Layer Interface ) wurde auf sieben Kapitel erweitert. Anstelle des alten TLI behandeln wir das neuere XTI, das es ersetzt. Das frühere Kapitel 2 ( Das Unix-Modell ) wurde nicht wieder aufgenommen. Dieses Kapitel enthielt einen 75-seitigen Überblick über das Unix-System. 1990 benötigten wir dieses Kapitel, da es nur sehr wenige Bücher zu diesem Thema gab, die eine adäquate Beschreibung der grundlegenden Unix-Programmierschnittstellen, insbesondere der Unterschiede zwischen den Berkeley- und System- V-Implementierungen, zur Verfügung stellten. Heutzutage kennen die meisten Leser Unix so gut, daß auf Konzepte wie die Prozeß-IDs, Paßwortdateien, Verzeichnisse und Gruppenkennungen verzichtet werden kann. Einige der fortgeschrittenen Themen aus dem alten Kapitel 2 sind zwar in dieser neuen Ausgabe enthalten, wurden allerdings an die Stellen verschoben, an denen die entsprechenden Funktionen besprochen werden. So behandeln wir beispielsweise die fork-funktion im Zusammenhang mit der Beschreibung des parallelen Servers (Abschnitt 4.8). Bei der Besprechung des SIGCHLD-Signals mit unserem parallelen Server besprechen wir auch viele zusätzliche Funktionen für die Behandlungen der Posix-Signale (Zombies, unterbrochene Systemaufrufe etc.). Soweit wie möglich beschreibt dieses Buch die Posix-Schnittstelle. (Mehr zu den Standards der Posix-Familie erfahren Sie in Abschnitt 1.10). Dazu gehört nicht nur der Posix.1-Standard für die grundlegenden Unix-Funktionen (Prozeßsteuerung, Signale etc.), sondern auch der erweiterte Posix.1g-Standard für die Socket- und die XTI-Netzwerk-APIs, und der 1996 Posix.1-Standard für Threads. Der Begriff Systemaufruf wurde bei der Beschreibung von Funktionen wie socket und connect in Funktion geändert. Damit folgen wir der Posix-Konvention, die zwischen einem Systemaufruf und einer Bibliotheksfunktion unterscheidet. Dabei handelt es sich um ein Implementierungsdetail, das für den Programmierer oftmals nicht relevant ist. Die früheren Kapitel 4 ( Die Grundlagen der Netzwerktechnik ) und 5 ( Kommunikationsprotokolle ) wurden durch den Anhang A, wo die IP-Versionen 4 (IPv4) und 6 (IPv6) besprochen werden, und das Kapitel 2, mit einer Besprechung von TCP und UDP, ersetzt. Dieses neue Material konzentriert sich auf Protokollfragen, mit denen sich die Netzwerkprogrammierer konfrontiert sehen. IPv6 wurde deshalb mit aufgenommen, da durchaus die Möglichkeit besteht, daß dieses Protokoll zukünftig das vorherrschende Netzwerkprotokoll sein wird. Im Zuge meiner Lehrtätigkeit habe ich herausgefunden, daß gut 80 Prozent aller Probleme im Zusammenhang mit der Netzwerkprogrammierung mit der Programmierung als solcher nichts zu tun haben.
XXV Sie haben also nichts mit den API-Funktionen wie accept und select zu tun, sondern lassen sich meistens auf mangelnde Kenntnisse in den zugrundeliegenden Netzwerkprotokollen zurückführen. Wenn die Studenten beispielsweise den Dreiwege-Quittungsbetrieb (Dreiwege-Handshake) von TCP und den Ablauf beim Abbau einer Verbindung verstanden haben, können auch andere Probleme bei der Netzwerkprogrammierung umgehend gelöst werden. Die früheren Abschnitte über XNS, SNA, NetBIOS, die OSI-Protokolle und UUCP wurden herausgenommen, da diese proprietären Protokolle mit dem Einsatz der TCP/IP-Protokolle im Verlauf der 90er Jahre zurückgedrängt wurden. (UUCP ist zwar nicht proprietär und wird auch heute noch häufig verwendet, bietet aber aus Sicht der Netzwerkprogrammierung nur wenige Perspektiven). In diese zweite Ausgabe wurden folgende neue Themen aufgenommen: Die Interoperabilität von IPv4/IPv6 (Kapitel 10) Die protokollunabhängige Namensauflösung (Kapitel 11) Routing-Sockets (Kapitel 17) Multicasting (Kapitel 19) Threads (Kapitel 23) IP-Optionen (Kapitel 24) Zugriff auf die Datenverbindung (Kapitel 26) Alternativen zum Client/Server-Design (Kapitel 27) Virtuelle Netzwerke und Tunneling (Anhang B) und Debugging-Techniken bei der Netzwerkprogrammierung (Anhang C) Leider wurden die Inhalte der ersten Ausgabe in einem Maße erweitert, daß sie nicht mehr in ein einziges Buch passen. Deshalb sind im Zuge der UNIX-Network-Programming-Reihe zumindest zwei weitere Titel geplant: Band 2 trägt den Titel Interprocess Communication, stellt eine Erweiterung des früheren Kapitels 3 dar und umfaßt auch die 1996 Posix.1 Echtzeit-IPC-Mechanismen. Band 3 wird voraussichtlich den Titel Applications tragen und eine Erweiterung der Kapitel 9 18 sein. Obwohl die meisten Netzwerkanwendungen in Band 3 abgedeckt werden, finden sich auch in diesem Band einige spezielle Anwendungen: Ping, Traceroute und inetd. Die Zielgruppen Dieses Buch kann entweder als Lehrbuch über die Netzwerkprogrammierung oder von erfahrenen Netzwerkprogrammierern auch als Referenz verwendet werden. Falls es als Lehrbuch oder Einführung eingesetzt wird, sollte der Schwerpunkt auf Teil 2 ( Grundlegende Sockets, Kapitel 3 bis 9) liegen. Danach können, je nach Interesse, die anderen Kapitel gelesen werden. Teil 2 deckt die grundlegenden Socket- Funktionen für TCP und UDP ab, zusammen mit I/O-Multiplexing, den Socket-Optionen und grundlegenden Namens- und Adreßauflösungen. Kapitel 1 sollte von allen Lesern gelesen werden. Insbesondere
XXVI Vorwort sei auf Abschnitt 1.4 hingewiesen, wo einige Wrapper-Funktionen besprochen werden, die im gesamten Buch zum Einsatz kommen. Der Anhang A sollte, je nach Hintergrundwissen des Lesers, als Referenz verwendet werden. Die meisten Kapitel in Teil 3 ( Fortschrittliche Sockets ) kann man unabhängig vom restlichen Buch lesen. Damit das Werk auch als Referenz dienen kann, werden ein ausführlicher Index und am Ende der einzelnen Kapitel jeweils eine Zusammenfassung zur Verfügung gestellt, mit deren Hilfe eine detaillierte Beschreibung aller Funktionen und Strukturen auffindbar sind. Zusätzlich wurden viele Verweise auf verwandte Themen eingefügt. Obwohl das Socket-API zum De-facto-Standard für die Netzwerkprogrammierung geworden ist, wird XTI auch weiterhin zusammen mit anderen, nicht-tcp Protokoll-Suiten eingesetzt. Während der Umfang von XTI in Teil 4 um einiges geringer als derjenige über Sockets in Teil 2 und 3 ist, beschreiben einige Ausführungen zu den Sockets Konzepte, die sowohl für XTI als auch für Sockets gelten. So sind beispielsweise alle Konzepte hinsichtlich nicht-blockierender I/Os, Broadcasting, Multicasting, signalgesteuerten I/Os, Out-of-Band-Daten und Threads unabhängig vom Einsatz eines bestimmten APIs (Socket oder XTI) gleich. Darüber hinaus sind viele Probleme bei der Netzwerkprogrammierung grundsätzlich ähnlich, wobei es keine Rolle spielt, ob die Programme mit Hilfe von Sockets oder von XTI geschrieben wurden. Nur in den seltensten Fällen kann man mit dem einen API Dinge tun, die bei einem anderen ausgeschlossen sind. Die Konzepte sind die gleichen lediglich die Funktionsnamen und Argumente ändern sich. Quellcodes und Hinweise auf Fehler Die Quellcodes für alle Beispiele in diesem Buch finden Sie unter ftp://ftp.kohala.com/pub/ rstevens/unpv12e.tar.gz. Die beste Möglichkeit zum Erlernen der Netzwerkprogrammierung besteht darin, daß Sie diese Programme ändern und erweitern. Am Ende jedes Kapitels finden Sie zahlreiche Übungen, wobei die meisten Fragen in Anhang E beantwortet werden. Aktuelle Fehlerhinweise zu diesem Buch finden Sie auf meiner Homepage. Tucson, Arizona September 1997 W. Richard Stevens rstevens@kohala.com http://www.kohala.com/~rstevens