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
Odpowiedzi:
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.
źródło
To w praktyce maksimum, które zwykle jest niższe. Na przykład Linux używa
net.ipv4.ip_local_port
parametru jądra do definiowania portów używanych dla połączeń wychodzących. Zazwyczaj jest to coś w rodzajuMożesz zwiększyć liczbę dostępną za pomocą sysctl np
lub możesz edytować /etc/sysctl.conf z tymi samymi informacjami
Wszystkie znalezione przykłady pokazują, że minimalna wartość to 1024.
źródło
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ę:
Aby to zadziałało, musisz przeczytać odpowiedź na ten wątek .
źródło
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 :)
źródło
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ń.
źródło