Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Klausur Netzwerkprogrammierung Januar 2007
- ===========================================
- Aufg. 2
- =======
- a) Mit socket() wird ein neuer Socket erzeugt. Dazu müssen Adressfamilie (z.B. IPv4 oder IPv6), Type (z.B. SOCK_DGRAM oder SOCK_STREAM) und Protokoll (z.B. IPPROTO_TCP, IPPROTO_UDP) übergeben werden. Die Funktion gibt den Filedescriptor für den erzeugten Socket zurück und ist nicht blockierend.
- b) bind() bindet einen Socket an eine lokale Transportadresse (IP-Adresse und Port). Dazu müssen der Filedescriptor des Sockets, welcher gebunden werden soll, die Transportadresse als Adressstruktur sowie die Größe der übergebenen Adressstruktur übergeben werden. Die Funktion gibt -1 im Fehlerfall und sonst 0 zurück. Sie ist nicht blockierend.
- c) Der connect()-Aufruf verbindet einen Socket mit einer entfernten Transportadresse. Dazu müssen der Filesdescriptor des Sockets, die Transportadresse als Adressstruktur sowie die Größe der Adressstruktur übergeben werden. Die Funktion gibt im Fehlerfall -1 und sonst 0 zurück. connect() ist blockierend.
- d) Mit listen() wird ein Socket in den passiven Modus versetzt, indem er mittels accept() eingehenden Verbindungsanfragen annehmen kann. Dazu müssen der Filesdescriptor des Sockets und die Zahl der maximal zu puffernden Verbindungsanfragen übergeben werden. Die Funktion gibt im Fehlerfall -1, sonst 0 zurück und ist nicht blockierend
- e) accept() akzeptiert die erste Verbindungsanfrage der Queue mit offenen Verbindungsanfragen. Übergabeparameter sind der Filesdescriptor eines Sockets im listen-Status, ein Zeiger auf eine Adressstruktur und auf die Länge der Adressstruktur. Die Funktion gibt den Filedescriptor für die akzeptierte Verbindung zurück. Außerdem wird die übergebene Adressstruktur gefüllt. accept() ist blockierend.
- f) Mit select() können mehrere Filedescriptoren auf Lesbarkeit, Schreibbarkeit oder einen Fehlerfall überwacht werden. Die Funktion blockiert so lange, bis einer der Filesdescriptoren den gewählten Zustand erreicht oder ein Timer abläuft. Übergabeparameter sind der größte Filedescriptor+1, die Mengen der auf Les-, Schreibarkeit und Fehlerfall zu überwachenden Filedescriptoren sowie der Timeout. Die Funktion gibt die Summe der Zahlen der in den Mengen befindlichen Filedescriptoren zurück. In jeder Menge befinden sich nur noch die Filedescriptoren, die den gewählten Zustand haben.
- g) close() teilt dem Kernel mit, dass ein Filedescriptor nicht mehr benötigt wird. Dazu muss der Filedescriptor übergeben werden. Im Fehlerfall wird -1 zurückgegeben, sonst 0. close() ist nicht blockierend.
- Aufg. 3
- =======
- a) send:
- - Filedescriptor mit dem gesendet werden soll
- - Zeiger auf Speicherbereich mit zu sendenen Daten
- - Länge der zu sendenden Daten
- - Flags
- recv:
- - Filedescriptor auf dem empfangen werden soll
- - Zeiger auf Speicherbereich für empfangene Daten
- - Größe des Speicherbereichs
- - Flags
- b) send: Anzahl der an den Kernel übergebenen Bytes
- recv: Anzahl der Bytes, die in den Puffer geschrieben wurden
- c) send: Es ist kein Fehler aufgetreten.
- recv: Es ist kein Fehler aufgetreten. Falls der Rückgabewert 0 ist, hat die Gegenseite die Verbindung geschlossen.
- Aufg. 4
- =======
- a) Little Endian: Das niederwertigste Byte steht an der kleinsten Speicheradresse.
- Big Endian: Das höchstwertigste Byte steht an der kleinsten Speicheradresse
- b) Host Byte Order ist die Byte Order, welche auf dem verwendeten System genutzt wird. Je nach Architektur kann dies Little Endian oder Big Endian sein. Network Byte Order ist die Byte Order, mit der Daten über das Netzwerk versendet werden. Network Byte Order ist Big Endian.
- c)htons(), htonl(), ntons(), ntonl()
- Aufg. 5
- =======
- Aufg. 6
- =======
- a)- Ein Single-Threaded Server, der die Filesdescriptoren für die angenommen Verbindung mittels select() in einer Schleife auf Lesbarkeit prüft und ggf. antwortet
- - Ein Multi-Threaded Server, der für jede angenommene Verbindungsanfrage einen neuen Thread startet, in dem die Kommunikation mit dem Client stattfindet.
- - Ein Server, der für jede angenommenen Verbindungsanfrage einen neuen Prozess startet, in dem die Kommunikation mit dem Client stattfindet.
- b) select():
- Vorteil: einfach zu implementieren, geringer Ressourcenbedarf
- Nachteil: Kommt es bei einer Verbindung zu einem Programmabbruch, ist der gesamte Server nicht mehr erreichbar, sequentielle Verarbeitung der Nachrichten der Clients
- Multi-Threaded:
- Vorteil: parallele Verarbeitung der Nachrichten der Clients, geringer Ressourcenbedarf
- Nachteil: Kommt es bei einer Verbindung zu einem Programmabbruch, ist der gesamte Server nicht mehr erreichbar
- Prozesse:
- Vorteil: Kommt es bei einer Verbindung zu einem Programmabbruch, sind die anderen Verbindungen nicht betroffen und es können auch noch Verbindungen angenommen werden, parallel Verarbeitung der Nachrichten der Clients
- Nachteil: hoher Ressourcenbedarf, schwierige Implementierung, hoher Verwaltungsaufwand bei gemeinsam genutzten Ressourcen
- Aufg. 7
- =======
- Aufg. 8
- =======
- Aufg. 9
- =======
- a) bindet den Socket an eine lokale Transportadresse. Der Kernel gibt die Daten, die an diese Adresse gesendet werden über den Socket an die Anwendung weiter.
- b) Setzt die default Sende- und Empfangsadresse für den Socket. Ermöglicht außerdem den Empfang von ICMP-Nachrichten mit Fehlermeldungen
- c) statt sendto() und recvfrom() können send() und recv() verwendet werden.
- Aufg. 10
- ========
- a) Bei 1-to-1 Style Sockets werden SCTP Assoziationen wie TCP Verbindungen behandelt. Sie dienen dem portieren von TCP-Anwendungen auf SCTP.
- b) Mit 1-to-Many Style Sockets lassen sich mehrere SCTP Assoziationen mit einem Filedescriptor verwalten. Sie dienen zum portieren von UDP-Anwendungen auf SCTP.
- c) 1-to-1: socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP)
- 1-to-Many: socket(AF_INET, SOCK_SEQPACK, IPPROTO_SCTP)
- d) 1-to-1: Expliziter Aufbau der Assoziation mit accept() und connect()
- 1-to-Many: automatischer, impliziter Aufbau der Assoziation
- Aufg. 11
- ========
- a) Flow Control schützt den Empfänger vor Überlastung durch den Sender. Congestion Control schützt das Netz vor Überlastung.
- b) Der send()-Aufruf kann blockieren, wenn der Puffer des Kernels nicht mehr ausreichend groß ist.
- c) Die API muss Funktionen zum Ändern der Einstellungen bzgl. Flow Control und Congestion Control zur Verfügung stellen.
- Aufg. 12
- ========
- a) Ja
- b) Die socket()-Aufrufe müssen geändert werden. Bei ursprünglichen TCP Sockets müssen 1-to-1 Style Sockets verwendet werden. Bei ursprünglichen UDP-Sockets müssen 1-to-Many Style Sockets verwendet werden.
- c) Nein
- d) Heartbeat und Retransmission bereits durch SCTP gegeben. Teilen des TCP-Streams auf Grund von Chunks bei SCTP nicht mehr notwending. Längenfeld kann dann auch entfallen.
- Aufg. 13
- ========
- a) gethostbyname(), gethostbyname2(), gethostbyaddr(), getaddrinfo(), getnameinfo()
- b)
- c) Über DNS lässt sich ermitteln über welche Transportprotokolle die IP-Adresse erreichbar ist. (siehe struct addrinfo)
- d) Es kann keine Aussage darüber getroffen werden, ob unter der IP-Adresse tatsächlich ein Server erreichbar ist und ob dieser unter dem angegebenen Port einen Dienst anbietet.
- Aufg. 14
- ========
- a) Der Socket ist noch gebunden und kann nicht sofort wiederverwendet werden.
- b) Durch setzen der entsprechenden Option (Reuse Adress) am Socket.
- c) setsockopt()
- Aufg. 15
- ========
- a) Confidentiality: Schutz vor unbefugtem lesendem Zugriff
- Message Integrity: Schutz vor unbefugtem schreibendem Zugriff
- Endpoint Authentication: Der Kommunikationspartner ist derjenige, der er behauptet zu sein
- b) Confidentiality, Message Integrity, Endpoint Authentication
- c) Message Integrity, Endpoint Authentication
- d)
- Aufg. 16
- ========
- a) An allen Funktionen, denen AF_INET4 als Adressfamilie und denen Strukturen übergeben werden, die nur für IPv4 gedacht sind. Funktionen, die nur IPv4 unterstützen können nicht mehr verwendet werden. Statt AF_INET muss AF_INET6 verwendet werden. Statt den IPv4 Strukturen müssen die entsprechenden IPv6 Strukturen verwendet werden.
- b) Protokollunabhängige Entwicklung bedeutet, dass eine Anwendung sowohl IPv4, als auch IPv6 unterstützt. getaddrinfo() ist eine Funktion die beide Protokollversionen unterstützt. Sie löst z.B. inet_pton() ab.
- Aufg. 17
- ========
- a) Proposed Standard, Draft Standard, Internet/Full Standard, Experimental Protocol, Informational Document, Historic Standard
- b) - ITU
- - Voting / non-Voting Member
- - erstellt Empfehlungen
- - Dokumente gegen Geld erhältlich
- - Konsensprinzip
- - mehrere Sprachen
- - ETSI
- - Voting Members
- - erstellt Standards
- - Dokumente frei erhältlich
- - Konsensprinzip
- - Specialist Task Force
- - IETF
- - Individuen
- - erstellt RFCs
- - Dokumente frei erhältlich
- - Rough Consensus and Running Code
- - Sprache ist Englisch
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement