La porta di origine TCP deve essere unica per host?


10

Ho imparato che una tupla identifica una connessione TCP (IP di origine, porta di origine, IP di destinazione, porta di destinazione). Teoricamente, dovrebbe quindi essere possibile avere un client da host1: port1 connettersi a server1: port1 e allo stesso tempo un altro client (in esecuzione su host1) da host1: port1 a server2: port1.

Ho provato un po 'in Java, e finora sembra possibile.

Tuttavia, ho letto più volte che la porta di origine deve essere univoca per l'indirizzo host, il che significherebbe sostanzialmente che esiste un limite rigido al massimo di 65536 connessioni TCP in uscita simultanee. È vero?

Aggiornamento: ecco il mio codice Java. Questo sembra funzionare e netstat -t mostra chiaramente due connessioni attive in uscita dalla porta 9990 (una a 9997, una a 9998). Almeno su un moderno Linux, sembra possibile?

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);

E l'output di netstat -t (troncato):

tcp6       0      0 localhost:9990          localhost:9998          CONNECTED 
tcp6       0      0 localhost:9990          localhost:9999          CONNECTED 

"Se stai chiedendo dei limiti superiori di sistemi ben progettati, quasi sicuramente lo stai facendo Wrong ™ "
Chris S,

Risposte:


16

Non è un requisito TCP. Per quanto riguarda TCP, solo la combinazione di IP di origine, porta di origine, IP di destinazione e porta di destinazione deve essere unica. Tuttavia, in pratica la maggior parte delle API TCP non fornisce alcun modo per creare più di una connessione con la stessa porta di origine, a meno che non abbiano indirizzi IP di origine diversi.


2
Grazie, questo risponde completamente alla parte teorica della mia domanda! Dovrò solo provare per ogni implementazione TCP, immagino.
lxgr

5

Questo è il massimo in pratica, di solito è più basso. Ad esempio Linux usa il net.ipv4.ip_local_portparametro kernel per definire le porte utilizzate per le connessioni in uscita. Di solito è qualcosa del genere

sysctl net.ipv4.ip_local_port_range 32768 to 61000

È possibile aumentare il numero disponibile con sysctl ad es

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

oppure puoi modificare /etc/sysctl.conf con le stesse informazioni

net.ipv4.ip_local_port_range = 10000 65535

Tutti gli esempi che ho trovato mostrano che anche il valore minimo è 1024.


1

Oltre alla risposta di Iain (sopra), che potrebbero esserci solo 10.000 porte consentite per le connessioni in uscita dal kernel, in teoria il tuo almeno limitato a un set di XX, XXX porte per indirizzo IP sull'adattatore. Poiché 127.1 non è disponibile per il mondo esterno, essendo sulla rete locale, quindi per ogni altro indirizzo IP ( esterno ) hai un set di porte in uscita nel tuo intervallo di porte 65K.

Quindi il limite in uscita è davvero:

  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.

Per farlo funzionare, dovresti leggere la risposta a questa discussione .


0

Sì. Questo è vero.

Le porte devono essere collegate e le app con la rete.

Non è possibile avere più di 65553 applicazioni connesse da TCP e 65535 connesse da UDP sullo stesso host. I sistemi operativi gestiscono tipicamente dinamicamente le porte e ne assegnano una per ogni app che si connette alla rete.

Se hai due applicazioni in elenco sulla stessa porta quando arriva un pacchetto di rete, il computer non è in grado di sapere a quale app consegnerà i dati. Ad esempio, se hai Messenger e Skype sulla stessa porta associati alla stessa porta, il tuo messaggio di messaggistica apparirà in skype e viceversa :)


Penso che la domanda non riguardasse il limite superiore del numero di applicazioni di ascolto - che, come sottolineato, è limitato dal numero di numeri di porta univoci - ma sul numero di socket che funzionano contemporaneamente. I server Web hanno spesso dozzine di socket tutti indirizzati alla loro singola porta 80 o 443. Se lo facessero molti server su un host, non c'è motivo per cui il numero di socket aperti non potesse superare 2 ^ 32.
Brandon Rhodes,

0

Sebbene un sistema possa avere un limite al numero di connessioni TCP aperte, normalmente non ha alcuna restrizione per quanto riguarda i numeri di porta utilizzati. Una buona implementazione TCP deve tuttavia impedire di utilizzare due volte la stessa coppia di socket. (socket = indirizzo IP + porta). Una porta viene tuttavia assegnata a un processo per impedire il furto di connessioni e il metodo abituale è richiedere una porta libera per una porta in ascolto o per una in uscita. Ciò impedisce duplicati socket in uscita e quindi connessioni duplicate. Non riuscendo a utilizzare quel metodo, l'applicazione stessa deve impedire la creazione di connessioni duplicate.


3
In che modo si aggiunge qualcosa di nuovo alle Risposte già pubblicate su questa vecchia domanda ??
Chris S,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.