Si creamos un socket de escucha, nos devolverá un descriptor (digamos un descriptor raíz) y vincularemos este descriptor a una dirección. Siempre que hay una nueva conexión de cliente disponible, el descriptor raíz nos informa, aceptamos esa nueva conexión y recibimos un descriptor único (digamos descriptor de cliente) para cada cliente. De ahora en adelante podremos comunicarnos con ese cliente usando ese descriptor. La información del cliente se almacena en el inodo separado que señala el descriptor del cliente. Debido a esto, Linux pudo entregar los datos respectivos del cliente a un descriptor respectivo.
Si lo anterior que mencioné es correcto (corríjame amablemente si no entiendo bien), entonces tengo una duda. ¿Cuál es la información del cliente almacenada en el inodo? ¿Cómo identifica Linux al cliente de forma única?
Respuesta1
Los protocolos TCP/IP y UDP/IP conocen una "sesión" que está definida por la dirección IP y el puerto local y remoto [1]. Un paquete TCP/IP, por ejemplo, contendrá la dirección IP y el puerto [2] de origen y de destino. Un servidor o cliente (digamos, Firefox) que tiene más de una conexión abierta distinguirá en la capa de sesión OSI [3] por dirección y puerto.
Abra un shell y ejecútelo como root mientras usa un navegador web.
netstat -tulpan
para ver las conexiones actuales y activas [4].
Salida de ejemplo:
# netstat -tulpan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1966/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1902/cupsd
tcp 0 0 192.168.1.16:57374 172.217.23.165:443 ESTABLISHED 4730/firefox-bin
tcp 0 0 192.168.1.16:55478 104.26.11.30:443 ESTABLISHED 4730/firefox-bin
udp 0 0 127.0.0.1:53 0.0.0.0:* 1996/named
Las líneas muestran conexiones "ESTABLECIDAS" por Firefox con diferentes puertos locales para que Firefox reconozca qué paquete es la respuesta a qué solicitud.
Otras líneas con el estado LISTEN son programas locales que se ejecutan como un proceso de servidor, incluidos sshd
(Secure Shell Server), cupsd
(printer daemon) y named
(Bind name server). Estos aceptarán conexiones entrantes.
Referencias para saber más:
[1]https://en.wikipedia.org/wiki/Port_(computer_networking)
[2]https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structureasí comohttps://en.wikipedia.org/wiki/IPv4_header#Header
Respuesta2
Cuando haces un listen
especificas un puerto, ya que el puerto tiene que ser bien conocido. Este extremo tiene una IP (o más de una) y un puerto.
Cuando haces un, connect
especificas la IP y el puerto del listen
servidor remoto. La IP local la determina el sistema operativo y se asigna un puerto (puede ser cualquier número).
La conexión se puede identificar mediante ( (remote IP, remote port), (local IP, local port) )
Esto establece un límite superior de 64 K de conexiones a cada puerto remoto, desde cualquier dirección IP.