Pourquoi bind () est-il utilisé dans TCP? Pourquoi est-il utilisé uniquement du côté serveur et non du côté client?

Je voulais connaître la fonction exacte de bind () dans TCP. Qu’est-ce que cela signifie en “liant” une adresse locale au socket? S’il atsortingbue un numéro de port au socket, pourquoi ne pas l’utiliser dans le client? Je sais que le port est atsortingbué automatiquement par le système d’exploitation du côté client, mais je ne comprends pas comment cela fonctionne.

Après bind (), nous écoutons (). Comment la liaison est-elle liée à listen ()? Est-ce que listen () saura que bind () a été exécuté? Si oui, quelles modifications bind () fait-il pour qu’il soit connu? Je veux dire, comment revenir zéro pour une exécution réussie aide-t-il?

J’ai parcouru de nombreuses définitions, mais pas où je pourrais obtenir tout cela en détail. Donc, si quelqu’un peut me l’expliquer, je vous en serai reconnaissant.

Il atsortingbue le numéro de port de l’extrémité “locale”.

Pour un socket de serveur, c’est le moyen ultime – c’est exactement ce dont vous avez besoin: votre socket doit être lié au port 80 pour un serveur Web, par exemple.

Pour un socket client, cependant, l’adresse locale et le port ne sont normalement pas importants. Donc, vous ne bind() pas bind() . Si le serveur restreint ses clients à un certain numéro de port ou à un numéro de port sur une plage donnée, vous pouvez également utiliser bind() côté client.

D’un autre côté, vous pourriez aussi bien listen() sur un socket où vous n’avez pas appelé bind() (en fait, je n’en suis pas sûr, mais cela aurait du sens). Dans ce scénario, votre port de serveur serait aléatoire et le processus du serveur communiquerait son port via un moyen différent au client. Imaginez un protocole de “double connexion” tel que FTP, où vous avez une connexion de contrôle et une connexion de données. Le port sur lequel la connexion de données est à l’écoute est complètement arbitraire, mais doit être communiqué à l’autre côté. Le “port déterminé automatiquement” est donc utilisé et communiqué.

Un exemple en 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) 

bind() définit le port local et l’adresse de l’interface pour la connexion. connect() effectue une bind("0.0.0.0", 0) implicite bind("0.0.0.0", 0) si aucune n’a été effectuée précédemment (zéro étant considéré comme “any”).

Pour les connexions sortantes, cela est généralement acceptable et préféré. Le système d’exploitation se liera simplement à “toutes les interfaces” et choisira un port inutilisé et hautement numéroté. Vous devez uniquement vous connecter au client si le serveur s’attend à ce que vous veniez d’un port ou d’une plage de ports spécifique. Certains services n’autorisent que les connexions à partir de numéros de port inférieurs à 1024, ceux qui ne peuvent être liés que par le super-utilisateur, même si cela ne signifie pas grand-chose maintenant que tout le monde contrôle sa propre machine.

Pour les connexions entrantes, vous devez vous connecter à un port connu afin que les clients sachent où vous contacter. Une fois cela fait, ils ont donné au serveur leur adresse / port local afin que la communication puisse alors circuler dans les deux sens. listen() ne fonctionnera qu’après un appel bind() .

Tous les sockets doivent être liés, qu’ils soient UDP, TCP ou autre. Ce n’est pas toujours fait explicitement.

Il “lie” un socket à une adresse, sinon il ne sait pas quelle adresse (adresse IP / paire de ports) il doit écouter.

Et bind peut également être utilisé du côté client. Un exemple est sur un ordinateur avec plusieurs cartes réseau connectées au même réseau, mais le client veut seulement être vu comme provenant d’une adresse réseau spécifique.

La liaison n’est pas seulement utilisée pour les sockets TCP, mais également pour les sockets UDP et d’autres protocoles.

Je sais que c’est une vieille question, mais j’ai une nouvelle réponse 🙂

Vous pouvez vouloir vous connecter à un serveur qui n’autorise qu’un nombre limité de connexions entrantes par IP.

Si vous disposez de plusieurs cartes d’interface réseau (et donc de plusieurs ips sortants possibles pour vous connecter), vous pouvez utiliser bind (), en effectuant manuellement le cyclage sur chacun de vos ips, afin d’équilibrer vos connexions. serait autrement permis.

Pour obtenir une liste de vos interfaces et ips, consultez cette réponse.