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