orm@doc-tcpip.org | Erstellt: April 1999 - Letzte Modifikation: Juli 2001 |
Ports und Sockets sind vom Prinzip her mineinander eng verbandelt - deshalb auch hier zusammen.
Wollen zwei Prozesse miteinander kommunizieren, egal ob über das Netz oder Systemintern, dann identifizieren sich die Prozesse gegenüber TCP/IP mit einer Port-Nummer. Das ist eine 16bittige Zahl, es gibt also 65535 Ports für jedes Transport-Protokoll (UDP und TCP). Die Port-Nummer sagt also aus, an welchen Prozess ein bestimmtes Paket weitergereicht werden möchte. Die Prozesse müssen vorher für Klarheit gesorgt haben, welche Ports sie benutzen wollen. Teilweise geschieht das "on the fly", teilweise sind Portnummern fest vorgegeben: "well known ports". Diese werden immer von den entsprechenden "well known services" benutzt, also zB. portmap-Service, DNS, DHCP etc.
Das ist ein wenig schwierig: Information gibt es über alle Ports bei
der IANA (
Internet Assigned Numbers Authority, www.iana.org
).
Richtig vergeben bzw. kontrolliert werden aber nur die Ports zwischen
0 und 1023 - die "well known ports". Auf den meisten Systemen steht
die Benutzung dieser Ports nur dem Root-User offen (bzw. Services mit
diesen Rechten).
Der Bereich von 1024 - 49151 ist zur Registrierung freigegeben - jeder kann
sich einen Port für seine Applikation reservieren, wenn er darlegt,
was er warum
machen möchte (die IANA unterschreibt auch Non-Disclosure Agreements).
Diese Ports stehen aber nicht unter der Kontrolle der IANA - es ist nur eine
gute Idee, sich einen Port für eine Applikation mit breiter Anwendung
registrieren zu lassen.
Die anderen Ports bis 65535 sind dynamisch bzw. für privaten Gebrauch.
Diese Ports werden teilweise als "ephemeral" (also flüchtige)
Ports bezeichnet (von AIX z.B.).
Früher stand soetwas im RFC1700, heute gibt es eine Web-Seite:
Hier sind aktuell alle der IANA bekannten Ports aufgeführt.
Man kann meist Einfluss darauf nehmen, wie das Betriebssystem die Port
einteilt. Unter AIX sieht man das mit dem Kommando no -a:
tcp_ephemeral_low = 32768
tcp_ephemeral_high = 65535
udp_ephemeral_low = 32768
udp_ephemeral_high = 65535
"Ephemeral" sind die dynamischen, flüchtigen Ports. Sowohl für
TCP wie auch für UDP kann man den Bereich festlegen, der für
flüchtige Prots zur Verfügung stehen soll.
Im Prinzip sind Sockets ein Application Programming Interface (API) für die Kommunikations Protokolle. Es wurde in 4.2BSD eingeführt und ist de facto Standard. Es gibt zwei Socket "Familien": Internet und Unix-Domain. 4.3BSD brachte dann Unterstützung für das Xerox Network System. 4.4BSD brachte Unterstützung für die ISO OSI Protokolle. AIX unterstützt Internet (AF_INET) und Unix-Domain Sockets (AF_UNIX).
Praktisch ist ein Socket der Endpunkt einer Verbindung, entweder über das Netz oder intern auf einem System. Es werden beim " öffnen" eines Sockets die entsprechenden Datenstrukturen angelegt und es ist dabei möglich, die Parameter, die diese Verbindung betreffen, gezielt festzulegen. Dazu dienen die Kontroll-Blöcke, der Protocol Control Block (PCB) und die Kontroll-Bläöcke für UDP, TCP und andere ( z.B. raw sockets).
Unter Unix ist alles ein File, also auch ein Socket. Man betrachtet einen Socket deshalb als Filehandle, der zum Anfordern von Netzwerk- Services durch einen Prozess benutzt wird. Der Prozess schreibt also die zu sendenten Daten als Strom einfach auf den Socket, so wie auch auf ein File geschrieben würde. Im Fall von UDP ist der Prozess dafür verantwortlich, das die Datagramme die richtige Größe haben.
Der Socket wird durch folgendes "Triple" adressiert:
Protocol, lokale Adresse, lokaler Prozess (Port)
Für einen Netzwerk-Socket (also im Rahmen von TCP/IP) sähe das so aus:
tcp, 192.168.140.5, 1234
Das ist jetzt die eine Seite einer Verbindung, einer "Association".
Jetz kommt noch die andere Seite dazu:
Protocol, lokale Adresse, lokaler Prozess (Port),
remote Adresse, remoter Prozess (Port)
Also zwei Socket-Adressen und ein gemeinsames Protokoll:
tcp, 192.168.140.5, 1234, 192.168.140.89, 23
Das wäre also ein Telnet (Port 23) von der Maschine .89 zu Port 1234
auf Maschine .5.
Ein Socket ist also der Endpunkt einer Verbindung über das Netz.
Durch die Kombination von IP-Adresse und Port-Nummer ist er auf der
Welt einmalig. Zwei Sockets geben die ganze Verbindung.
Auf der Basis von Sockets und damit von Ports wird die Multiplex-Datenübertragung (alle Information auf einem gemeinsamen Draht) wieder in ihre einzelnen Verbindungen aufgespalten: das Demultiplexing.
____________ ____________ ____________ | Prozess1 | | Prozess2 | | Prozess3 | ------------ ------------ ------------ . Port x Port y Port z . Ein Transport Protokoll - UDP oder TCP . Das Internet ProtokollJedem Prozess ist ein Port zugeordnet. Von der IP-Schicht weiter gegebene Pakete werden zuerst nach dem Transportprotokoll getrennt und dann den einzelnen Ports zugeordnet.
Initialisieren:
int sockfd = socket(int family, int type, int protocol)
family: die Adress-Familie: AF_INET, AF_UNIX, AF_NS, AF_IUCV.
Welche Methode soll
der Socket benutzen?
type: was für eine Art Socket soll es werden: SOCK_STREAM, SOCK_DGRAM,
SOCK_RAW, SOCK_SEQPACKET
protocol: UDP, TCP, IP, ICMP
sockfd: das ist die Integer Zahl, die auf einen Socket Call
zurückgegeben wird.
Wie ein File Handle.
Einen Socket an eine Port Adresse binden: int bind(int sockfd, struct sockaddr *localaddr, int addrlen)
[ Allgemein | UNIX | AIX | TCP-IP | TCP | ROUTING | DNS | NTP | NFS | FreeBSD | Linux | RPi | SMTP | Tracing | GPS | LW ]
Copyright 2001-2021 by Orm Hager - Es gilt die GPL