Czy te 2 pakiety należą do tego samego gniazda TCP?
Powiedzmy, że mamy dwa pakiety A
i B
.
A
: Zawiera źródłowy-IP S1
, docelowy-IP D1
, źródłowy-port SP1
, docelowy-portDP1
B
: Zawiera źródłowy-IP S2
, docelowy-IP D1
, źródłowy-port SP2
, docelowy-portDP1
Oba są protokołem TCP. Czy oba te pakiety będą miały teraz to samo gniazdo?
O UDP Czytałem, że jego gniazdo składa się z docelowego-IP i docelowego-numeru-portu. Tak więc, gdyby zostało to zrobione z UDP, oba pakiety zostałyby odebrane przez to samo gniazdo.
Ale ten przykład dotyczy TCP i tutaj nie jestem pewien, czy przeszedłby również przez to samo gniazdo dla TCP?
Odpowiedzi
Po pierwsze, TCP nie dba o pojedyncze pakiety. Jeśli są to tylko pakiety danych bez wcześniejszego ustanowienia połączenia, zostaną po prostu odrzucone, bez użycia gniazd. Zakładam więc, że chodzi o nawiązane połączenia lub początkowe pakiety do nawiązania połączenia. TCP połączenie jest zdefiniowany co najmniej przez 4 krotki (SRC-IP src-port, dst-ip, dst-port). Ponieważ te 4 krotki są oczywiście różne w obu przypadkach, potrzebne będą różne gniazda.
O UDP Czytałem, że jego gniazdo składa się z docelowego-IP i docelowego-numeru-portu.
Dotyczy to tylko niepołączonych gniazd UDP. Przy podłączonych gniazdach UDP ponownie ważna jest 4 krotka.
O UDP przeczytałem, że ...
Główna różnica między protokołami TCP i UDP polega na tym, że protokół TCP jest zorientowany na połączenie, podczas gdy UDP jest używany do przesyłania pojedynczych pakietów.
Gniazdo UDP obsługuje wszystkie pakiety UDP docierające do określonego (docelowego) portu komputera.
Gniazdo TCP obsługuje wszystkie pakiety należące do określonego połączenia TCP.
Czy oba te pakiety będą miały teraz to samo gniazdo?
To bardziej skomplikowane niż myślisz:
Opisana sytuacja ma zwykle miejsce po „stronie serwera” (na komputerze używającym accept()
interfejsu API do obsługi połączeń przychodzących - na przykład na serwerze WWW).
Powiedzmy, że dwa komputery (z przeglądarkami internetowymi) chcą połączyć się z tym samym serwerem internetowym. Oba komputery wybrały ten sam „źródłowy port TCP”. W tym przypadku pakiety wysłane przez dwa komputery do serwera WWW spełniają twój warunek: tylko źródłowy adres IP różni się w pakietach wysyłanych przez dwa komputery, podczas gdy docelowy adres IP, docelowy port i źródłowy port są takie same.
Jednak po stronie serwera do obsługi pojedynczego połączenia TCP wykorzystywane są dwa gniazda :
- Jedno gniazdo, które używa
listen()
iaccept()
oczekuje na przychodzące połączenia TCP. - Dla każdego przychodzącego połączenia TCP jedno gniazdo jest zwracane przez
accept()
.
Gdy pakiet TCP jest pierwszym pakietem połączenia TCP, pakiet jest „obsługiwany” przez gniazdo TCP, które wykonuje a listen()
na porcie docelowym.
To gniazdo nie dba o źródłowy adres IP ani źródłowy port TCP - podobnie jak gniazda UDP. Gniazdo obsługuje wszystkie pierwsze pakiety połączeń TCP o określonym docelowym adresie IP i określonym porcie docelowym.
Po odebraniu pierwszego pakietu drugie gniazdo (obsługujące połączenie TCP) jest tworzone i zwracane przez access()
API.
To gniazdo obsługuje określone połączenie (a zatem wszystkie dalsze pakiety połączenia TCP).
Ponieważ w przykładzie mamy dwa różne połączenia, z dwoma komputerami łączącymi się z tym samym serwerem przy użyciu tego samego „źródłowego portu TCP”, dwa różne gniazda będą obsługiwać pakiety różniące się tylko docelowym portem TCP.