Diferencia entre un socket y un puerto

118

¿Podría alguien explicar claramente la diferencia entre un puerto y un socket? Sé que un puerto sirve de puerta a la red para una aplicación proceso y que el proceso de la aplicación utiliza una conexión de socket al número de puerto dado para manejar la comunicación de red, pero cuando tiene varios procesos escuchando en un solo número de puerto, me resulta difícil entender la diferencia entre el socket y el puerto y cómo todos encajan.

    
pregunta cobie 29.10.2012 - 13:14

6 respuestas

113

S es un programa de servidor: digamos que es un servidor HTTP, por lo que utilizará el conocido número de puerto para HTTP , que es 80. Lo ejecuto en un host con la dirección IP 10.0.0.4 , por lo que escuchará las conexiones en 10.0.0.4:80 (porque ahí es donde todos esperarán encontrarlo).

Dentro de S , voy a crear un socket y enlazarlo a esa dirección: ahora, el sistema operativo sabe que las conexiones entran en 10.0.0.4:80 se debe enrutar a mi proceso S a través de ese zócalo en particular.

  • salida de netstat una vez que el socket está vinculado:

    $ 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. la dirección local es todos ceros porque a S no le importa cómo lo alcancen sus clientes

Una vez que S tenga este conector enlazado, aceptará conexiones: cada vez que un nuevo cliente se conecta, accept devuelve un socket nuevo , que es específico para ese cliente

  • salida de netstat una vez que se acepta una conexión:

    $ 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 representa el final de la conexión de S y está asociado con el socket devuelto por accept
    • 10.0.0.5:55715 es el extremo de la conexión del cliente y está asociado con el socket que el cliente pasó a connect . El puerto del cliente no se usa para nada, excepto para enrutar paquetes en esta conexión TCP al proceso correcto: el kernel del cliente lo asigna de manera aleatoria desde el rango de puertos efímeros.

Ahora, S puede continuar aceptando más conexiones de clientes ... cada uno tendrá su propio socket, cada socket se asociará con una conexión TCP única, y cada conexión tendrá una única dirección remota S hará un seguimiento del estado del cliente (si lo hay) asociándolo con el socket.

Entonces, aproximadamente:

  • la dirección IP es para enrutar entre hosts en la red
  • el puerto es para enrutar al socket correcto en el host
    • Casi dije proceso correcto , pero en realidad es posible tener múltiples procesos (generalmente secundarios) que acepten todos en el mismo socket ...
    • sin embargo, cada vez que devuelve una de las llamadas simultáneas accept , lo hace en solo un proceso , el socket de cada conexión entrante es único para una instancia del servidor
  • el socket es el objeto que utiliza un proceso para hablar con el sistema operativo acerca de una conexión en particular, como un descriptor de archivos
    • como se mencionó en los comentarios, hay muchos otros usos para sockets que no usan puertos en absoluto: por ejemplo socketpair crea un par de sockets conectados que tienen un esquema de direccionamiento no en absoluto. La única forma de usar esa tubería es mediante el proceso que se llama socketpair , siendo un hijo de ese proceso y heredar uno, o haber pasado explícitamente uno de los sockets de ese proceso
respondido por el Useless 29.10.2012 - 18:24
48

Piense en su máquina como un edificio de apartamentos:

  • Un puerto es un número de apartamento.

  • Un enchufe es la puerta de un apartamento.

  • Una dirección IP es la dirección de la calle del edificio.

respondido por el Caleb 29.10.2012 - 13:55
44

Un puerto es parte de la dirección en los protocolos TCP y UDP. Se utiliza para ayudar al sistema operativo a identificar qué aplicación debe obtener los datos que se reciben. Un sistema operativo debe admitir puertos para admitir TCP y UDP porque los puertos son una parte intrínseca de TCP y UDP.

Un socket es parte de la interfaz que el sistema operativo presenta a las aplicaciones para permitirles enviar y recibir datos de la red. La mayoría de las implementaciones de socket admiten muchos protocolos más allá de TCP y UDP, algunos de los cuales no tienen un concepto de puertos. Un sistema operativo no tiene que admitir sockets para admitir TCP o UDP; podría proporcionar una interfaz diferente para las aplicaciones a utilizar. Un socket es simplemente una forma de enviar y recibir datos en un puerto específico.

    
respondido por el Dirk Holsopple 29.10.2012 - 13:23
7

Una computadora tiene una dirección IP que lo identifica como una entidad separada en la red. Agregamos un número adicional al que nos permite diferenciar las conexiones a esa computadora. Este es el número de puerto. En el lado del sistema operativo de la conexión, necesita buffers, estado de conexión, etc. Este objeto lógico es el socket.

    
respondido por el stonemetal 29.10.2012 - 15:47
0

Un socket es una ruta de comunicación a un puerto. Cuando desea que su programa se comunique a través de la red, le ha dado una forma de direccionar el puerto y esto se hace creando un socket y conectándolo al puerto. Básicamente, socket = IP + ports Sockets brindan acceso al puerto + ip

    
respondido por el Sitati 30.10.2012 - 12:48
-1

Una dirección IP identifica el dispositivo, es decir, la dirección del dispositivo en particular, cuando llegó a la máquina utilizando IP. El puerto ahora define el proceso en el que se debe comunicar esa máquina.

Por lo tanto, para que la comunicación real tenga lugar, necesita tanto el puerto + IP que se llama socket.

    
respondido por el p.j 30.10.2012 - 12:59

Lea otras preguntas en las etiquetas