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

je voulais connaître la fonction exacte de bind() dans TCP. Que signifie "lier" une adresse locale à la socket? S'il s'agit d'attribuer un numéro de port à la socket, pourquoi ne pas l'utiliser dans le client? Je sais que le port est assigné automatiquement par OS côté client, mais je ne vois pas comment tout cela fonctionne.

après bind(), nous écoutons(). Comment le lier liées à écouter()? Est-ce que l'listen() saura que bind() a été exécuté? Si alors, quels changements bind() apporte-t-il pour qu'il soit connu? Je veux dire, en quoi retourner zéro pour une exécution réussie aide-t-il?

j'ai passé en revue plusieurs définitions, mais je n'ai pas pu obtenir tout cela en détail. Donc, si quelqu'un peut m'expliquer ce à moi, je vous en seront reconnaissants.

39
demandé sur Ajay 2012-10-06 23:51:26

4 réponses

il assigne le numéro de port de la fin" locale".

pour une socket de serveur, c'est la solution ultime - c'est exactement ce dont vous avez besoin: par exemple, votre socket doit être relié au port 80 pour un serveur web.

pour un socket client, cependant, l'adresse locale et le port ne sont généralement pas d'importance. Donc vous n'avez pas bind() . Si le serveur restreint ses clients à avoir peut-être un certain numéro de port, ou un numéro de port hors d'une plage donnée, vous pouvez utilisez bind() du côté du client.

d'un autre côté, vous pourriez aussi bien être en mesure de listen() sur une prise où vous n'avez pas appelé bind() (en fait je ne suis pas sûr de cela, mais il serait logique). Dans ce scénario, votre port serveur serait aléatoire, et le processus du serveur communiquerait son port via un moyen différent au client. Imaginez un protocole" double connexion " tel que FTP, où vous avez une connexion de contrôle et une connexion de données. Le le port sur lequel la connexion de données écoute est complètement arbitraire, mais doit être communiqué à l'autre partie. Ainsi ,le" port déterminé automatiquement " est 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)
17
répondu glglgl 2015-06-11 06:51:19

bind() définit le port local et l'adresse de l'interface pour la connexion. connect() ne implicite bind("0.0.0.0", 0) si l'on n'a pas été fait auparavant (avec zéro étant considéré comme "tout").

pour les connexions sortantes, ceci est généralement acceptable et préférable. Le système d'exploitation se liera simplement à "toutes les interfaces" et choisira un port haut numéroté et non utilisé. Vous n'avez besoin de lier le client que si le serveur s'attend à ce que vous veniez d'un port ou d'un port spécifique. gamme. Certains services n'autorisent que les connexions à partir de numéros de port inférieurs à 1024, ceux qui ne peuvent être reliés que par le superutilisateur, bien que cela ne signifie pas grand chose de nos jours que tout le monde Contrôle sa propre machine.

Pour les connexions entrantes, vous devez lier à un port afin que les clients sachent où vous contacter. Une fois qu'ils l'ont fait, ils ont donné au serveur leur adresse/port local de sorte que la communication peut alors circuler dans les deux directions. listen() ne fonctionnera qu'après un bind() appel.

toutes les sockets doivent se lier, qu'elles soient UDP, TCP, ou autre. Ce n'est pas toujours explicitement fait.

9
répondu Brian White 2012-10-07 13:54:55

Il "lie" un socket à une adresse, sinon il ne sait pas quelle est l'adresse (adresse ip/port paire) il convient d'écouter.

et bind peuvent également être utilisés 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 venant d'une adresse réseau spécifique.

La fixation

n'est pas seulement utilisée pour les sockets TCP, mais aussi pour les sockets UDP, et autres les protocoles aussi.

7
répondu Some programmer dude 2012-10-06 19:55:04

je sais que c'est une vieille question, mais j'ai une nouvelle réponse :)

vous pouvez Vous connecter à un serveur qui ne permet qu'un nombre limité de connexions entrantes par ip.

si vous avez plusieurs cartes d'interface réseau (et donc plusieurs ips sortants possibles pour vous connecter), vous pouvez utiliser bind(), en faisant du vélo manuel à travers chacune de vos ips, afin d'équilibrer vos connexions, et donc avoir plusieurs fois autant de connexions que serait autrement autorisée.

pour obtenir une liste de vos interfaces et ips, voir cette réponse .

0
répondu BenGoldberg 2017-08-02 01:05:11