Diferencia entre un zócalo y un puerto

121

¿Podría alguien explicar claramente la diferencia entre un puerto y un zócalo? Sé que un puerto sirve como puerta de entrada a la red para un proceso de aplicación y que el proceso de aplicación utiliza una conexión de socket al número de puerto dado para manejar la comunicación de red, pero cuando tienes múltiples procesos escuchando en un solo número de puerto, estoy descubriendo Es difícil entender la diferencia entre el zócalo y el puerto y cómo encajan entre sí.

cobie
fuente
99
El puerto es una dirección física, mientras que el socket es un objeto.
superM
14
Si un paquete golpea un bolsillo en un socket en un puerto ...
user16764

Respuestas:

116

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

Dentro de S , voy a crear un socket y vincularlo a esa dirección: ahora, el sistema operativo sabe que las conexiones que entran 10.0.0.4:80deben enrutarse a mi proceso S a través de ese socket 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
    

    NÓTESE BIEN. la dirección local es todo ceros, porque S no le importa cómo sus clientes lleguen a él

Una vez que S tiene este socket enlazado, aceptará conexiones: cada vez que un nuevo cliente se conecta, acceptdevuelve un nuevo socket, 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:80representa el final de la conexión de S y está asociado con el socket devuelto poraccept
    • 10.0.0.5:55715es el final de la conexión del cliente y está asociado con el socket que el cliente pasó para conectarse . El puerto del cliente no se utiliza para nada excepto para enrutar paquetes en esta conexión TCP al proceso correcto: el núcleo del cliente lo asigna aleatoriamente 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 estará asociado con una conexión TCP única y cada conexión tendrá una dirección remota única. S rastreará el estado del cliente (si hay alguno) al asociarlo con el socket.

Entonces, más o menos:

  • la dirección IP es para el enrutamiento entre hosts en la red
  • el puerto es para enrutar al socket correcto en el host
    • Casi dije que el proceso era correcto , pero en realidad es posible tener múltiples procesos (generalmente secundarios), todos aceptando en el mismo socket ...
    • sin embargo, cada vez que acceptregresa una de las llamadas simultáneas , lo hace en un solo proceso, cada socket de 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 particular, como un descriptor de archivo
    • como se menciona en los comentarios, hay muchos otros usos para los sockets que no usan puertos en absoluto: por ejemplo, socketpair crea un par de sockets conectados que no tienen ningún esquema de direccionamiento, la única forma de usar esa tubería es el proceso que llamó socketpair, ser hijo de ese proceso y heredar uno, o pasar explícitamente uno de los sockets de ese proceso
Inútil
fuente
1
@ Inútil Vale la pena mencionar que los sockets no necesitan estar basados ​​en IP como lo indica la respuesta. No es exactamente relevante para el OP, pero una explicación de las familias de sockets ayudaría a completar esta respuesta.
hafichuk
Buen punto: ya me preocupaba el alcance del alcance cuando comencé a escribir sobre servidores multiproceso. Siéntase libre de editarlo, y si no lo hace, lo consultaré en algún momento ...
Inútil el
11
esto no es inútil en absoluto
l --''''''--------- '' '' '' '' '' ''
Trato de entender el zócalo en la electrónica, un servidor conecta un zócalo a un número de puerto es como poner un zócalo en una pared esperando que algunos dispositivos electrónicos se enchufen para cargar la batería. Pero cuando se acepta, se devuelve un nuevo socket? ¿Por qué? ¿Se pone una nueva toma de corriente en la pared? Por favor, ayúdame a darle sentido por alguna analogía.
Aaron Shen
3
El problema aquí es que su analogía es incorrecta. Olvida lo que significa un socket en el mundo físico: no es una metáfora de otra cosa, solo un término técnico para un concepto de software técnico específico. Ni siquiera está muy relacionado con los puertos o sockets físicos de la red, solo tiene que entenderlo, en este dominio, como un concepto en sus propios términos.
Inútil
49

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

  • Un puerto es un número de apartamento.

  • Un zócalo es la puerta de un apartamento.

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

Caleb
fuente
3
Me gusta esta analogía, aunque ahora estoy pensando en estar dentro de ese apartamento mirando un corredor sin fin con muchas puertas. No puedo salir. ¡No puedo salir! :)
Daniel Hollinrake
1
@Caleb A socket is the door of an apartment.Pero, ¿no podría haber numerosos enchufes abiertos en un puerto?
Suhail Gupta
3
@suhail A veces un apartamento tiene más de una puerta. Todos tienen el mismo número de apartamento, pero son puertas diferentes.
Caleb
45

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 SO 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 concepto de puertos. Un sistema operativo no tiene que admitir sockets para admitir TCP o UDP; podría proporcionar una interfaz diferente para que las aplicaciones la utilicen. Un socket es simplemente una forma de enviar y recibir datos en un puerto específico.

Dirk Holsopple
fuente
Un socket es esencialmente una tupla compuesta de 4: IP de origen: Port-Dest IP: Port.
Tony The Lion
¿Quiere decir que el puerto solo existe en los protocolos TCP y UDP? ¿Qué pasa con http y otros protocolos?
Hosein Aqajani
HTTP es un protocolo de capa de aplicación que se ejecuta sobre protocolos de capa de transporte como TCP o UDP. No tiene su propio concepto de puertos, los hereda del protocolo de capa de transporte subyacente.
Dirk Holsopple
8

Una computadora tiene una dirección IP que la identifica como una entidad separada en la red. Agregamos un número adicional para permitirnos diferenciar entre 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.

metal de piedra
fuente
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 + puertos Los sockets proporcionan acceso al puerto + ip

Sitati
fuente
-1

Una dirección IP identifica el dispositivo, es decir, la dirección del dispositivo en particular, cuando llegó a la máquina usando IP ahora el puerto define a qué proceso en esa máquina comunicarse.

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

pj
fuente