Sieci Komputerowe
Protokół TCP
Transmission Control Protocol
dr Zbigniew Lipiński
Instytut Matematyki i Informatyki
ul. Oleska 48
50-204 Opole
zlipinski@math.uni.opole.pl
Protokół TCP
Transmisja strumieniowa
Niezawodność TCP
Opis Segmentu TCP
Przykład segmentu TCP (TCP Connect Request Telnetu)
Struktura nagłówka segmentu TCP
Porty i połączenia TCP
Aplikacje i protokoły korzystające z TCP
Mechanizm przesuwających się okien
Przesyłanie z użyciem buforów
2
TCP, ang. Transmission Control Protocol.
RFC 793
TCP jest protokołem warstwy transportowej modelu OSI.
Pakiet danych TCP nazywa się segmentem.
Protokół TCP jest protokołem połączeniowym umożliwiającym wykrywanie błędów transmisji.
Cechy protokołu TCP:
•
stosuje pozytywne potwierdzanie odbioru danych (pole ACK=1),
•
ma możliwość ustalania priorytetu przesyłania segmentów,
•
ma możliwość kontroli i usuwania błędów (retransmisji niepotwierdzonych pakietów).
3
Protokół TCP jest protokołem połączeniowym.
Każdy segment TCP zawiera informacje pozwalające kontrolować transmisję:
•
numer portu, adres IP odbiorcy
(pola: Source port, Source Address)
•
numer portu, adres IP nadawcy
(pola: Destination port, Destination Address)
•
kolejny numer wysłanego segmentu
(pole: Sequence number)
•
wielkość okna
(pole: Window).
Zbiór tych parametrów nazwa się połączeniem (RFC 793).
Budowa połączenia polega na:
•
lokalizacji odbiorcy,
•
ustaleniu parametrów połączenia.
Proces trasmisji składa się z trzech etapów:
•
budowa połączenia,
•
przesyłanie danych,
•
zamknięcie połączenia.
4
Lista parametrów ustalana przy budowie połączenia:
•
port nadawcy, port odbiorcy,
•
adresy IP nadawcy, adres IP odbiorcy,
•
numer ISN (Initial Sequence Number),
•
wielkość okna.
5
W transmisji wykorzystującej protokół TCP między nadawcą a odbiorcą wymieniany jest strumień bajtów.
Protokół TCP nie umieszcza znaczników początku i końca danych, usługa strumienia bajtów (byte stream service).
Jeśli nadawca wyśle kolejno 100 bajtów, 200, 300 bajtów to odbiorca nie wie jakiej wielkości segmenty były wysłane.
Do odbiorcy dane mogą dotrzeć w 4 segmentach po 150 bajtów każdy.
Nadawca wysyła strumień danych i odbiorca odbiera strumień danych.
6
Protokół TCP umożliwia weryfikację czy transmitowane dane są:
•
uszkodzone
•
zgubione
•
powielone
•
dostarczone w nieodpowiedniej kolejności do odbiorcy.
W celu zapewnienia niezawodności transmisji:
•
każdy wysłany segment danych TCP jest numerowany
•
każdy segment TCP potwierdzający odbiór jest numerowany
•
protokół wykorzystuje mechanizm pozytywnego potwierdzenia z retransmisją PAR, (ang.) Positive Acknowledgment with Re-transmission.
7
Pozytywne potwierdzanie z retransmisja (PAR)
Protokół TCP stosuje mechanizm 'pozytywnego potwierdzania z retransmisja', tzn. potwierdzany jest poprawny odbiór danych.
Nadawca po wysłaniu segmentu TCP, uruchamia zegar mierząc czas oczekiwania na potwierdzenie odbioru.
Po odebraniu segmentu TCP odbiorca wysyła pakiet w którym flaga ACK = 1.
Nadawca wysyła ponownie segment jeżeli:
•
zostanie przesłany komunikat z wartością pola ACK=0 (brak pozytywnego potwierdzenia),
•
po określonym czasie nie nadejdzie potwierdzenie prawidłowego obioru danych.
Odbiorca po prawidłowym odebraniu segmentu TCP wysyła potwierdzenie odbioru do nadawcy.
Jeżeli potwierdzenie nie nadejdzie w określonym czasie, nadawca wysyła segment ponownie.
Pakiet jest wysyłany tak długo dopóki nadawca nie otrzyma potwierdzenia o bezbłędnie odebraniu pakietu.
8
Przykład: Pozytywne Potwierdzanie z Retransmisja
# ----- Naglowek Ethernetowy -----
# ----- Naglowek TCP -----
Packet 7 arrived at 17:37:24.00
Source port = 23
Packet size = 60 bytes
Destination port = 36869
Destination = 8:0:20:86:35:4b, Sun
Sequence number = 2486243368
Acknowledgement number = 1913975089
Source
= 0:e0:f7:26:3f:e9, CISCO Router
Data offset = 20 bytes
Ethertype = 0800 (IP)
Flags = 0x10
# ----- Naglowek IP -----
..0. .... = No urgent pointer
Version = 4
...1 .... = Acknowledgement
Header length = 20 bytes
.... 0... = No push
Type of service = 0x00 (normal)
.... .0.. = No reset
Total length = 40 bytes
.... ..0. = No Syn
Identification = 43773
.... ...0 = No Fin
Flags = 0x0
Window = 8760
.0.. .... = may fragment
Checksum = 0x1c65
..0. .... = last fragment
Urgent pointer = 0
Fragment offset = 0 bytes
No options
Time to live = 252 seconds/hops
Protocol = 6 (TCP)
Header checksum = 3a56
Source address = 150.168.233.2,
server.math.edu.pl
Destination address = 150.168.27.110, client
No options
9
Numerowanie segmentów.
Do numerowania wysłanych segmentów TCP nadawca i odbiorca wykorzystują pole ' Sequence number' w nagłówku protokołu TCP.
Pole ' Sequence number' zawiera liczbę ISN + N, gdzie N jest liczbą odebranych bajtów, przy czym numeruje się pierwszy bajt danych w przesłanym segmencie.
Segmenty TCP są kapsułkowane w warstwie sieci w datagramy IP. Protokół IP jest protokołem bezpołączeniowym bez obsługi błędów dlatego, datagramy IP mogą nie dotrzeć do odbiorcy lub dotrzeć w rożnej kolejności. Pole ' Sequence number‘ pozwala sprawdzić czy jakiś segment TCP nie zaginął, służy również do uporządkowania odebranego strumienia danych we właściwej kolejności.
Obiorca wysyła pakiet z flagą ACK = 1 (pakiety potwierdzające prawidłowy odbiór danych) wykorzystuje pole Numer potwierdzenia (Acknowledgement number) do poinformowania nadawcy o liczbie prawidłowo odebranych bajtów i o spodziewanej wartości w polu ' Sequence number‘.
10
Suma kontrolna w nagłówku segmentu TCP.
Mechanizm sum kontrolnych służy zapewnieniu integralności danych podczas transmisji.
Nagłówek protokołu TCP zawiera pole 'Checksum' .
Wartość pola jest ilością 16-bitowych słów w pseudonagłówku, nagłówku i polu 'dane'.
Jeżeli segment zostanie nadesłany z niepoprawną sumą kontrolną, odbiorca porzuca go i nie wysyła potwierdza odbioru.
11
Sterowanie szybkością transmisji.
Pole 'Window' w nagłówku segmentu TCP służy do informowania nadawcy ile bajtów może odebrać odbiorca.
Zmieniając wartość w polu 'Window' odbiorca może określać wielkość/ilość wysyłanych segmentów.
Np. wysłany segment TCP z wartością pola 'Window = 0' wstrzymuje transmisję.
Jeżeli odległość między nadawcą a obiorcą jest duża (liczona w liczbą routerów) i są możliwe opóżnienia w transmisji, odbiorca danych stopniowo zwiększa wartość pola 'Window ‘ – stosuje mechanizm
‘slow start’.
RFC 2001. Algorytm TCP slow start stosowany przez protokół TCP ma na celu określenie optymalnej wartości dla pola ‘Window’ gdy nadawca i odbioraca znajdują się w różnych sieciach (segamentach sieci).
W segmentach TCP nadawcy i odbiorcy wartość w polu ‘Window’ może być różna.
12
Struktura nagłówka segmentu TCP
Segmentów używa się do:
•
budowy połączenia
•
przesyłania danych
•
potwierdzania
•
wstrzymywania transmisji
•
zamykania połączeń.
Każdy segment podzielony jest na dwie części:
•
'pseudo' nagłówek ,
•
nagłówek TCP.
13
Pseudonagłówek poprzedza nagłówek segmentu TCP (RFC 793).
Wilekość pseudonagłówka 12 bajtów (96 bitów).
Pole:
Adres nadawcy. Wielkość pola: 32 bity. Pole określa adres IP nadawcy.
Pole:
Adres odbiorcy. Wielkość pola: 32 bity. Pole określa adres IP odbiorcy.
Pole:
Zero
Pole:
Protokół. Wielkość pola: 8 bitów. Pole określa typ protokołu. Wartość: 6 oznacza TCP.
Pole:
Długość TCP. Wielkość pola: 16 bitów. Liczba bajtów w nagłówku i polu dane segementu TCP.
W polu nie uwzględnia się wielkości pseudonagłówka.
Bity
1-4
5-8
9-12
13-16
17-20
21-24
25-28
29-32
Source Address
Destination Address
Zero
Protocol
TCP Length
Pseudonagłówek TCP
14
Bity
Pole:
Port źródłowy (Source port). Wielkość pola: 16 bitów.
1-4
5-8
9-10
11-12
13-16
17-20
21-24
25-28
29-32
Source port
Destination port
Sequence number
Pole:
Port docelowy (Destination port). Wielkość pola: 16 bitów.
Acknowledgement number
Data
Pola zawierają numery portów aplikacji wymieniających dane. offset Not used
Flags
Window
Checksum
Urgent pointer
Options
Padding
Data …
Pole:
Kolejny numer (Sequence number). Wielkość pola: 32 bity.
Struktura segmentu TCP
Numer pierwszego bajtu przesyłanych danych w segmencie.
Przy nawiązywaniu połączenia, gdy pole SYN= 1, w polu 'kolejny numer' jest wpisywany początkowy numer ISN od którego rozpoczęta będzie numeracja przesyłanych segmentów (pierwszy wysłany bajt danych ma numer ISN + 1).
Liczba ISN jest generowana losowo z gwarancją nie powtórzenia się przez około 4.55 godz..
Pole:
Numer potwierdzenia (Acknowledgement number).
Wielkość pola: 32 bity.
Jeśli pole ACK = 1, to pole 'numer potwierdzenia' zawiera oczekiwaną (następną) wartość w polu 'kolejny numer'.
Pole:
Długość nagłówka (Data offset). Wielkość pola: 4 bity.
Wartość w polu określa liczbę 32-bitowych słów w nagłówku TCP. Pole pozwala określić początek bitów z danymi.
Pole:
Pole nieużywane. Wielkość pola: 6 bitów.
Pole jest przeznaczone dla przyszłych zastosowań.
15
Bity
1-4
5-8
9-10
11-12
13-16
17-20
21-24
25-28
29-32
Source port
Destination port
Pole:
Flagi, (Flags). Wielkość pola: 6 bitów.
Sequence number
Pole zawiera parametry określające tryb transmisji.
Acknowledgement number
Data
Atrybuty pola flagi: UGR, ACK, PSH, RST, SYN, FIN. offset Not used
Flags
Window
Checksum
Urgent pointer
Wartości atrybutów pola flagi: 0,1.
Options
Padding
UGR - wskaźnik pilności
Data …
ACK - określa ważność pola numer potwierdzania.
Struktura segmentu TCP
PSH - wskazuje na zastosowanie funkcji wymuszającej.
RST - wyzerowanie połączenia (dla wartości 1 oznacza polecenie zerowania połączenia).
SYN - wskazuje, że w polu 'kolejny numer' umieszczony jest inicjujący numer INS. Wartość 0 oznacza nowe połączenie.
FIN - wartość 1 oznacza koniec połączenia.
Pole:
Okno, (Window). Wielkość pola: 16 bitów.
Pole służy do sterowania transmisją danych.
Pole określa liczbę bajtów jaką może jeszcze odebrać odbiorca (wielkość bufora odbiorcy).
Pole 'Okno' o wartości zero, oznacza, ze nadawca powinien wstrzymać transmisje, dopóki nie otrzyma potwierdzenia z niezerowa wartością pola.
16
Pole:
Suma kontrolna (Checksum). Wielkość pola: 16 bitów.
Suma kontrolna jest ilością 16-bitowych słów w pseudonagłówku (12 bajtów), nagłówku i polu dane segmentu TCP .
Jeżeli liczba bajtów jest nieparzysta to dodawany jest bajt zer w polu dane tak, aby suma kontrolna była liczona dla 16-bitowych słów. Dodany bajt zer w polu dane nie jest transmitowany.
Pole:
Priorytet (Urgent pointer). Wielkość pola: 16 bitów.
Pole określa pilności przesyłanego segmentu, jest interpretowane tylko wtedy, gdy flaga 'UGR' ma wartość 1.
Pole zawiera kolejny numer bajtu następującego po pilnych danych.
Pole:
Opcje (Options). Wielkość pola: zmienna, wielokrotność 8 bitów.
Pole zawiera numery opcji, każdy numer zapisany w jednym bajcie.
Dla protokołu TCP zdefiniowano trzy opcje:
0 - koniec listy opcji
1 - brak działania
Bity
1-4
5-8
9-10
11-12
13-16
17-20
21-24
25-28
29-32
2 - maksymalna długość segmentu.
Source port
Destination port
Sequence number
Acknowledgement number
Data
offset
Not used
Flags
Window
Checksum
Urgent pointer
Options
Padding
Data …
Struktura segmentu TCP
17
Pole:
Uzupełnienie (Padding). Wielkość pola: zmienna.
Pole zawiera uzupełnienia zerami nagłówka TCP do wielkości 32 bitów.
Pole:
Dane (Data). Wielkość pola: zmienna.
Pole zawiera dane aplikacji.
Bity
1-4
5-8
9-10
11-12
13-16
17-20
21-24
25-28
29-32
Source port
Destination port
Sequence number
Acknowledgement number
Data
offset
Not used
Flags
Window
Checksum
Urgent pointer
Options
Padding
Data …
Struktura segmentu TCP
18
Synchronizacja numeracji segmentów
W procesie synchronizacji 'połączenia TCP' między nadawcą (A) i odbiorcą (B) wymieniane są trzy segmenty TCP.
Proces uzgadniania wartości w polach ' Sequence number‘, ‘Acknowledgement number w wysyłanych i potwierdzanych pakietach (RFC 793).
(1) A ----> B flaga SYN=1,
pole ‘Sequence number=X’, ISN nadawcy (A), Np. X=100
(2) A <---- B flagi ACK=1,
pole ‘Sequence number=Y’, ISN odbiorcy (B),
SYN=1
pole ‘Acknowledgement number=X+1’
Np. SeqNumber=Y = 300, AckNumber = X+1 = 101
(3) A ----> B flaga ACK=1
pole ‘Acknowledgement number=Y+1,
Np. SeqNumber=X+1=101, AckNumber=Y+1=301
19
Synchronizacja numeracji segmentów
Uzgadnionie wartości w polu Sequence number (Kolejny numer) jest wymagana ponieważ, wartości początkowe ISN (initial sequence number) są wyliczane na podstawielokalnego czasu nadawcy i odbiorcy.
Maximum Segment Lifetime (MSL) w sieci dla segmentów TCP wynosi 2 minuty (RFC 793).
Każdy przesłany bajt ma swój ‘sequence number’.
Mechanizm potwierdzania pakietów jest przyrostowy, tzn. potwierdzenie odebrania bajtu o numerze X
(wartość w polu ‘sequence number’=X), oznacza, że potwierdzony jest odbiór strumienia X bajtów.
20
# ----- naglowek ethernetowy -----
# ----- naglowek TCP -----
Packet 10 arrived at 12:35:32.17
Source port = 23
Packet size = 69 bytes
Destination port = 36869
Destination = 8:0:20:85:55:4b, Sun
Sequence number = 2486243368
Source
= 0:e0:f7:22:3f:d9, CISCO Router
Acknowledgement number = 1913975089
Ethertype = 0800 (IP)
Data offset = 20 bytes
# ----- naglowek IP -----
Flags = 0x18
Version = 4
..0. .... = No urgent pointer
Header length = 20 bytes
...1 .... = Acknowledgement
Type of service = 0x00 (normal)
Total length = 55 bytes
.... 1... = Push
Identification = 43775
.... .0.. = No reset
Flags = 0x0
.... ..0. = No Syn
.0.. .... = may fragment
.... ...0 = No Fin
..0. .... = last fragment
Window = 8760
Fragment offset = 0 bytes
Checksum = 0xc10c
Time to live = 252 seconds/hops
Urgent pointer = 0
Protocol = 6 (TCP)
No options
Header checksum = 3a45
# ----- dane aplikacji TELNET: -----
Source address = 152.148.13.32,
dane
server.math.edu.pl
Destination address = 155.181.171.109, client
No options
21
Aby dane trafiły do odpowiednich aplikacji uruchomionych na danym hoscie protokół TCP numeruje połączenia.
Każdemu połączeniu aplikacja przypisuje liczbę, port TCP, z przedziału 1 - 65355.
Gniazdo internetowe TCP, (ang.) TCP internet socket, to adres IP hosta, numeru portu, wartość pola typ portu = TCP.
Aplikacja która chce przesłać dane musi zbudować połączenie:
•
odnaleźć odbiorcę
•
wysłać komunikat z zadaniem budowy połączenia.
Zarezerwowane numery portów dla ' dobrze znanych aplikacji' sieciowych służą serwerom aplikacji do nasłuchiwania żądań usługi przez klientów aplikacji.
Protokoły korzystające w warstwie transportowej z TCP:
ftp,
porty: 20, 21
ssh,
port: 22
telnet,
port: 23
SMTP,
port: 25
kerberos,
porty: 88, 464, 749
22
Transmisja danych między klientem a serwerem FTP
Wielkość okna, pole Window = 8760 bajtów
1.
Klient -> Serwer
TCP SeqNumber: 356870796, AckNumber: 349349990, Window: 8760, 2.
Serwer -> Klient
FTP SeqNumber: 349349990, AckNumber: 356870796, Window: 8760, 3.
Serwer -> Klient FTP Transmisja danych do klienta FTP, wielkość danych: 1460
4.
Serwer -> Klient FTP Transmisja danych do klienta FTP, wielkość danych: 1460
5.
Serwer -> Klient FTP Transmisja danych do klienta FTP, wielkość danych: 1460
6.
Serwer -> Klient FTP Transmisja danych do klienta FTP, wielkość danych: 1460
7.
Serwer -> Klient
TCP SeqNumber: 356870796, AckNumber: 349358750, Window: 4096
Liczba wysłanych bajtów:
AckNumber (pakiet 7) 349358750 - SeqNumber (pakiet 2) 349349990 = 8760 (6*1460) 23
(TCP Application Programming Interface)
Podstawowe funkkcje API protokołu TCP (RFC 793)
•
Open
To establish a connection takes several parameters, such as: Active/passive, Foreign socket, Local port number, Timeout value (optional). This returns a local connection name, which is used to reference this particular connection in all other functions.
•
Send
Causes data in a referenced user buffer to be sent over the connection. Can optionally set the URGENT flag or the PUSH flag.
•
Receive
Copies incoming TCP data to a user buffer.
•
Close
Closes the connection; causes a push of all remaining data and a TCP segment with FIN flag set.
•
Status
Is an implementation-dependent call that could return information such as: Local and foreign socket, Send and receive window sizes, Connection state, Local connection name.
•
Abort
Causes all pending Send and Receive operations to be aborted.
•
RESET
to be sent to the foreign TCP.
24