web-dev-qa-db-fra.com

Différence entre un socket et un port

Quelqu'un pourrait-il expliquer clairement la différence entre un port et une prise? Je sais qu'un port sert de porte d'accès au réseau pour un processus d'application et que le processus d'application utilise une connexion socket au numéro de port donné pour gérer la communication réseau, mais lorsque vous avez plusieurs processus à l'écoute sur un seul numéro de port, je trouve il est difficile de comprendre la différence entre la prise et le port et comment ils s'emboîtent tous.

128
cobie

[~ # ~] s [~ # ~] est un programme serveur: disons que c'est un serveur HTTP, donc il utilisera le fameux numéro de port pour HTTP , qui est 80. Je l'exécute sur un hôte avec l'adresse IP 10.0.0.4, il écoutera donc les connexions sur 10.0.0.4:80 (car c'est là que tout le monde s'attendra à le trouver).

À l'intérieur [~ # ~] s [~ # ~] , je vais créer un socket et lier à cette adresse: maintenant, le système d'exploitation sait que les connexions entrant dans 10.0.0.4:80 doit être acheminé vers mon processus [~ # ~] [~ # ~] via ce socket particulier.

  • sortie netstat une fois le socket lié:

    $ netstat --tcp -lan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address            State
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                  LISTEN
    

    NB. l'adresse locale est entièrement nulle car [~ # ~] s [~ # ~] ne se soucie pas de la façon dont ses clients l'atteignent

Une fois que [~ # ~] s [~ # ~] a ce socket lié, il accepter connexions - chaque fois qu'un un nouveau client se connecte, accept renvoie un socket nouveau, qui est spécifique à ce client

  • sortie netstat une fois la connexion acceptée:

    $ netstat --tcp -lan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address            State
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                  LISTEN
    tcp        0      0 10.0.0.4:80                 10.0.0.5:55715             ESTABLISHED
    
    • 10.0.0.4:80 représente la fin de la connexion de [~ # ~] [~ # ~] et est associée au socket retourné par accept
    • 10.0.0.5:55715 est la fin de la connexion du client et est associé au socket que le client a passé à connect . Le port du client n'est utilisé que pour le routage des paquets sur cette connexion TCP au bon processus: il est attribué de manière aléatoire par le noyau du client à partir de la plage de ports éphémères.

Maintenant, [~ # ~] s [~ # ~] peut continuer à accepter plus de connexions client ... chacun aura sa propre socket, chaque socket sera associé à une unique TCP, et chaque connexion aura une adresse distante unique. [~ # ~] s [~ # ~] suivra l'état du client (le cas échéant) en l'associant au socket.

Donc, grosso modo:

  • l'adresse IP sert au routage entre les hôtes du réseau
  • le port sert au routage vers la bonne prise sur l'hôte
    • J'ai presque dit processus correct, mais il est en fait possible d'avoir plusieurs processus (généralement enfants) acceptant tous sur la même socket ...
    • cependant, chaque fois que l'un des appels accept simultanés revient, il le fait uniquement dans le processus one, chaque socket de connexion entrante est unique pour une instance du serveur
  • le socket est l'objet qu'un processus utilise pour parler au système d'exploitation d'une connexion particulière, un peu comme un descripteur de fichier
    • comme mentionné dans les commentaires, il existe de nombreuses autres utilisations pour les sockets qui n'utilisent pas du tout de ports: par exemple socketpair crée une paire de sockets connectés ensemble qui ont non = schéma d'adressage - la seule façon d'utiliser ce canal est d'être le processus qui a appelé socketpair, d'être un enfant de ce processus et d'en hériter, ou de passer explicitement l'une des sockets de ce processus
118
Useless

Considérez votre machine comme un immeuble à appartements:

  • Un port est un numéro d'appartement.

  • Une prise est la porte d'un appartement.

  • Une adresse IP est l'adresse municipale du bâtiment.

52
Caleb

Un port fait partie de l'adresse dans les protocoles TCP et UDP. Il est utilisé pour aider le système d'exploitation à identifier l'application qui doit obtenir les données reçues. Un système d'exploitation doit prendre en charge les ports pour prendre en charge = TCP et UDP car les ports font partie intrinsèque de TCP et UDP.

Un socket fait partie de l'interface que le système d'exploitation présente aux applications pour leur permettre d'envoyer et de recevoir des données réseau. La plupart des implémentations de socket prennent en charge de nombreux protocoles au-delà de TCP et UDP, dont certains n'ont pas de concept de ports. Un système d'exploitation n'a pas à prendre en charge les sockets pour prendre en charge TCP ou UDP; il pourrait fournir une interface différente pour les applications à utiliser. Un socket est simplement un moyen d'envoyer et de recevoir des données sur un port spécifique.

48
Dirk Holsopple

Un ordinateur possède une adresse IP qui l'identifie comme une entité distincte sur le réseau. Nous ajoutons un numéro supplémentaire à cela pour nous permettre de différencier les connexions à cet ordinateur. Ceci est le numéro de port. Du côté OS de la connexion, vous avez besoin de tampons, de l'état de la connexion, etc. Cet objet logique est le socket.

8
stonemetal

Un socket est un chemin de communication vers un port. Lorsque vous souhaitez que votre programme communique sur le réseau, vous lui avez donné un moyen d'adresser le port et cela se fait en créant un socket et en le connectant au port. Fondamentalement, socket = IP + ports Les sockets permettent d'accéder au port + ip

0
Sitati