Protokół TCP jest jedną z możliwych implementacji warstwy transportu w modelu OSI, ma on następujące cechy:
jeden-do-jeden
Pozwala na uwtorzenie dwukierunkowego kanału danych między dwoma hostami w sieci.
niezawodność (reliability)
Dane wysłane za pomocą protokołu TCP muszą dotrzeć do systemu docelowego. Jeśli nie jest możliwe dostarczenie danych (np. z powodu braku łączności z internetem systemu docelowego) implementacja protokołu TCP musi zwrócić błąd.
kontrolę błędów
Dane wysłane przez protokół TCP posiadają sumy kontrolne, które pozwalają wykryć błędy w transmisji.
kolejność
Jeśli jakaś wiadomość TCP jest wysłana jako wiele oddzielnych pakietów IP, wiadomość dotrze w tej samej kolejności w jakiej była wysłana.
Na poziomie protokołu IP operuje się pojedyńczymi pakietami, pakiety te mogą po drodze między dwoma systemami się zawieruszyć.
Na poziomie protokolu TCP operuje się strumiueniami danych, strumień tych danych jest niezawodny.
W praktyce programowanie oparte na strumieniach (znane z basha) i programowanie TCP nie różni się zbytnio.
Adresy IP jednoznacznie idenyfikują komputery, my chcielibyśmy jeszcze móc zaadresować kilka usług na jednym komputerze (jest to nie możliwe na poziomie protokołu IP!). Dlatego TCP (oraz UDP) używają dodatkowego numeru zwanego numerem portu.
Na komputerze docelowym numer portu jest najczęściej powiązany z usługą z jaką komputer chce się połączyć (port 80 to HTTP) – pełna lista portów dostępna jest w Internecie.
Na komputerze inicjującym port jest wybierany losowo.
Połączenie TCP jest jednoznacznie identyfikowane przez cztery liczby:
destination-port
Numer portu na komputerze do którego jest nawiązywane połączenie.
destination-host
Numer IP hosta do którego jest nawiązywane połączenie.
source-port
Numer portu na komputerze z którego jest nawiązywane połączenie.
source-host
Numer IP hosta z którego jest nawiązywane połączenie.
By nawiązać połączenie należy wymienić tzw. handshake TCP, polega on na wysłaniu trzech pakietów:
SYN
Wysyła go klient, zawiera on losową liczbę x.
SYN+ACK
Wysyła go serwer, zawiera on losową liczbę y, oraz liczbę x+1.
ACK
Wysyła go klient zawiera on liczbę y+1.
Użycie protokółu TCP powoduje powstanie pewnego narzutu, którego oszacowanie jest trudny, a sam rozmiar narzutu zależny od rozmiaru poszczególnych pakietów.
Dla długich połączeń narzut TCP jest w granicach 5%, dla wysłania pojedyńczej wiadomości może wynosić kilkaset procent (koszt wykonania handshake).