Warstwa Transportowa ==================== Warstwa transportowa jest odpowiedzialna za komunikację *end-to-end* między aplikacjami działających na urządzeniach działających w sieci. Numer portu ----------- 16-bitowy identyfikator usługi/aplikacji/procesu działajacego na konkretnym urządzeniu (na konkretnym adresie IP). Lista powszechnie znanych (*well-known*) portów: http://en.wikipedia.org/wiki/Well-known_ports#Well-known_ports Domyślne porty: ``/etc/services`` Monitorowanie bieżących połączeń na portach: * ``ss`` * ``netstat`` * ``/proc/net/tcp`` lub ``/proc/net/udp`` Testowanie łączności na portach: * ``netcat``/``nc`` * ``socat`` Protokoły Warstwy Transportowej ------------------------------- User Datagram Protocol """""""""""""""""""""" *User Datagram Protocol* (UDP) -- bezpołączeniowy protokół transportowy: * Nie gwarantuje doręcznia datagramów (aka *Unreliable Datagram Protocol*) -- użytkownik musi ją zaimplementować samemu, jeśli potrzbuje niezawodności. * Weryfikacja integralności przez sumy kontrolne. Nagłówek UDP: http://en.wikipedia.org/wiki/User_Datagram_Protocol#Packet_structure Wykorzystanie UDP: * DHCP * DNS * RIP * SNMP * dane video, dźwięk Transmission Control Protocol ----------------------------- Protokół sterowania transmisją (*Transmission Control Protocol*, TCP) -- najpopularniejszy protokół transportowy. Nagłówek TCP: http://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure Fazy protokołu: * Nawiązanie połączenia (*connection establishment*) -- *3-way handshake* * **SYN** -- klient nawiązuje połączenie z segmentem, numer sekwencyjny segmenty (*segment sequence number*) = ``n`` * **SYN-ACK** -- serwer odpowiada z numerem potwierdzenia (*acknowledgement number*) ``n + 1`` i numerem sekwencji ``m`` * **ACK** -- klient odpowiada z numerem sekwencji równym ``m + 1`` .. image:: http://upload.wikimedia.org/wikipedia/commons/a/a1/TCP_establishment.png :target: http://commons.wikimedia.org/wiki/File:TCP_establishment.png * Przesyłanie danych (*data transfer*) -- numer sekwencyjny (*sequence number*) pozwala wykryć czy * datagram został zgubiony (więc powinien być retrasmitowany), * datagram dotarł w odpowiedniej kolejności, * datagram został zduplikowany. * Zakończenie połączenia (*connection termination*) -- *4-way handshake* * **FIN** -- jedna ze stron wysyła komunikat zakończenia * **ACK** -- druga strona potwierdza zakończenie * **FIN** -- druga strona wysyła także komunikat o zakończeniu (można połączyć z **ACK**) * **ACK** -- pierwsza strona potwierdza zakończenie .. image:: http://upload.wikimedia.org/wikipedia/commons/thumb/5/55/TCP_CLOSE.svg/500px-TCP_CLOSE.svg.png :target: http://en.wikipedia.org/wiki/File:TCP_CLOSE.svg Połączenie może być półotwarte (*half-open*) kiedy jedna ze stron zakończyła połączenie, ale druga nie. W takim wypadku strona któ¶a zakończyła połączenie nie może wysyłać komunikatów do drugiej, podczas gdy druga może wysyłać komunikaty do pierwszej. Wykorzystanie TCP: * HTTP, * HTTPS, * SMTP, * POP3, * IMAP, * SSH, * FTP