Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ tcp(7) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

sysctl(1M)

read(2)

write(2)

accept(3N)

bind(3N)

connect(3N)

getprotoent(3N)

getsockopt(3N)

listen(3N)

send(3N)

inet(7)

ip(7)

tcp(7)                                                               tcp(7)

NAME
     tcp - Internet Transmission Control Protocol

SYNTAX
     #include <sys/socket.h>
     #include <netinet/in.h>

     s = socket(AFINET, SOCKSTREAM, 0);

     t = topen("/dev/tcp", ORDWR);

BESCHREIBUNG
     TCP ist das Protokoll der Internet-Protokollfamilie für virtuelle Ver-
     bindungen. Es bietet zuverlässige Zweiweg-Datenübertragung mit Fluß-
     kontrolle und Einhaltung der Reihenfolge der zu übertragenden Pakete.
     Es handelt sich dabei um ein an Byte-Streams orientiertes Protokoll.
     Es baut auf dem Internet-Protokoll (IP) auf, dem netzübergreifenden
     Protokoll der Internet-Protokollfamilie zum Transport von Datagrammen.

     Programme können unter Verwendung der Socket-Schnittstelle mit
     SOCKSTREAM als Socket-Typ auf TCP zugreifen, oder aber unter Verwen-
     dung der Schnittstelle auf Transportebene (Transport Level Interface,
     TLI); hier wird der verbindungsorientierte Dienst (TCOTSORD) unter-
     stützt.

     TCP verwendet die Adressierung auf Rechnerebene von IP und fügt dem
     eine eindeutige "Portnummer" hinzu. Die Endpunkte einer TCP-Verbindung
     werden durch die Kombination aus einer IP-Adresse und einer TCP-Port-
     nummer gebildet. Obwohl auch andere Protokolle, wie das User Datagram
     Protocol (UDP) dasselbe Adreßformat mit Rechner- und Portadresse ver-
     wenden können, ist der Adreßraum für Portadressen unterschiedlich.
     Unter inet(7) finden Sie Einzelheiten zu den gemeinsamen Aspekten der
     Adressierung innerhalb der Internet-Protokollfamilie.

     Sockets, die TCP verwenden, sind entweder "aktiv" oder "passiv".
     Aktive Sockets initiieren Verbindungen zu passiven Sockets. Beide
     Typen von Sockets müssen nach der eigentlichen Socket-Erzeugung mit
     bind(3N) ihre lokale IP-Adresse und TCP-Portnummer an den Socket
     gebunden haben. Standardmäßig sind TCP-Sockets aktiv. Ein passiver
     Socket wird durch den Systemaufruf listen(3N) erzeugt, nach dem Binden
     des Sockets an die lokale Adresse mit bind(). Dadurch wird für den
     passiven Socket eine Warteschlange eingerichtet. Danach können Verbin-
     dungen zu dem passiven Socket mit Hilfe des Systemaufrufs accept(3N)
     empfangen werden. Aktive Sockets verwenden nach dem Binden der lokalen
     Adresse den Systemaufruf connect(3N) um eine Verbindung zu initiieren.










Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

tcp(7)                                                               tcp(7)

     Durch Verwendung der speziellen Adresse INADDRANY ist es möglich,
     beim bind()-Aufruf die lokale IP-Adresse unspezifiziert zu lassen, und
     zwar sowohl bei aktiven als auch bei passiven TCP-Sockets. Diese Mög-
     lichkeit wird meist dann genutzt, wenn die lokale Adresse entweder
     unbekannt oder nicht relevant ist. Wenn die lokale IP-Adresse unspezi-
     fiziert bleibt, wird der Socket zum Zeitpunkt des Verbindungsaufbaus
     an die Adresse der Netzschnittstelle gebunden, die für diese Verbin-
     dung verwendet wird.

     Ist eine Verbindung eingerichtet, können mit den Systemaufrufen
     read(2)- und write(2)-Daten ausgetauscht werden.

     TCP unterstützt eine Reihe von Socket-Optionen. Diese können mit
     setsockopt(3N) gesetzt und mit getsockopt(3N) abgefragt werden.

     TCPKEEPALIVE
          Diese Option dient zum Einstellen der Leerlaufzeit, nach der TCP
          mit Proben das Existieren des Partners prüft. Die eingestellte
          Zeit wirkt sich nur aus, wenn die Socket-Option SOKEEPALIVE ein-
          geschaltet ist. Wird TCPKEEPALIVE nicht verwendet und
          SOKEEPALIVE ist eingeschaltet, so gilt als Leerlaufzeit die
          Standardeinstellung des Systems [siehe die Variable
          TCPTVKEEPIDLESECS in /etc/conf/cf.d/mtune bzw. das Kommando
          sysctl(1M)].

     TCPMAXSEG
          Mit dieser Option kann die maximale Segmentgröße (maximum segment
          size - MSS) der TCP-Verbindung gesetzt oder abgefragt werden. Die
          maximale Segmentgröße kann jedoch nur auf einen kleineren Wert
          als der, den man durch TCPMAXSEG abfragen kann, gesetzt werden.

     TCPNODELAY
          In den meisten Fällen sendet TCP Daten, sobald sie anfallen. Ste-
          hen jedoch noch Bestätigungen für gesendete Daten aus, so werden
          kleine Datenpakete gesammelt, um als einzelnes Paket auf einmal
          gesendet zu werden, sobald eine Bestätigung eingetroffen ist
          (Nagle-Algorithmus). Für eine kleine Zahl von Anwendungen, wie
          zum Beispiel Window-Systeme, die einen Strom von einzelnen Ereig-
          nissen im Zusammenhang mit der Maus übertragen und dazu kleine
          Antworten erhalten, bedeutet diese Paketierung eine deutliche
          Verzögerung. Um diese zu umgehen kann mit der boolschen Option
          TCPNODELAY die automatische Paketierung abschalten.

     Die Optionen sind in /usr/include/netinet/tcp.h definiert. Die Opti-
     onsebene für den setsockopt(3N)-Aufruf ist die TCP-Protokollnummer,
     wie sie durch getprotobyname() erfragt werden kann [siehe
     getprotoent(3N)].

     Optionen der IP-Schicht können auch für TCP verwendet werden [siehe
     ip(7)].




Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

tcp(7)                                                               tcp(7)

     TCP bietet einen Mechanismus zur Übertragung von Dringlichkeitsdaten.
     Er ist verfügbar durch die Verwendung der "out-of-band"-Option von
     send(3N). Der Aufrufer kann eines der Bytes mit der Option MSGOOB für
     send(3N) als "urgent" (dringend) markieren. Dadurch wird der "Urgent-
     Pointer" so gesetzt, daß er auf dieses Byte im TCP-Byte-Stream zeigt.
     Der Empfänger auf der anderen Seite des Streams wird von der dringen-
     den Nachricht durch das Signal SIGURG benachrichtigt. Die ioctl()-
     Anforderung SIOCATMARK liefert einen Wert, der anzeigt, ob der Lese-
     zeiger im Datenstrom an der Dringlichkeitsmarkierung steht, oder
     nicht. Da das System niemals Daten über die Dringlichkeitsmarkierung
     hinaus zu einem einzelnen Aufruf von read(2) zurückliefert, kann man
     in einer einfachen Schleife bis zu der Dringlichkeitsnachricht lesen.
     In der Schleife wird nach jedem Lesen der Socket mit der ioctl()-
     Anforderung SIOCATMARK überprüft, bis die Markierung erreicht ist.

     Eingehende Anforderungen für einen Verbindungsaufbau mit gesetzter
     IP-Option zur Wegewahl durch den Sender (source route option) werden
     registriert. Für Antworten wird in diesem Falle der durch den
     ursprünglichen Sender gewählte Weg in umgekehrter Reihenfolge verwen-
     det.

     Eine Prüfsumme, die über alle Datenbytes berechnet wird, verhilft TCP
     zu einer gewissen Zuverlässigkeit. TCP verwendet eine auf Sendefenster
     basierende Flußsteuerung unter Verwendung von positiven Bestätigungen,
     einer laufenden Sequenznummer und einer Strategie zur Wiederholung
     einer gescheiterten Datenübertragung. Deshalb ist TCP in der Regel in
     der Lage, damit fertig zu werden, daß einzelne Datagramme durch das
     unterliegende Kommunikationsprotokoll beschädigt, verzögert, doppelt
     oder außer der Reihe ausgeliefert werden.

     Erhält das lokale TCP über eine bestimmte Zeit hinweg keine Bestäti-
     gungen von seinem Partner, zum Beispiel bei Ausfall des anderen Rech-
     ners, so wird die Verbindung geschlossen und an den Benutzer eine Feh-
     lermeldung zurückgeliefert. Wird der andere Rechner neu gebootet, oder
     verliert er auf eine andere Art und Weise die Zustandsinformation über
     eine TCP-Verbindung, so wird die Verbindung abgebrochen und an den
     Benutzer eine Fehlermeldung zurückgeliefert.

     Reliant UNIX unterstützt die "TCP Extensions for High Performance"
     (RFC 1323). Diese beschreibt die "window scale"- und "time stamp"-
     Optionen, außerdem "Protection Against Wrap Around Sequence Numbers"
     (PAWS). Die "window scale"- und "time stamp"-Optionen können global
     ein-/ausgeschaltet werden [mit dem Kommando sysctl(1M)]. PAWS wird
     immer benutzt, wenn die "time stamp"-Option eingeschaltet ist.

     Reliant UNIX unterstüzt TCP für Transaktionen (T/TCP, RFC 1379) und
     "PATH MTU Discovery" (RFC 1191). "PATH MTU Discovery" kann global
     ein-/ausgeschaltet werden [mit dem Kommando sysctl(1M)].






Seite 3                      Reliant UNIX 5.44               Gedruckt 11/98

tcp(7)                                                               tcp(7)

DIAGNOSE
     Eine Socket-Operation scheitert, wenn:

     EISCONN        Es wurde versucht, connect() auf einem Socket aufzuru-
                    fen, auf dem connect() bereits ausgeführt wurde.

     ETIMEDOUT      Eine Verbindung wurde aufgrund übermäßiger Übertra-
                    gungswiederholungen abgebrochen.

     ECONNRESET     Der andere Kommunikationsteilnehmer erzwang einen Ver-
                    bindungsabbruch (meistens weil der andere Rechner die
                    Zustandsinformation der Verbindung aufgrund eines
                    Systemabsturzes verloren hat).

     ECONNREFUSED   Der andere Kommunikationspartner verweigert aktiv den
                    Verbindungsaufbau (meistens, weil kein Prozeß auf dem
                    gewünschten Port wartet).

     EADDRINUSE     Es wurde versucht, auf einem Socket die Operation
                    bind() unter Angabe einer Netzadresse und einer Port-
                    nummer auszuführen, die bereits an einen anderen Socket
                    gebunden waren.

     EADDRNOTAVAIL  Es wurde versucht, auf einem Socket die Operation
                    bind() mit einer Netzadresse auszuführen, für die keine
                    Netzschnittstelle existiert.

     EACCES         Es wurde versucht, die Operation bind() mit einer
                    "reservierten" Portnummer auszuführen, ohne daß die
                    effektive Benutzernummer des Prozesses gleich der des
                    privilegierten Benutzers war.

     ENOBUFS        Speicherplatz für interne Datenstrukturen im System
                    wurde knapp.

SIEHE AUCH
     sysctl(1M), read(2), write(2), accept(3N), bind(3N), connect(3N),
     getprotoent(3N), getsockopt(3N), listen(3N), send(3N), inet(7), ip(7).

     Postel, Jon, Transmission Control Protocol - DARPA Internet Program
     Protocol Specification, RFC 793, Network Information Center, SRI
     International, Menlo Park, Calif., September 1981.












Seite 4                      Reliant UNIX 5.44               Gedruckt 11/98

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026