Socket Schnittstelle © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Socket Schnittstelle Wortbedeutung engl. „socket“ = Steckdose BSD = Berkeley Software Distribution Definition Standard-Schnittstelle zur Programmierung Für IP, TCP, UDP Geschichte Eingeführt 1982 in BSD Unix Version 4.1 c Hier: Generisches UNIX (SunOS, BSD, Solaris) Formen Berkeley Sockets (BSD) System 5 Transport Layer Interface (TLI) WinSock (MS Implementierung) C++ Socket Library Standard, aber in den “feinen” Details stark unterschiedlich © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Socket Dienste Datagram Stream Raw UDP TCP Packet Local IP Data Link Layer © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle OS Kern Socket Dienste Datagram UDP / IP l Modelliert klassische UDP Funktionalität Stream TCP / IP l Modelliert klassische TCP Funktionalität Integrität Reihenfolge Verlust Verdoppelung Kommata Raw IP l Modelliert IP Protokoll, nicht stark portabel, nicht (so) überall verfügbar Packet Link Layer l Modelliert Data Link Layer Zugang (meist: Ethernet) l Kaum portabel, stark OS-Versionsabhängig Local Lokal auf der Maschine selber © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Parameter der Funktionsaufrufe Lokale IP Adresse & Portnummer Protokoll (raw, UDP, TCP) Entfernte IP Adresse & Portnummer, falls verbunden Buffergrössen TCP States & Parameter © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle socket, listen, bind socket (int domain, int type, int protocol) l erzeugt einen lokalen Socket der vorgegebenen Adressfamilie l Domains: AF_UNIX, AF_INET, AF_INET6, AF_PACKET l Types: SOCK_STREAM, SOCK_DGRAM, SOCK_RAW l Protokoll: Typisch 0 für IP l OS-typische Preprocessor Defines aus den man Pages entnehmen listen (int socket, int backlog) l markiert einen Socket verfügbar für connect() - Versuche l definiert die Länge der listen() – Queue bind (int socket, struct sockaddr* addr, int addlen) l bindet einen lokalen Socket an eine lokale Adresse © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle accept, connect (nur TCP) accept (int socket, struct sockaddr* addr, int* addrlen) l nimmt connect() - Versuche entgegen l In addr, addrlen Adresse des konnektierenden Partners eingetragen l Return-Wert: Neuer lokaler Socket für diese akzeptierte Verbindung oder -1 l Alter Socket bleibt offen für weitere Verbindungsversuche connect (int socket, struct sockaddr* addr, int adrlen) l verbindet lokalen Socket mit vorgegeb. entfernter Adresse l falls kein lokales bind geschehen ist, wird port vom Kernel vergeben l Return-Wert: 0 oder -1 connect – accept Interaktion kann geschehen l Blockierend: Beide calls blockieren l Nicht blockierend: Beide calls ergeben Status l Select-gesteuert: Via select prüfen, ob ein accept / connect blockieren würde © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle TCP Verbindung aufsetzen socket socket bind bind blockiert listen accept connect deblockiert © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Kommunikation Für verbundene TCP Sockets send ( ), write ( ) schreibe Bufferinhalt in verbundenen Socket recv ( ), read ( ) lese von Socket in einen Buffer sendv ( ), recvmsg ( ), readv ( ), writev ( ) Variante für einen Vektor von Buffern gather - scatter Storage Mechanismus Jeweils asynchrone und synchrone Variante © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Kommunikation Für UDP Sockets sendto ( ) sende an einen (verbundenen oder unverbundenen) Socket recvfrom ( ), read ( ) lese von Socket in einen Buffer Jeweils asynchrone und synchrone Variante © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Synchronizität Synchron l Schreibe so viel, wie geht l Blockiere, falls nichts geht l Problem 1: Kann unerwartet blockieren l Ausweg 1: Mehrfache Threads oder Multiplexing l Problem 2: Muß mich um den Rest kümmern Asynchron l Schreibe so viel, wie geht l Melde zurück, was gegangen ist l Problem 2: Muß mich um den Rest kümmern © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Herunterfahren close () schließt den Dateideskriptor shutdown () bereitet auf Schließen vor l Kann noch einseitig geöffnet bleiben © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Multiplexing Darstellung des Problems Einzelner Call, der blockieren könnte l Ausweg: Prüfe auf Blockieren l Frage: Wie oft? Dauernd Neues Problem: Intermittierend Neues Problem: Busy Waiting Warte zu lang Mehrere Calls, die blockieren könnten l Ausweg: Werden später einmal zurückkehren, also warte auf einen l Problem: Wenn auf den “falschen” warte, dann könnte ich mit einem Call fortsetzen, warte aber (unnötigerweise) © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Multiplexing Die Lösung Frage nach, wer arbeitsbereit ist Diese Frage selber kann gestellt werden l synchron warte, bis mind. einer bereit l timeout-synchron warte max. Zeit, bis mind. einer bereits l asynchron Antwort sofort, wer bereit ist Arbeitsbereit: Prüfe auf read / write / connect Funktion: select ( ) oder poll ( ) select: Maskiere aus allen, wer mich interessiert poll: Nutze Menge, die mich interessiert © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Hilfsfunktionen (1) getsockopt ( ) / setsockopt ( ) manipuliert Optionen l Bsp: SO_KEEPALIVE Versende periodisch Pakete um Verbindung offen zu halten l Bsp: SO_SNDBUF Buffergrösse zum Versenden l Bsp: SO_RCVBUF Buffergröße zum Empfangen l Bsp: SO_REUSEADDR Mehrere Programme können unter UDP auf dieselbe Portnummer binden © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Hilfsfunktionen (2) getpeername ( ) informiert über Peer auf der anderen Seite der Verbindung Bitte, senden Sie uns drei Pizza Diavolo. © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Gerne. Wohin soll denn geliefert werden Nameserver Schnittstelle Aufgabe: Verbindung Rechnername und IP-Adresse Einfach: /etc/hosts Aufwendig: Eigener Namensdienst l Relativ aufwendiger Dienst l Fehlertoleranz & Replikation (mind. 2 Nameserver pro Domain) l Hierarchische Suche l Sicherheitsprobleme zu lösen Lokale Schnittstelle l gethostbyaddr ( ), gethostbyname ( ) l gethostname ( ), sethostname ( ) für lokale Maschine Konfiguration l UNIX: /etc/resolv.conf l MS: Registerkarte zu Protokollen; WINS, DNS © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle /etc/hosts Mehrfache Namen möglich Antwortet mit generischem Namen © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Servicenamen Schnittstelle Verbindung zwischen Dienstnamen und Port Einfach: Aufwendig: /etc/services Eigener Namensdienst Schnittstelle: l getservbyname(), getservbyport() © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle /etc/services © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Reservierte Port-Bereiche Problem: l Erwarte best. Dienst unter best. Portnummer l Übersende vertrauliche Daten an den Dienst l Programm ist aber nicht das Erwartete Lösung: Sichere Verbindung Dienstname / Portnummer gewährleisten Restproblem: l Ein falsches Programm hat sich bereits vorher auf diese Portnummer gesetzt Lösung: Reservierte Ports, die nur vergeben werden, wenn User-ID = Superuser UNIX: Portbereich 1 - 1023 reserviert © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Out of Band Daten Problem: Beispiel: Dringlichkeitsdaten außerhalb normaler Sequenz Lange Ausgabe an einem Terminal stoppen Lösung: Dringlichkeitsdaten l Schreibender Prozess: Spezielles Flag in send ( ) l Lesender Prozess: Erhält ein Signal l Kann OOB Markierung erkennen l Ggf. kommt Info, dass OOB kommt vor den OOB Daten selber an l Dh: read() nach OOB Signal kann blockieren l Details OS- und Protokoll-abhängig © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Socket Adressfamilien Adressfamilie AF_UNIX Adressfamilie AF_INET user/include/sys/socket.h // Socketaddress typically family-id plus 14 bytes struct sockaddr { u_short sa_family; // 16bit, AF_UNIX, AF_INET char sa_data[14]; // prot. specific, eg: sockaddr_in © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Internet Socket Adressfamilien /user/include/netinet/in.h struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; } // // // // family 2 byte 4 byte 8 byte id port number network not used /user/include/netinet/in.h struct in_addr { u_long s_addr; // 32bit, network byte order } Socket-Schnittstelle © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Adresskonvertierung inet_addr ( ) inet_ntoa ( ) inet_lnaof ( ) inet_netof ( ) inet_makeaddr ( ) inet_network ( ) © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de konvertiert gepunktete Notation nach binär konvertiert binär nach gepunktet extrahiert Adresse im lokalen Netzwerk extrahiert Adresse des lokalen Netzwerks bildet Adresse aus lokaler Adresse im Netzwerk und Adresse des Netzwerks konvertiert gepunktete Notation nach binär (für eine Netzwerk-Adresse) Socket-Schnittstelle Byte Operations Oft Byte-weise Manipulationen an Adressen erforderlich Praktische Hilfsfunktionen der Standard-Bibliothek l bcopy l bzero l bcmp © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Daten-Darstellung Problem: Unterschiedliche Datendarstellungen l Lösung 1: l Nachteil: sender-makes-it-right oder receiver-makes-it-right Quadratische Komplexität an Konverterfunktionen Erweiterung auf neue Maschinen erfordert für alle alten Maschinen einen Konverter l Lösung 2: Nachteil: einheitliches Format Muß zwei Mal konvertieren l Beschreibung: In ASN.1 ASN.1 = Abstract Syntax Notation XDR = eXternal Data Representation © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle Byteorder higher order byte lower order byte Little Endian LSB = niedrigere Adress addr. A+1 higher order byte addr. A lower order byte Big Endian LSB = höhere Adresse addr. A © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de addr. A+1 Socket-Schnittstelle Byteorder bei Protokollen Problem: Auf Host & Netz verschieden Lösung: Feste Network-Byteorder Grund: Nur Host-Hersteller muß Konverter schreiben Network-Byteorder: Byteorder, die am Netz benutzt wird l Big-Endian vereinbart Host-Byteorder: Byteorder, die am Host benutzt wird l Kann abweichen (zB: Intel x86) Konvertierungsfunktionen: htonl(), htons(), ntohl(),ntohs() © 2003 Prof. Dr. Clemens H. Cap http://wwwiuk.informatik.uni-rostock.de Socket-Schnittstelle