2010-07-25 5 views
0

Tout organisme sait comment le numéro de port est lié avec un socket en détail et comment le port utilisé pour transférer le paquet reçu dans la couche de transport à un socket qui lit sur ce port?comment lier le port TCP

merci.

+0

Pas une question de programmation. Essayez: http://serverfault.com/ – gpmcadam

+0

+1: Pas pour serverfault.com. Les questions sur le chemin que les données empruntent au noyau et au socket au niveau de l'application. – sashang

Répondre

4

L'application se lie à une adresse IP locale et à un port à l'aide de la fonction bind(). L'adresse IP et le port distants sont déterminés par l'autre extrémité de la connexion au moment de l'établissement d'une connexion. Dans le noyau, au moment où une connexion tcp est établie, le socket est placé dans une table de hachage basée sur des données comprenant l'adresse locale, le port local, l'adresse distante et le port distant. Lorsqu'un segment tcp entrant arrive, ces valeurs sont extraites de l'en-tête et utilisées pour rechercher le socket correspondant dans la table de hachage. Sous Linux, cette recherche s'effectue dans la fonction inet_lookup_established(). Une fonction similaire, inet_lookup_listener() est utilisée pour rechercher un socket d'écoute à partir d'une table de hachage différente pour une nouvelle connexion; dans ce cas, l'adresse IP et le port distants ne sont pas utilisés.

+0

merci beaucoup. c'est très utile pour moi. Quelques autres questions: 1. donc la hashtable appartient à la couche TCP 2. après avoir obtenu le socket en utilisant inet_lookup_established(), comment le paquet est transmis au thread auquel le socket appartient en détail. 3. Si le socket ne lit pas le paquet entrant en temps opportun, le buffer du socket débordera-t-il et comment le noyau le gèrera-t-il en cas de débordement? Merci! – Alfred

+0

1. Sous Linux, il s'agit de la couche IPv4 ou IPv6. 2. Les données vont au tampon de réception de socket dans le noyau; Voir le code source de 'tcp_data_queue()' pour plus de détails. Les données sont ensuite transférées à l'application lorsqu'elle appelle 'recv()' ou une fonction similaire. 3. L'expéditeur peut uniquement envoyer des données dans la fenêtre de réception, il devra donc ralentir, il ne sera pas lu assez rapidement et le tampon de réception ne pourra pas déborder. Voir RFC 793 pour plus de détails. – mark4o

+0

éventuellement une correction, pas sûr: (true pour 2.6.32-358, CentOS): les deux __inet_lookup_listener() et inet_lookup_established utilisent la même hashtable (appel tcp_hashinfo) pour la recherche. –

Questions connexes