it-swarm.com.de

Warum wird bind () in TCP verwendet? Warum wird es nur auf der Serverseite und nicht auf der Clientseite verwendet?

Ich wollte die genaue Funktion von bind () in TCP kennen. Was bedeutet es, eine lokale Adresse an den Socket zu binden? Wenn es dem Socket eine Portnummer zuweist, warum verwenden wir sie dann nicht im Client? Ich weiß, dass der Port automatisch vom Betriebssystem auf der Clientseite zugewiesen wird, aber ich bekomme nicht den Überblick, wie all dies funktioniert.

Nach bind () hören wir (). Wie hängt die Bindung mit listen () zusammen? Wird das listen () wissen, dass bind () ausgeführt wurde? Wenn ja, welche Änderungen macht bind () so, dass es bekannt ist? Ich meine, wie hilft das Nullen für eine erfolgreiche Ausführung?

Ich habe viele Definitionen durchgesehen, aber keine, wo ich das alles im Detail erfahren könnte. Wenn mir jemand dies bitte erklären kann, bin ich dankbar.

42
Crocode

Es weist die Portnummer des "lokalen" Endes zu.

Für einen Server-Socket ist dies der ultimative Weg - es ist genau das, was benötigt wird: Lassen Sie Ihren Socket beispielsweise für einen Webserver an Port 80 gebunden sein.

Für einen Client-Socket ist jedoch normalerweise die lokale Adresse und der Port nicht von Bedeutung. Also bind() nicht. Wenn der Server seine Clients auf eine bestimmte Portnummer oder eine Portnummer aus einem bestimmten Bereich beschränkt, können Sie bind() auch auf der Clientseite verwenden.

Andererseits können Sie auch listen() auf einem Socket verwenden, an dem Sie nicht bind() aufgerufen haben (eigentlich bin ich mir nicht sicher, aber es wäre sinnvoll). In diesem Szenario wäre Ihr Serverport zufällig, und der Serverprozess würde den Port auf andere Weise an den Client kommunizieren. Stellen Sie sich ein "Double Connection" -Protokoll wie FTP vor, bei dem Sie eine Kontrollverbindung und eine Datenverbindung haben. Der Port, auf den die Datenverbindung wartet, ist völlig willkürlich, muss jedoch auf die andere Seite übertragen werden. So wird der "automatisch ermittelte Port" verwendet und kommuniziert.

Ein Beispiel in Python:

import socket
s = socket.socket() # create your socket
s.listen(10) # call listen without bind
s.getsockname() Which random port number did we get?
# here results in ('0.0.0.0', 61372)

s2 = socket.socket() # create client socket
s2.connect(('localhost', 61372)) # connect to the one above
s3, x = s.accept() # Python specific use; s3 is our connected socket on the server side
s2.getpeername()
# gives ('127.0.0.1', 61372)
s2.getsockname()
# gives ('127.0.0.1', 54663)
s3.getsockname()
# gives ('127.0.0.1', 61372), the same as s2.getpeername(), for symmetry
s3.getpeername()
#gives ('127.0.0.1', 54663), the same as s2.getsockname(), for symmetry
#test the connection
s2.send('hello')
print s3.recv(10)
18
glglgl

bind() definiert den lokalen Port und die Schnittstellenadresse für die Verbindung. connect() führt eine implizite bind("0.0.0.0", 0) durch, wenn dies noch nicht geschehen ist (wobei Null als "any" genommen wird).

Für ausgehende Verbindungen ist dies im Allgemeinen akzeptabel und bevorzugt. Das Betriebssystem bindet sich einfach an "alle Schnittstellen" und wählt einen nicht verwendeten Port mit hoher Nummer aus. Sie müssen nur an den Client binden, wenn der Server erwartet, dass Sie von einem bestimmten Port oder Portbereich kommen. Einige Dienste lassen nur Verbindungen von weniger als 1024 Portnummern zu, die nur vom Superuser bindbar sind. Dies bedeutet jedoch heutzutage nicht viel, da jeder seinen eigenen Computer kontrolliert.

Für eingehende Verbindungen müssen Sie eine Verbindung zu einem bekannten Port herstellen, damit die Clients wissen, wo Sie Kontakt aufnehmen sollen. Sobald sie dies getan haben, haben sie dem Server ihre lokale Adresse/Port gegeben, damit die Kommunikation in beide Richtungen fließen kann. listen() funktioniert nur nach einem Aufruf von bind().

Alle Sockets müssen eine Verbindung herstellen, unabhängig davon, ob es sich um UDP, TCP oder andere handelt. Es wird einfach nicht immer explizit gemacht.

10
Brian White

Es "bindet" einen Socket an eine Adresse, sonst weiß er nicht, welche Adresse (IP-Adresse/Port-Paar) er hören soll.

Und bind kann auch auf der Clientseite verwendet werden. Ein Beispiel ist ein Computer mit mehreren Netzwerkkarten, die an dasselbe Netzwerk angeschlossen sind, der Client möchte jedoch nur von einer bestimmten Netzwerkadresse aus gesehen werden.

Die Bindung wird nicht nur für TCP - Sockets verwendet, sondern auch für UDP-Sockets und andere Protokolle.

Ich weiß, das ist eine alte Frage, aber ich habe eine neue Antwort :)

Möglicherweise möchten Sie eine Verbindung zu einem Server herstellen, auf dem nur eine begrenzte Anzahl eingehender Verbindungen pro IP zulässig ist.

Wenn Sie über mehrere Netzwerkschnittstellenkarten verfügen (und damit mehrere mögliche ausgehende IPS zum Herstellen einer Verbindung), können Sie bind () verwenden, indem Sie manuell durch jeden Ihrer IPS navigieren, um Ihre Verbindungen auszugleichen, und haben daher mehrmals so viele Verbindungen wie wäre sonst erlaubt.

Eine Liste Ihrer Schnittstellen und ips finden Sie unter this answer.

0
BenGoldberg