Ho visto molte risposte simili a questo per quanto riguarda i server socket in java: "Supponiamo che tu abbia un server con un serverocket sulla porta 5000. Il client A e il client B si connetteranno al nostro serverServerSocket accetta socket di ritorno su una porta arbitraria?
Client A invia una richiesta al Server sulla porta 5000. La porta sul lato del Cliente A viene scelta dal Sistema Operativo, in genere il SO seleziona la porta successiva disponibile Il punto di partenza per questa ricerca è il numero di porta precedentemente utilizzato + 1 (quindi, ad esempio, se il sistema operativo si è verificato per la porta 45546 di recente, il sistema operativo proverebbe quindi 45547).
Supponendo che non vi siano problemi di connessione, il server riceve la richiesta del client A di connettersi sulla porta 5000. Il server quindi apre la sua prossima porta disponibile, e lo invia al cliente. Qui, il client A si collega alla nuova porta e il server ha di nuovo disponibile la porta 5000. "
Ho visto risposte come questa in più domande su StackOverflow su come viene utilizzata una porta diversa nel socket restituito del accept() della porta su cui è in ascolto ServerSocket. Ho sempre avuto l'impressione che TCP sia identificato dal quartetto di informazioni:
IP client: porta client e IP server: porta server - anche protocollo (per distinguere TCP da UDP)
Quindi, perché accept() deve restituire un socket associato a una porta diversa? Il quartetto di informazioni inviato in ogni intestazione non distingue più connectio ns alla stessa porta server di macchine diverse abbastanza dove non avrebbe bisogno di usare porte diverse sulla macchina server per la comunicazione?
Ecco un [collegamento alla risposta errata che viene citata] (http://stackoverflow.com/a/17730496/207421). Se ci sono altre di queste "molte risposte simili a questa", si prega di fornire collegamenti in modo che possano essere downvoted e commentati in modo negativo. Non so perché la gente indovina su cose come questa quando la RFC è lì per essere letta. – EJP
Non c'era ipotesi. C'è stata una progressione logica delle informazioni basata su una premessa errata. –
@RussellUhl Una congettura non verificata basata su premesse non verificate e inferenze logiche non esaminate è essenzialmente un'ipotesi. Qual era la premessa imperfetta? Quando hai consultato la RFC? Quando hai dato un'occhiata a Socket.getLocalPort() o a un output di 'netstat'? – EJP