W. Richard Stevens, Gary R. Wright tłum. Piotr Czarnocki, Marcin Palacz Biblia TCP/IP, tom 2 Książka ta przeznaczona jest dla wszystkich, którzy chcą zrozumieć, w jaki sposób zaimplementowane zostały protokoły TCP/IP: programistów piszących aplikacje sieciowe, administratorów odpowiedzialnych za funkcjonowanie systemów komputerowych i sieci używających TCP/IP, jak również dla wszystkich innych programistów, chcących dowiedzieć się, w jaki sposób duży i nietrywialny kod został umieszczony w rzeczywistym systemie operacyjnym. W książce przedstawiony i omówiony został kod źródłowy powszechnie spotykanej, i często traktowanej jako referencyjna, implementacji TCP/IP. Jest to implementacja pochodząca z Computer Systems Research Group (CSRG) w Uniwersytecie Kalifornijskim w Berkeley. Spis treści Przedmowa Rozdział 1 Wstęp 1.1 Wstęp 1.2 Prezentacja kodu źródłowego 1.3 Historia 1.4 Interfejsy programowe aplikacji 1.5 Przykładowy program 1.6 Wywołania systemowe i funkcje biblioteczne 1.7 Omówienie implementacji obsługi sieci 1.8 Deskryptory 1.9 Bufory pamięci (mbuf) i przetwarzanie na wyjściu 1.10 Przetwarzanie danych wejściowych 1.11 Implementacja sieciowa - raz jeszcze 1.12 Poziomy przerwań i współbieżność 1.13 Organizacja kodu źródłowego 1.14 Testowa sieć 1.14 Podsumowanie Rozdział 2 Mbuf: bufory pamięci 2.1 Wstęp 2.2 Wprowadzenie do kodu źródłowego 2.3 Definicje mbuf 2.4 Struktura mbuf 2.5 Proste makroinstrukcje i funkcje operujące na buforach mbuf 2.6 Funkcje m\_devget i m\_pullup 2.7 Podsumowanie makroinstrukcji i funkcji mbuf 2.8 Podsumowanie struktur danych kodu sieciowego Net/3 2.9 m_copy i liczniki odwołań do klastra 2.10 Alternatywy 2.11 Podsumowanie Rozdział 3 Warstwa interfejsu 3.1 Wstęp 3.2 Wprowadzenie do kodu źródłowego 3.3 Struktura ifnet 3.4 Struktura ifaddr 3.5 Struktura sockaddr 3.6 Specjalizacja ifnet i ifaddr 3.7 Przegląd inicjacji sieci 3.8 Inicjacja Ethernetu 3.9 Inicjacja SLIP 3.10 Inicjacja pętli zwrotnej 3.11 Funkcja if_attach 3.12 Funkcja ifinit 3.13 Podsumowanie Rozdział 4 Interfejsy: Ethernet 4.1 Wstęp 4.2 Wprowadzenie do kodu źródłowego 4.3 Interfejs Ethernet 4.4 Wywołanie systemowe ioctl 4.5 Podsumowanie Rozdział 5 Interfejsy: SLIP i pętla zwrotna 5.1 Wstęp 5.2 Wprowadzenie do kodu źródłowego 5.3 Interfejs SLIP 5.4 Interfejs pętli zwrotnej 5.5 Podsumowanie Rozdział 6 Adresowanie IP 6.1 Wstęp 6.2 Wprowadzenie do kodu źródłowego 6.3 Przegląd struktur interfejsów i adresowych 6.4 Struktura sockaddr_in 6.5 Struktura in_ifaddr 6.6 Przypisanie adresu 6.7 Przetwarzanie ioctl w interfejsie 6.8 Internetowe funkcje narzędziowe 6.9 Funkcje narzędziowe ifnet 6.10 Podsumowanie Rozdział 7 Domeny i protokoły 7.1 Wstęp 7.2 Wprowadzenie do kodu źródłowego 7.3 Struktura domain 7.4 Struktura protosw 7.5 Struktury IP: domain i protosw 7.6 Funkcje pffindproto i pffindtype 7.7 Funkcja pfctlinput 7.8 Inicjacja IP 7.9 Wywołanie systemowe sysctl 7.10 Podsumowanie Rozdział 8 IP - protokół Internetu 8.1 Wstęp 8.2 Wprowadzenie do kodu źródłowego 8.3 Pakiety IP 8.4 Przetwarzanie na wejściu - funkcja ipintr 8.5 Przekazywanie - funkcja ip_forward 8.6 Przetwarzanie wyjściowe - funkcja ip_output 8.7 Suma kontrolna - funkcja in_cksum 8.8 Wywołania systemowe setsockopt i getsockopt 8.9 Funkcja ip_sysctl 8.10 Podsumowanie Rozdział 9 Przetwarzanie opcji IP 9.1 Wstęp 9.2 Wprowadzenie do kodu źródłowego 9.3 Format opcji 9.4 Funkcja ip_dooptions 9.5 Opcja rejestracji trasy 9.6 Opcja trasy nadawcy i rejestracji trasy 9.7 Opcja znacznika czasu 9.8 Funkcja ip_insertoptions 9.9 Funkcja ip_pcbopts 9.10 Ograniczenia 9.11 Podsumowanie Rozdział 10 Fragmentacja i odtwarzanie datagramów IP 10.1 Wstęp 10.2 Wprowadzenie do kodu źródłowego 10.3 Fragmentacja 10.4 Funkcja ip_optcopy 10.5 Odtwarzanie datagramów 10.6 Funkcja ip_reass 10.7 Funkcja ip_slowtimo 10.8 Podsumowanie Rozdział 11 ICMP - internetowy protokół komunikatów kontrolnych 11.1 Wstęp 11.2 Wprowadzenie do kodu źródłowego 11.3 Struktura icmp 11.4 Struktura protosw protokołu ICMP 11.5 Przetwarzanie wejściowe - funkcja icmp_input 11.6 Przetwarzanie komunikatów o błędach 11.7 Przetwarzanie żądań 11.8 Przetwarzanie komunikatów o przekierowaniu 11.9 Przetwarzanie odpowiedzi 11.10 Przetwarzanie wyjściowe 11.11 Funkcja icmp_error 11.12 Funkcja icmp_reflect 11.13 Funkcja icmp_send 11.14 Funkcja icmp_sysctl 11.15 Podsumowanie Rozdział 12 Przesyłanie w trybie multicast IP 12.1 Wstęp 12.2 Wprowadzenie do kodu źródłowego 12.3 Ethernetowe adresy multicast 12.4 Struktura ether_multi 12.5 Ethernetowe odbieranie w trybie multicast 12.6 Struktura in_multi 12.7 Struktura ip_moptions 12.8 Opcje gniazd związane z przesyłaniem w trybie multicast 12.9 Wartości TTL przy przesyłaniu w trybie multicast 12.10 Funkcja ip_setmoptions 12.11 Dołączanie do grupy multicast IP 12.12 Rezygnacja z przynależności do grupy multicastowej IP 12.13 Funkcja ip_getmoptions 12.14 Przetwarzanie wejściowe przy przesyłaniu multicast - funkcja ipintr 12.15 Przetwarzanie wyjściowe przy przesyłaniu multicast - funkcja ip_output 12.16 Rozważania o szybkości działania 12.17 Podsumowanie Rozdział 13 IGMP - internetowy protokół zarządzania grupami 13.1 Wstęp 13.2 Wprowadzenie do kodu źródłowego 13.3 Struktura igmp 13.4 Struktura protosw IGMP 13.5 Dołączanie do grupy - funkcja igmp_joingroup 13.6 Funkcja igmp_fasttimo 13.7 Przetwarzanie wejściowe - funkcja igmp_input 13.8 Opuszczanie grupy - funkcja igmp_leavegroup 13.9 Podsumowanie Rozdział 14 Rutowanie przesyłania grupowego IP 14.1 Wstęp 14.2 Wprowadzenie do kodu źródłowego 14.3 Przetwarzanie wyjściowe przesyłania multicast - raz jeszcze 14.4 Demon mrouted 14.5 Interfejsy wirtualne 14.6 IGMP raz jeszcze 14.7 Routing przesyłania multicast 14.8 Przekazywanie multicast - funkcja ip_mforward 14.9 Zakończenie przetwarzania - funkcja ip_mrouter_done 14.10 Podsumowanie Rozdział 15 Warstwa gniazd 15.1 Wstęp 15.2 Wprowadzenie do kodu źródłowego 15.3 Struktura socket 15.4 Wywołania systemowe 15.5 Procesy, deskryptory i gniazda 15.6 Wywołanie systemowe socket 15.7 Funkcja getsock i sockargs 15.8 Wywołanie systemowe bind 15.9 Wywołanie systemowe listen 15.10 Funkcje tsleep i wakeup 15.11 Wywołanie systemowe accept 15.12 Funkcje sonewconn i soisconnected 15.13 Wywołanie systemowe connect 15.14 Wywołanie systemowe shutdown 15.15 Wywołanie systemowe close 15.16 Podsumowanie Rozdział 16 Operacje wejścia/wyjścia gniazda 16.1 Wprowadzenie 16.2 Wprowadzenie do kodu źródłowego 16.3 Bufory gniazd 16.4 Wywołania systemowe write, writev, sendto i sendmsg 16.5 Odwołanie systemowe sendmsg 16.6 Funkcja sendit 16.7 Funkcja sosend 16.8 Wywołania systemowe read, readv, recvfrom oraz recvmsg 16.9 Wywołanie systemowe recvmsg 16.10 Funkcja recvit 16.11 Funkcja soreceive 16.12 Kod soreceive 16.13 Wywołanie systemowe select 16.14 Podsumowanie Rozdział 17 Opcje gniazda 17.1 Wprowadzenie 17.2 Wprowadzenie do kodu źródłowego 17.3 Funkcja systemowa setsockopt 17.4 Wywołanie systemowe getsockopt 17.5 Wywołania systemowe fcntl oraz ioctl 17.6 Wywołanie systemowe getsockname 17.7 Wywołanie systemowe getpeername 17.8 Podsumowanie Rozdział 18 Drzewo podstawowe tablic routingu 18.1 Wprowadzenie 18.2 Struktura tablic routingu 18.3 Gniazda routingu 18.4 Wprowadzenie do kodu źródłowego 18.5 Struktura danych węzła podstawowego 18.6 Struktury rutujące 18.7 Inicjacja: funkcje route_init oraz rtable_init 18.8 Inicjacja: funkcje rn_init i rn_inithead 18.9 Powielone klucze i listy masek 18.10 Funkcja rn_match 18.11 Funkcja rn_search 18.12 Podsumowanie Rozdział 19 Żądania routingu oraz komunikaty routingu 19.1 Wprowadzenie 19.2 Funkcje rtalloc oraz rtalloc1 19.3 Makro RTFREE oraz funkcja rtfree 19.4 Funkcja rtrequest 19.5 Funkcja rt_setgate 19.6 Funkcja rtinit 19.7 Funkcja rtredirect 19.8 Struktura komunikatu routingu 19.9 Funkcja rt_missmsg 19.10 Funkcja rt_ifmsg 19.11 Funkcja rt_newaddrmsg 19.12 Funkcja rt_msg1 19.13 Funkcja rt_msg2 19.14 Funkcja sysctl_rtable 19.15 Funkcja sysctl_dumpentry 19.16 Funkcja sysctl_iflist 19.17 Podsumowanie Rozdział 20 Gniazda rutowania 20.1 Wprowadzenie 20.2 Struktury routedomain oraz protosw 20.3 Bloki kontroli rutowania 20.4 Funkcja raw_init 20.5 Funkcja route_output 20.6 Funkcja rt_xaddrs 20.7 Funkcja rt_setmetrics 20.8 Funkcja raw_input 20.9 Funkcja route_usrreq 20.10 Funkcja raw_usrreq 20.11 Funkcje raw_attach, raw_detach oraz raw_disconnect 20.12 Podsumowanie Rozdział 21 ARP: Protokół rozróżniania adresów 21.1 Wprowadzenie 21.2 ARP i tablica routingu 21.3 Wprowadzenie do kodu źródłowego 21.4 Struktury ARP 21.5 Funkcja arpwhohas 21.6 Funkcja arprequest 21.7 Funkcja arpintr 21.8 Funkcja in_arpinput 21.9 Funkcje zegara ARP 21.10 Funkcja arpresolve 21.11 Funkcja arplookup 21.12 Proxy ARP 21.13 Funkcja arp_rtrequest 21.14 ARP i przesyłanie multicast 21.15 Podsumowanie Rozdział 22 Bloki kontroli protokołu 22.1 Wprowadzenie 22.2 Wprowadzenie do kodu źródłowego 22.3 Struktura inpcb 22.4 Funkcje in_pcballoc oraz in_pcbdetach 22.5 Wiązanie, łączenie oraz demultipleksacja 22.6 Funkcja in_pcblookup 22.7 Funkcja in_pcbbind 22.8 Funkcja in_pcbconnect 22.9 Funkcja in_pcbdisconnect 22.10 Funkcje in_setsockaddr oraz in_setsockport 22.11 Funkcje in_pcbnotify, in_rtchange oraz in_losing 22.12 Uściślenia implementacyjne 22.13 Podsumowanie Rozdział 23 UDP: Protokół datagramów użytkownika 23.1 Wprowadzenie 23.2 Wprowadzenie do kodu źródłowego 23.3 Struktura UDP protosw 23.4 Nagłówek UDP 23.5 Funkcja udp_init 23.6 Funkcja udp_output 23.7 Funkcja udp_input 23.8 Funkcja udp_saveport 23.9 Funkcja udp_ctlinput 23.10 Funkcja udp_usrreq 23.11 Funkcja udp_sysctl 23.12 Uściślenia implementacyjne 23.13 Podsumowanie Rozdział 24 TCP: Protokół sterujący transmisją 24.1 Wprowadzenie 24.2 Wprowadzenie do kodu źródłowego 24.3 Struktura protosw TCP 24.4 Nagłówek TCP 24.6 Diagram przejść pomiędzy stanami TCP 24.7 Numery kolejne TCP 24.8 Funkcja tcp_init 24.9 Podsumowanie Rozdział 25 Zegary TCP 25.1 Wprowadzenie 25.2 Wprowadzenie do kodu źródłowego 25.3 Funkcja tcp_canceltimers 25.4 Funkcja tcp_fasttimo 25.5 Funkcja tcp_slowtimo 25.6 Funkcja tcp_timers 25.7 Wyznaczanie wartości zegara retransmisji 25.8 Funkcja tcp_newtcpcb 25.9 Funkcja tcp_setpersist 25.10 Funkcja tcp_xnit_timer 25.11 Czas oczekiwania na retransmisję: funkcja tcp_timers 25.12 Przykład RTT 25.13 Podsumowanie Rozdział 26 Wyjście TCP 26.1 Wprowadzenie 26.2 Przegląda tcp_output 26.3 Określenie, czy segment powinien zostać wysłany 26.4 Opcje TCP 26.5 Opcja skali okna 26.6 Opcja znacznika czasu 26.7 Wysłanie segmentu 26.8 Funkcja tcp_template 26.9 Funkcja tcp_respond 26.10 Podsumowanie Rozdział 27 Funkcje TCP 27.1 Wprowadzenie 27.2 Funkcja tcp_drain 27.3 Funkcja tcp_drop 27.4 Funkcja tcp_close 27.5 Funkcja tcp_mss 27.6 Funkcja tcp_ctlinput 27.7 Funkcja tcp_notify 27.8 Funkcja tcp_quench 27.9 Makro TCP_REASS oraz funkcja tcp_reass 27.10 Funkcja tcp_trace 27.11 Podsumowanie Rozdział 28 Wejście TCP 28.1 Wprowadzenie 28.2 Przetwarzanie wstępne 28.3 Funkcja tcp_dooptions 28.4 Przewidywanie nagłówka 28.5 Przetwarzanie danych wejściowych TCP: długa ścieżka 28.6 Zakończenie operacji aktywnego i pasywnego otwarcia połączenia 28.7 PAWS - zabezpieczenie przed zawiniętymi numerami kolejnymi 28.8 Obcinanie segmentów, aby dane zmieściły się w oknie 28.9 Połączenia z samym sobą i otwarcia jednoczesne 28.10 Zapamiętywanie znacznika czasu 28.11 Przetwarzanie RST 28.12 Podsumowanie Rozdział 29 Wejście TCP (ciąg dalszy) 29.1 Wstęp 29.2 Przegląd przetwarzania ACK 29.3 Dokończenie operacji pasywnego otwarcia i jednoczesnego otwarcia 29.4 Algorytmy szybkiej retransmisji i odzyskiwania danych 29.5 Przetwarzanie ACK 29.6 Odświeżenie informacji dotyczących okna 29.7 Przetwarzanie w trybie pilnym 29.8 Funkcja tcp_pulloutofband 29.9 Przetwarzanie odebranych danych 29.10 Przetwarzanie FIN 29.11 Przetwarzanie końcowe 29.12 Uściślenia implementacyjne 29.13 Kompresja nagłówka 29.14 Podsumowanie Rozdział 30 TCP - żądania użytkownika 30.1 Wprowadzenie 30.2 Funkcja tcp_usrreq 30.3 Funkcja tcp_attach 30.4 Funkcja tcp_disconnect 30.5 Funkcja tcp_usrclosed 30.6 Funkcja tcp_ctloutput 30.7 Podsumowanie Rozdział 31 BPF: Filtr pakietów BSD 31.1 Wprowadzenie 31.2 Wprowadzenie do kodu źródłowego 31.3 Struktura bpf_if 31.5 Wejście BPF 31.6 Wyjście BPF 31.7 Podsumowanie Rozdział 32 IP dla danych nieprzetworzonych 32.1 Wprowadzenie 32.2 Wprowadzenie do kodu źródłowego 32.3 Struktura protosw IP dla danych nieprzetworzonych 32.4 Funkcja rip_init 32.5 Funkcja rip_input 32.6 Funkcja rip_output 32.7 Funkcja rip_usrreq 32.8 Funkcja rip_ctloutput 32.9 Podsumowanie Epilog Dodatek A Rozwiązania do wybranych ćwiczeń Dodatek B Dostęp do kodu źródłowego Dodatek C Zgodność z RFC 1122 C.1 Wymagania dla warstwy łącza C.2 Wymagania IP C.3 Wymagania dla opcji IP C.4 Fragmentacja i wymagania dotyczące odtwarzania C.5 Wymagania dotyczące ICMP C.6 Wymagania dotyczące przesyłania multicast C.7 Wymagania dotyczące IGMP C.8 Wymagania dotyczące rutowania C.9 Wymagania dotyczące ARP C.10 Wymagania dotyczące UDP C.11 Wymagania dotyczące TCP Bibliografia Indeks ------------------ ISBN 83-87216-25-9 Wydawnictwo RM, kwiecień 98 str. 1236, format 172x242, oprawa twarda lakierowana Więcej informacji: http://www.rm.com.pl/tcpip2.htm