Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

read(2)

write(2)

connect(3N)

getsockopt(3N)

recv(3N)

send(3N)

routing(4)

icmp(7)

if(7)

inet(7)

tcp(7)

udp(7)

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

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