ip(7) ip(7)
NAME
ip - Internet-Protokoll
SYNTAX
#include <sys/socket.h>
#include <netinet/in.h>
s = socket(AFINET, SOCKRAW, proto);
t = topen ("/dev/rawip", ORDWR);
d = open ("/dev/ip", ORDWR);
BESCHREIBUNG
IP ist das netzwerkübergreifende, zentrale Übertragungsprotokoll für
Datagramme der Internet-Protokollfamilie. Programme können IP durch
höhere Protokolle verwenden, wie beispielsweise das Transmission Con-
trol Protocol (TCP) oder das User Datagram Protocol (UDP), oder sie
können die IP-Schnittstelle direkt ansprechen [siehe tcp(7) und
udp(7)]. Der direkte Zugriff ist über die Socket-Schnittstelle (unter
Verwendung eines Raw-Sockets) möglich, oder unter Verwendung der
Schnittstelle auf Transportebene (Transport Level Interface, TLI). Die
in der IP-Spezifikation angegebenen Protokolloptionen können in abge-
henden Datagrammen gesetzt werden.
Der STREAMS-Treiber /dev/rawip ist der Dienstanbieter über TLI, der
den direkten (RAW) Zugriff auf IP ermöglicht. Der Gerätetreiber
/dev/ip ist der Multiplex-STREAMS-Treiber, der das eigentliche Proto-
koll von IP implementiert. Der letztere steht nach unten mit Dienstan-
bietern für die Datenübertragung [Gerätetreiber, siehe if(7)] in Ver-
bindung, und nach oben mit Dienstanbietern für Transportverbindungen
wie TCP und UDP.
Raw IP-Sockets sind verbindungslos und werden normalerweise in Aufru-
fen von sendto() und recvfrom() verwendet [siehe send(3N) und
recv(3N)], allerdings kann auch ein Aufruf von connect(3N) verwendet
werden, um den Empfänger aller weiteren Datagramme fest einzustellen
[in diesem Falle können die Funktionen read(2) oder recv(3N) und
write(2) oder send(3N) verwendet werden]. Ist proto gleich Null, so
wird standardmäßig das Protokoll IPPROTORAW verwendet. Wenn proto
ungleich Null ist, so wird diese Protokollnummer in abgehenden Data-
grammen und als Filter für eingehende Datagramme verwendet. Ein IP-
Vorspann wird für jedes abgehende Datagramm erzeugt und ihm vorange-
stellt; empfangene Datagramme werden mit einem intakten IP-Vorspann
und -Optionen abgeliefert.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
ip(7) ip(7)
Die Option IPOPTIONS auf IP-Ebene kann dazu verwendet werden, IP-Op-
tionen in jedem abgehenden Datagramm zu setzen. Zu sendende IP-Optio-
nen werden mit setsockopt() gesetzt [siehe getsockopt(3N)]. Der Aufruf
von getsockopt(3N) liefert die IP-Optionen, die im letzten Aufruf von
setsockopt() gesetzt waren. IP-Optionen von empfangenen Datagrammen
sind für Benutzerprogramme nur bei Verwendung der raw IP-Sockets
sichtbar. Das Format von IP-Optionen, wie sie durch setsockopt()
geliefert werden, entspricht jenen, die in der IP-Spezifikation ange-
geben werden, allerdings mit einer Ausnahme: bei den Optionen zur
Angabe des Routing (Übertragungsweges) muß die Liste der Adressen der
Gateways (Verbindungsrechner) die Adresse des ersten Verbindungsrech-
ners an der ersten Stelle enthalten. Die Adresse des ersten Verbin-
dungsrechners wird von der Liste entfernt und deren Größe wird vor
ihrer Verwendung entsprechend angepaßt. IP-Optionen können mit jedem
Socket-Typ aus der Internet-Familie verwendet werden.
Auf Socket-Ebene kann die Option SODONTROUTE angewendet werden. Diese
Option erzwingt, daß beim Senden eines Datagramms die Ermittlung der
Route bei der Ausgabe ausgelassen wird. Normalerweise wählt IP eine
Netzwerk-Schnittstelle und möglicherweise einen ersten Gateway, an die
das Datagramm wird gesendet, aufgrund eines Eintrags in der internen
Routing-Tabellen; siehe routing(4). Wenn SODONTROUTE gesetzt ist,
wird das Datagramm unter Verwendung der Schnittstelle gesendet, deren
Netzwerknummer oder deren vollständige IP-Adresse der Zieladresse ent-
spricht. Paßt die Adresse zu keiner der Schnittstellen, so wird der
Fehler ENETUNREACH zurückgeliefert.
Raw IP-Datagramme können auch gesendet und empfangen werden, wenn man
die TLI-Aufrufe für den verbindungslosen Betrieb verwendet.
Datagramme durchqueren die IP-Schicht in zwei Richtungen: vom Netzwerk
aufwärts zum Benutzerprozeß und vom Benutzerprozeß abwärts zum Netz-
werk. Verwendet man diese Terminologie, so liegt das IP oberhalb der
Treiber für die Netzwerk-Schnittstellen und unterhalb der Transport-
protokolle wie UDP und TCP. Das Internet Control Message Protocol
(ICMP) ist logisch gesehen ein Bestandteil des IP [siehe icmp(7)].
IP sorgt für eine Prüfsumme über seinen Header, nicht jedoch über den
Datenteil des Datagramms. Die Prüfsumme wird berechnet und gesetzt
während des Sendens der Datagramme, und sie wird überprüft beim Emp-
fangen der Datagramme. Das Bilden von Prüfsummen durch IP kann zur
Fehlersuche für empfangene Datagramme unterbunden werden, indem die
Kernvariable ipcksum auf den Wert Null geändert wird.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
ip(7) ip(7)
IP-Optionen in eingehenden Datagrammen werden in der IP-Schicht gemäß
der Protokollspezifikation bearbeitet. Die derzeit erkannten IP-Optio-
nen beinhalten: "security" (Sicherheit), "loose source and record
route" (LSRR = gelockertes Routing), "strict source and record route"
(SSRR = strenges Routing), "record route" (Einzelpaket-Routing),
Stream-Bezeichner und Internet-Zeitstempel.
Die IP-Schicht wird normalerweise empfangene Datagramme, die nicht an
sie selbst adressiert sind, weiterleiten. Dieses Weiterleiten wird
durch die Kernvariable ipforwarding gesteuert: ist ipforwarding gleich
Null, so werden IP-Datagramme nicht weitergeleitet; ist ipforwarding
gleich Eins, so werden IP-Datagramme weitergeleitet. ipforwarding wird
normalerweise nur in Rechnern mit mehr als einer Netzwerk-Schnitt-
stelle (Netzwerke-Verbindungsrechner, internetwork routers) auf Eins
gesetzt. Diese Kernvariable kann verändert werden, um die Weiterlei-
tung von Datagrammen ein- und auszuschalten.
Die IP-Schicht sendet in vielen Fällen, in denen sie ein Datagramm
empfängt, das sie nicht bearbeiten kann, eine ICMP-Nachricht an den
Absender zurück. Eine ICMP-Nachricht "time exceeded" (Zeitüberschrei-
tung) wird gesendet, sobald während des Weiterleitens eines Pakets der
Wert des Feldes "time to live" (Lebenszeit) im IP-Vorspann auf Null
fällt. Eine Nachricht "destination unreachable" (Ziel nicht erreich-
bar) wird gesendet, wenn sich eine Nachricht aufgrund eines fehlenden
Übertragungswegs nicht zum Ziel weiterleiten läßt, oder wenn sie nicht
fragmentiert werden kann. Dieselbe Nachricht wird auch gesendet, wenn
das Datagramm an den lokalen Rechner, dort jedoch an ein nicht unter-
stütztes Protokoll oder an einen nicht benutzten Port adressiert ist.
Die IP-Schicht kann eine ICMP-Nachricht "source quench" (Datenstrom an
der Quelle verlangsamen) senden, wenn sie zu schnell aufeinanderfol-
gende Datagramme empfängt. ICMP-Nachrichten werden nur für den ersten
Teil eines zerlegten Datagramms gesendet, und sie werden niemals als
Reaktion auf Fehler in anderen ICMP-Nachrichten erzeugt.
Die IP-Schicht unterstützt die Fragmentiering und das Wiederzusammen-
fügen von Datagrammen. Datagramme werden bei der Ausgabe in mehrere
Teile aufgeteilt, wenn sie größer sind als die maximale Übertragungs-
einheit (MTU) der Netzwerk-Schnittstelle. Bereits empfangene Teile
eines aufgeteilten Datagramms werden beim Empfang gelöscht, wenn sich
das komplette Datagramm nicht innerhalb einer kurzen Zeitspanne voll-
ständig rekonstruieren läßt.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
ip(7) ip(7)
MULTICAST-OPTIONEN
IP-Multicasting wird nur für AFINET-Sockets vom Typ SOCKDGRAM und
SOCKRAW, und nur für Netzwerke mit multicast-fähigen Treibern, unter-
stützt. Es werden auch nur Stream-Sockets und X-Sockets unterstützt.
Die Option IPMULTICASTTTL setzt das "time-to-live"-Feld (TTL) gesen-
deter Multicast-Pakete:
uchar ttl; /* range: 0 to 255, default = 1 */
setsockopt(s, IPPROTOIP, IPMULTICASTTTL, &ttl, sizeof(ttl));
Datenpakete mit einem TTL-Wert von 1 werden nicht über das lokale Netz
hinaus weitergeleitet. Multicast-Pakete mit einem TTL-Wert 0 werden
nicht gesendet, können aber lokal empfangen werden (wenn die
Multicast-Loopback-Option nicht verwendet wurde). Multicast Pakete mit
einem TTL-Wert größer als 1 können an andere Netze weitergeleitet wer-
den, wenn sich im lokalen Netz ein Multicast-Router befindet.
Die Option IPMULTICASTIF setzt die Netzwerkschnittstelle, über die
für einen gegebenen Socket Daten ausgetauscht werden:
struct inaddr addr;
setsockopt(s, IPPROTOIP, IPMULTICASTIF, &addr, sizeof(addr));
wobei addr die lokale IP-Adresse der zu verwendenden Netzwerk-Schnitt-
stelle, oder INADDRANY für die Standard-Schnittstelle ist. Die lokale
IP-Adresse, sowie die Multicast-Eigenschaften einer Schnittstelle,
können über die ioctl-Aufrufe SIOCGIFCONF (liefert die Provider-Konfi-
guration) und SIOCGIFFLAGS (liefert die Schnittstellen-Flags) gelesen
werden. Normale Anwendungen sollten diese Optionen nicht benötigen.
Wenn ein Multicast-Paket an eine Gruppe gesendet wird, der der Sender
ebenfalls angehört, wird eine Kopie des Pakets durch die IP-Schicht
über die Loopback-Schnittstelle zurückgeschickt. Durch die Option
IPMULTICASTLOOP läßt sich kontrollieren, ob nachfolgende Pakete
zurückgeschickt werden, oder nicht:
uchar loop; /* 0 = ausschalten, 1 = einschalten (default) */
setsockopt(s, IPPROTOIP, IPMULTICASTLOOP, &loop, sizeof(loop));
Diese Option verbessert den Datendurchsatz für Anwendungen, die auf
einer Maschine als einzelner Prozeß laufen (z. B. Routing-Dämonen),
sollte aber nicht von Anwendungen verwendet werden, die auf einer
Maschine mehrfach laufen (z. B. Videokonferenz-Software) oder von
Anwendungen, die der entsprechenden Multicast-Gruppe nicht angehören.
Ein Multicast-Paket, welches mit einem TTL-Wert größer als 1 gesendet
wurde, kann von dem Sender an einer anderen Schnittstelle empfangen
werden, wenn der Sender an dieser Schnittstelle der entsprechenden
Multicast-Gruppe angehört. Die Loopback-Option IPMULTICASTLOOP hat
darauf keinen Einfluß.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
ip(7) ip(7)
Um Multicast-Pakete, die an eine bestimmte Multicast-Gruppe gesendet
wurden empfangen zu können, muß der Sender mit der Option
IPADDMEMBERSHIP Mitglied dieser Multicast-Gruppe werden:
struct ipmreq mreq;
setsockopt(s, IPPROTOIP, IPADDMEMBERSHIP, &mreq, sizeof(mreq));
wobei mreq folgende Struktur ist:
struct ipmreq {
struct inaddr imrmultiaddr; /* multicast group to join */
struct inaddr imrinterface; /* interface to join on */
}
Für die Adresse imrinterface sollte INADDRANY für die Standard-
Multicast-Schnittstelle, oder die IP-Adresse einer multicast-fähigen
Schnittstelle eingetragen werden. Die Mitgliedschaft einer bestimmten
Multicast-Gruppe bezieht sich nur auf eine Schnittstelle. Anwendungen,
die auf einer Maschine mit mehr multicast-fähigen Schnittstellen lau-
fen, sollten Mitglied derselben Multicast-Gruppe auf mehreren Schnitt-
stellen werden. Für einen Socket sind maximal IPMAXMEMBERSHIPS (Vor-
einstellung: 20) Mitgliedschaften möglich.
Um eine Multicast-Gruppe zu verlassen, verwenden Sie:
struct ipmreq mreq;
setsockopt(s, IPPROTOIP, IPDROPMEMBERSHIP, &mreq, sizeof(mreq));
wobei mreq dieselben Werte, wie für die Mitgliedschaft beinhaltet.
Multicast-Gruppen werden verlassen, wenn der Socket geschlossen wird
oder wenn sich der Prozeß beendet.
DIAGNOSE
Eine Operation auf einem Socket kann unter Angabe einer der folgenden
Fehlerbedingungen scheitern:
EACCESS Als Zieladresse wurde eine IP-Broadcastadresse verwen-
det, und der Aufrufer war nicht der privilegierte
Benutzer.
EISCONN Es wurde versucht, eine Verbindung auf einem Socket
einzurichten, der bereits über eine eingerichtete Ver-
bindung verfügte, oder es wurde versucht, ein Datagramm
unter Angabe einer Zieladresse zu senden, obwohl der
Socket bereits einer Verbindung zugeordnet war.
EMSGSIZE Es wurde versucht, ein Datagramm zu senden, das für
eine Schnittstelle zu groß war und das nicht fragmen-
tiert werden darf (wie beispielsweise ein Broadcast).
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
ip(7) ip(7)
ENETUNREACH Es wurde versucht, beim Verbindungsaufbau oder beim
Senden eines Datagramms eine Adresse zu verwenden, für
die es keinen passenden Eintrag in der Routing-Tabelle
gab, oder eine ICMP-Meldung "destination unreachable"
(Ziel nicht erreichbar) wurde empfangen.
ENOTCONN Ohne Angabe einer Zieladresse wurde ein Datagramm
gesendet, über einen Socket, für den keine Verbindung
eingerichtet war.
ENOBUFS Das System hat keinen Speicher für Puffer zum Speichern
von aufgeteilten Paketen oder anderer interner Daten-
strukturen.
EADDRNOTAVAIL Es wurde versucht, einen Socket mit einer lokalen
Adresse zu erzeugen, die zu keiner der Netzwerk-
Schnittstellen paßt, oder es wurde eine IP-Rundruf-
adresse (broadcast) verwendet, obwohl die Schnittstelle
keine Broadcasts unterstützt.
Folgende Fehler können beim Setzen oder Erfragen von IP-Optionen auf-
treten:
EINVAL Eine unbekannte Socket-Option wurde angegeben.
EINVAL Das IP-Optionsfeld war nicht korrekt gebildet; das
Optionsfeld war kürzer als der Minimalwert oder größer
als der vorgesehene Puffer für die Optionen.
HINWEISE
Raw Sockets sollten ICMP-Fehler-Pakete mit Bezug auf das Protokoll
empfangen; zur Zeit werden solche Pakete einfach entfernt.
Benutzer von höherwertigen Protokollen wie TCP und UDP sollten in der
Lage sein, empfangene IP-Optionen zu sehen.
SIEHE AUCH
read(2), write(2), connect(3N), getsockopt(3N), recv(3N), send(3N),
routing(4), icmp(7), if(7), inet(7), tcp(7), udp(7).
Postel, Jon, Internet Protocol - DARPA Internet Program Protocol
Specification, RFC 791, Network Information Center, SRI International,
Menlo Park, Calif., September 1981.
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98