Czy port źródłowy TCP musi być unikalny dla jednego hosta?

10

Nauczyłem się, że krotka identyfikuje połączenie TCP (źródłowy adres IP, port źródłowy, docelowy adres IP, port docelowy). Teoretycznie powinna istnieć możliwość połączenia klienta z hosta1: port1 z serwerem1: port1 i jednocześnie innego klienta (działającego na hoście1) z hosta1: port1 na serwer2: port1.

Przetestowałem trochę w Javie i jak dotąd wydaje się to możliwe.

Jednak wielokrotnie czytałem, że port źródłowy musi być unikalny dla adresu hosta, co w zasadzie oznaczałoby, że istnieje sztywny limit co najwyżej 65536 równoczesnych wychodzących połączeń TCP. Czy to prawda?

Aktualizacja: Oto mój kod Java. Wydaje się, że to działa, a netstat -t wyraźnie pokazuje dwa aktywne, wychodzące połączenia z portu 9990 (jeden do 9997, jeden do 9998). Przynajmniej na nowoczesnym Linuksie wydaje się to możliwe?

Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("localhost",9999);
SocketAddress salocal = new InetSocketAddress("localhost",9990);
s1.bind(salocal);
s1.connect(saremote);


Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("localhost",9998);
SocketAddress salocal2 = new InetSocketAddress("localhost",9990);
s2.bind(salocal2);
s2.connect(saremote2);

I wynik netstat -t (obcięty):

tcp6       0      0 localhost:9990          localhost:9998          CONNECTED 
tcp6       0      0 localhost:9990          localhost:9999          CONNECTED 
Lxgr
źródło
„Jeśli pytasz o górne granice dobrze zaprojektowanych systemów, prawie na pewno robisz coś złego
Chris S

Odpowiedzi:

16

To nie jest wymaganie TCP. Jeśli chodzi o protokół TCP, tylko kombinacja źródłowego adresu IP, portu źródłowego, docelowego adresu IP i portu docelowego musi być unikalna. Jednak w praktyce większość interfejsów API TCP nie zapewnia żadnego sposobu na utworzenie więcej niż jednego połączenia z tym samym portem źródłowym, chyba że mają różne źródłowe adresy IP.

David Schwartz
źródło
2
Dzięki, to całkowicie odpowiada teoretycznej części mojego pytania! Chyba będę musiał po prostu spróbować każdej implementacji TCP.
lxgr
5

To w praktyce maksimum, które zwykle jest niższe. Na przykład Linux używa net.ipv4.ip_local_portparametru jądra do definiowania portów używanych dla połączeń wychodzących. Zazwyczaj jest to coś w rodzaju

sysctl net.ipv4.ip_local_port_range 32768 to 61000

Możesz zwiększyć liczbę dostępną za pomocą sysctl np

sysctl -w net.ipv4.ip_local_port_range="10000 64000"

lub możesz edytować /etc/sysctl.conf z tymi samymi informacjami

net.ipv4.ip_local_port_range = 10000 65535

Wszystkie znalezione przykłady pokazują, że minimalna wartość to 1024.

użytkownik9517
źródło
1

Oprócz odpowiedzi Iaina (powyżej), że może być dozwolone jedynie 10 000 portów dla połączeń wychodzących przez twoje jądro, teoretycznie jesteś co najmniej ograniczony do jednego zestawu portów XX, XXX na adres IP karty. Ponieważ 127.1 nie jest dostępne dla świata zewnętrznego, będąc w sieci lokalnej, więc dla każdego innego adresu IP ( zewnętrznego ) masz zestaw portów wychodzących w zakresie portów 65K.

Tak więc limit wychodzących jest naprawdę:

  With 1 IP Address: XX,XXX (or 2 x XX,XXX on internal network)
  With 2 IP addresses: 2 x XX,XXX (or 3 x XX,XXX on internal network)
  With 3 IP addresses: 3 x XX,XXX (or 4 x XX,XXX on internal network)
  etc.

Aby to zadziałało, musisz przeczytać odpowiedź na ten wątek .

djangofan
źródło
0

Tak. To prawda.

Porty mają się łączyć, a aplikacje z siecią.

Na tym samym hoście nie można mieć więcej niż aplikacji 65553 połączonej za pomocą protokołu TCP, a 65535 połączonej za pomocą protokołu UDP. Systemy operacyjne typowo dynamicznie zarządzały portami i przypisują po jednym dla każdej aplikacji, która łączy się z siecią.

Jeśli na tym samym porcie znajdują się dwie aplikacje, które pojawiają się na tym samym porcie, komputer nie może wiedzieć, która aplikacja dostarczy dane. Na przykład, jeśli masz Messengera i Skype'a na tym samym porcie powiązanym z tym samym portem, twój komunikator pojawi się na skype i vice versa :)

Ricardo Polo
źródło
Myślę, że pytanie nie dotyczyło górnej granicy liczby aplikacji nasłuchujących - która, jak zauważyłeś, jest ograniczona liczbą unikalnych numerów portów - ale liczby gniazd działających jednocześnie. Serwery WWW często mają dziesiątki gniazd skierowanych do jednego portu 80 lub 443. Jeśli zrobiło to wiele serwerów na hoście, nie ma powodu, aby liczba otwartych gniazd nie mogła przekroczyć 2 ^ 32.
Brandon Rhodes,
0

Chociaż system może mieć ograniczenie liczby otwartych połączeń TCP, zwykle nie ma ograniczeń dotyczących używanych numerów portów. Dobra implementacja TCP musi jednak uniemożliwić dwukrotne użycie tej samej pary gniazd. (gniazdo = adres IP + port). Port jest jednak przypisany do procesu, aby zapobiec kradzieży połączeń, a zwykłą metodą jest zażądanie wolnego portu dla portu nasłuchującego lub portu wychodzącego. Zapobiega to duplikowaniu gniazd wychodzących, a tym samym duplikowaniu połączeń. Nieużywając tej metody, sama aplikacja musi uniemożliwić tworzenie duplikatów połączeń.

Papou
źródło
3
Jak to dodaje coś nowego w odpowiedziach już opublikowanych na to stare pytanie?
Chris S