Im UDP-Protokoll wird ein Socket durch die Quell-IP und den Quellport eindeutig identifiziert.
Im TCP-Protokoll wird der Socket durch die Quell-IP, den Quell-Port, die Ziel-IP und den Ziel-Port eindeutig identifiziert. Warum benötigt das TCP-Protokoll zwei zusätzliche Informationen?
Hinweis: Für die TCP-Terminologie ist der Socket das Adress-Port-Paar. Ein Paar Sockets definiert die Verbindung . (Gemäß RFC 793 p5)
Ich fürchte, Sie irren sich über UDP, das zwar nicht wirklich "Sockets" hat - auch wenn die Berkeley Sockets-Bibliothek sie so nennt, und es ist vernünftig, ein Adress-Port-Paar aufzurufen - Multiplexe im Wesentlichen der gleiche Weg wie TCP.
Eine typische Situation, in der Sie dies sehen können, sind mehrere DNS-Auflösungen gleichzeitig von einem Host auf denselben DNS-Server, wobei eindeutig nur die Quellportnummer notwendigerweise unterschiedlich ist. Sie sehen, dass dies genau die gleiche Situation ist wie bei mehreren gleichzeitigen TCP-Verbindungen von einem Client zu einem einzelnen Webserver.
UDP verfügt über verbindungslose Datagramme. Host A sendet das Datagramm aus einem Adress-Port-Paar, das an ein Adress-Port-Paar bei B gerichtet ist, das normalerweise, aber nicht immer, spiegelbildlich antwortet. Wenn man lockerer von der "Kommunikation" spricht, arbeitet sie über genau das gleiche 4-Tupel wie eine TCP-Verbindung.
Manchmal wird ein Verweis auf ein 5-Tupel von (Procotol, Quelladresse, Quellport, Zieladresse, Zielport) angezeigt, wobei das Protokoll 17 für UDP, 6 für TCP usw. lautet. Dies ist, wofür die meisten Firewalls, Router usw. verwendet werden NAT und ähnliche Operationen zur Identifizierung dieses kommunizierenden Paares.
obwohl der Server einen TCP-Socket speziell für diese Sitzung an einem anderen Port eingerichtet hat
Ich befürchte, Sie irren sich auch in Bezug auf TCP, möglicherweise aufgrund des Terminologiekonflikts zwischen der Definition des TCP-Protokolls (RFC 793) und seiner häufigsten praktischen Implementierung, der Berkeley Sockets Library, wie sie in Unix verwendet wird, und allem, von dem abstammt es.
Wenn Sie sich auf das Protokoll konzentrieren, ist es viel klarer: Es gibt keinen "anderen Port". Der Web - Server ist nur abhört, beispielsweise 1.1.1.1 Port 80. Der Client nur sendet aus, zur Illustration 2.2.2.2 Port 56789. Jedes einzelne Paket 1.1.1.1:80 zu 2.2.2.2:56789 oder umgekehrt sein wird , ;; leicht zu überprüfen durch Betrachten von Paketen mit tcpdump / wireshark / etc.
(Um ganz kurz auf die Berkeley-Implementierung einzugehen, wird eine TCP- Verbindung durch eine Ganzzahl dargestellt, die normalerweise aber verwirrend aufgerufen wird sockfd
. Ein TCP- Socket wird durch a dargestellt struct sockaddr
. Der accept()
Systemaufruf spricht sehr verwirrend davon, einen "neuen verbundenen Socket" zu erstellen, womit er gemeint ist neue VerbindungStruktur im verbundenen Zustand. Das Tupel dieser resultierenden Sache wäre in unserem Beispiel (1.1.1.1, 80, 2.2.2.2, 56789). In Bezug auf UDP können Sie in der Bibliothek UDP als verbunden betrachten. Dies ist eine bequeme, wenn auch völlig falsche Art, den UDP-Datagrammaustausch zwischen zwei Prozessen zu beschreiben, und bedeutet lediglich, dass sich die Struktur an das entfernte Adress-Port-Paar erinnert, das das UDP programmatisch macht "Verbindung" sieht genauso aus wie eine TCP. Denken Sie daran, dass die Berkeley-Bibliothek nicht nur für IP gedacht ist und Verallgemeinerungen verschiedener zugrunde liegender Netzwerksysteme enthält. Wenn Sie diesen Begriffen der Netzwerkprogrammierung folgen möchten, empfehle ich Stack Overflow, das viele sehr kompetente Netzwerkprogrammierer hat.)