Vorwort | 5 |
Inhaltsverzeichnis | 9 |
Beispielprogramme | 13 |
1 Einführung | 16 |
1.1 TCP/IP-Grundlagen | 17 |
1.1.1 Netzwerkschicht | 18 |
1.1.2 Internet-Schicht | 19 |
1.1.3 Transportschicht | 20 |
1.1.4 Anwendungsschicht | 21 |
1.2 Internet-Standards | 21 |
1.3 Unix-Standards | 22 |
2 Programmieren mit Unix-Prozessen | 24 |
2.1 Unix-Prozesse | 24 |
2.1.1 Prozeßgruppen und Sessions | 25 |
2.1.2 Kontrollierendes Terminal | 27 |
2.1.3 Verwaiste Prozesse und verwaiste Prozeßgruppen | 28 |
2.1.4 Prozeßumgebung | 29 |
2.1.5 Lebenszyklus | 30 |
2.1.6 User- und Gruppen-ID | 35 |
2.2 Ein- und Ausgabe | 36 |
2.2.1 Dateideskriptoren | 36 |
2.2.2 Elementare Ein- und Ausgabe | 39 |
2.2.3 Standardeingabe und -ausgabe | 50 |
2.2.4 Ausgabe über den Syslog- Dienst | 56 |
2.3 Buffer-Overflows und Format-String-Schwachstellen | 60 |
2.3.1 Buffer-Overflows | 62 |
2.3.2 Format-String-Schwachstellen | 69 |
2.3.3 Geeignete Gegenmaßnahmen | 72 |
2.4 Signale | 73 |
2.4.1 Signale behandeln | 74 |
2.4.2 Signale blockieren | 83 |
2.4.3 Signale annehmen | 87 |
2.4.4 Signale generieren | 89 |
2.5 Prozeflkontrolle | 91 |
2.5.1 Was bin ich? Prozeß-IDs und mehr | 92 |
2.5.2 Neue Prozesse erzeugen | 94 |
2.5.3 Prozesse synchronisieren | 98 |
2.5.4 Zombie-Prozesse | 104 |
2.5.5 Andere Programme ausführen | 105 |
2.5.6 User- und Group-IDs wechseln | 109 |
2.6 Dæmon-Prozesse | 111 |
3 Programmieren mit POSIX-Threads | 118 |
3.1 Grundlagen | 119 |
Ready: | 124 |
Running: | 124 |
Blocked: | 124 |
Terminated: | 124 |
3.2 Synchronisation | 130 |
3.2.1 Race Conditions und kritische Bereiche | 131 |
3.2.2 Gegenseitiger Ausschluß | 135 |
Mutexe erstellen und verwerfen | 135 |
Mutexe sperren und wieder freigeben | 136 |
Mutexe praktisch einsetzen | 137 |
3.2.3 Bedingungsvariablen | 141 |
Bedingungsvariablen erstellen und verwerfen | 141 |
Auf Bedingungsvariablen warten | 142 |
Bedingungsvariablen signalisieren | 144 |
Mutexe und Bedingungsvariablen einsetzen | 145 |
3.3 Pthreads und Unix-Prozesse | 150 |
3.3.1 Threadsichere und eintrittsinvariante Funktionen | 150 |
Threadsicherheit: | 150 |
Eintrittsinvarianz: | 150 |
3.3.2 Fehlerbehandlung und errno | 152 |
3.3.3 Signalverarbeitung | 153 |
3.3.4 fork() und exec() in Pthreads-Programmen | 159 |
4 Grundlagen der Socket-Programmierung | 162 |
4.1 Erste Schritte mit telnet und inetd | 162 |
4.1.1 Das telnet-Kommando als Netzwerk-Client | 162 |
Beliebige Dienste ansprechen | 163 |
Kommunikation mit einem Mailserver | 164 |
Zusammenfassung | 166 |
4.1.2 Einfache Netzwerkdienste mit dem inetd | 167 |
4.2 IP-Namen und IP-Adressen | 171 |
4.2.1 Das Domain Name System | 172 |
4.2.2 IPv4-Adressen | 174 |
Klasse A: | 175 |
Klasse B: | 176 |
Klasse C: | 176 |
Klasse D: | 176 |
Klasse E: | 177 |
CIDR – Classless Inter-Domain Routing | 177 |
Private IP-Adressen | 178 |
4.2.3 IPv6-Adressen | 179 |
4.3 Sockets | 194 |
4.3.1 Socket anlegen | 195 |
4.3.2 Socket-Strukturen | 197 |
IPv4 Socket-Adreßstruktur | 197 |
IPv6 Socket-Adreßstruktur | 197 |
Generische Socket-Adreßstrukturen | 198 |
4.3.3 Client-seitiger TCP-Verbindungsaufbau | 199 |
4.3.4 Socket-Adressen zuweisen | 204 |
4.3.5 Annehmende Sockets | 207 |
4.3.6 TCP-Verbindungen annehmen | 209 |
4.3.7 Drei-Wege-Handshake und TCP-Zustandsübergänge | 214 |
4.3.8 Kommunikation über UDP | 220 |
4.3.9 Standardeingabe und -ausgabe über Sockets | 227 |
4.3.10 Socket-Adressen ermitteln | 228 |
4.3.11 Multiplexing von Netzwerkverbindungen | 233 |
4.3.12 Socket-Optionen | 238 |
4.4 Namensaulösung | 242 |
5 Netzwerkprogrammierung in der Praxis | 250 |
5.1 Aufbau der Testumgebung | 251 |
5.1.1 Funktionsumfang der Testumgebung | 252 |
5.1.2 Hilfsfunktionen für die Socket- Kommunikation | 253 |
5.1.3 Der Test-Client | 264 |
5.2 Iterative Server | 270 |
5.2.1 Sequentielle Verarbeitung der Anfragen | 271 |
5.2.2 Clientbehandlung | 274 |
5.2.3 Hilfsfunktionen zur Laufzeitmessung | 277 |
5.2.4 Eigenschaften und Einsatzgebiete | 279 |
5.3 Nebenläufige Server mit mehreren Threads | 281 |
5.3.1 Abgewandelte Signalbehandlung | 282 |
5.3.2 Ein neuer Thread pro Client | 283 |
5.3.3 Das Hauptprogramm als Signalverarbeiter | 285 |
5.3.4 Eigenschaften und Einsatzgebiete | 287 |
5.4 Nebenläufige Server mit Prethreading | 289 |
5.4.1 Clientbehandlung mittels paralleler Accept-Handler | 290 |
5.4.2 Das Hauptprogramm als Signalverarbeiter | 292 |
5.4.3 Eigenschaften und Einsatzgebiete | 294 |
5.5 Nebenläufige Server mit mehreren Prozessen | 296 |
5.5.1 Anpassung der Signalbehandlung | 297 |
5.5.2 Ein neuer Prozeß pro Client | 299 |
5.5.3 Das Hauptprogramm | 301 |
5.5.4 Eigenschaften und Einsatzgebiete | 302 |
5.6 Nebenläufige Server mit Preforking | 304 |
5.6.1 Buchführende Signalbehandlung | 305 |
5.6.2 Parallele Accept-Handler in mehreren Prozessen | 307 |
5.6.3 Preforking im Hauptprogramm | 309 |
5.6.4 Eigenschaften und Einsatzgebiete | 311 |
5.7 Zusammenfassung | 313 |
6 Netzwerkprogrammierung mit SSL | 316 |
6.1 Strategien zur Absicherung des Datenverkehrs | 317 |
6.1.1 Datenverschlüsselung | 319 |
6.1.2 Hashfunktionen und Message Authentication Codes | 322 |
6.1.3 Digitale Signaturen | 323 |
6.1.4 Zertifizierungsstellen und digitale Zertifikate | 324 |
6.1.5 Praktische Absicherung des Datenverkehrs | 325 |
6.2 SSL-Grundlagen | 328 |
6.2.1 Datentransfer über SSL | 329 |
6.2.2 Anwendungsprotokolle um SSL erweitern | 332 |
6.2.3 SSL-Verbindungen interaktiv testen | 336 |
6.3 OpenSSL-Basisfunktionalität | 338 |
6.3.1 Das Konzept der BIO-API | 339 |
6.3.2 Lebenszyklus von BIO-Objekten | 340 |
6.3.3 Ein-/Ausgabe über BIO-Objekte | 341 |
6.3.4 BIO-Quellen/Senken und BIO-Filter | 344 |
6.3.5 Fehlerbehandlung | 357 |
6.3.6 Thread-Support | 360 |
6.3.7 Pseudozufallszahlengenerator | 367 |
7 Client-/Server-Programmierung mit OpenSSL | 372 |
7.1 Initialisierung der ssl-Bibliothek | 372 |
7.2 Der SSL-Kontext | 374 |
7.2.1 Ein unvollständiger SSMTP- Client | 375 |
7.2.2 SSL-Optionen, SSL-Modi und Chiffrenfolgen | 379 |
7.3 Sicherer Umgang mit X.509-Zertifikaten | 383 |
7.3.1 Zertifikatsüberprüfung aktivieren | 387 |
7.3.2 Zertifikatsüberprüfung per Callback nachbereiten | 389 |
7.3.3 Identitätsabgleich mit digitalen Zertifikaten | 395 |
7.3.4 SSL-Kommunikation mit eigener Identität | 402 |
7.4 Client-/Server-Beispiel: SMTP mit SARTTLS | 404 |
7.4.1 Ein SMTP-Client mit STARTTLS | 404 |
7.4.2 Ein SMTP-Server mit STARTTLS | 412 |
7.5 Zusammenfassung | 421 |
Anhang | 424 |
A.1 Zertifikate erstellen mit OpenSSL | 424 |
A.1.1 Aufbau einer Zerti.zierungsstelle | 424 |
Erzeugen eines geheimen CA-Schl ¨ ussels | 425 |
Erzeugen des CA-Zerti.kats | 425 |
CA-Dateien speichern | 426 |
A.1.2 Neue Zerti.kate ausstellen | 427 |
Certi.cate Signing Request erzeugen | 427 |
Certi.cate Signing Request signieren | 428 |
A.1.3 Vertrauensw ¨ urdige Zerti . zierungsstellen | 429 |
A.2 Barrieren mit POSIX-Threads | 430 |
Literaturverzeichnis | 438 |
Sachverzeichnis | 442 |