$ lsof
memcached 15844 root 28u IPv6 113604 TCP *:11051 (LISTEN)
memcached 15844 root 29u IPv4 113605 TCP *:11051 (LISTEN)
memcached 15844 root 30u IPv6 113609 UDP *:11051
memcached 15844 root 31u IPv4 113610 UDP *:11051
¿Es por IP, por protocolo o por cualquier otra dimensión?
TCP/UDP
familia? ¿Por qué la salida anteriorlsof
no muestra qué interfaz de red está usando?Respuestas:
Se puede usar el mismo número de puerto una vez para TCP y una vez para UDP, y cada uno de estos existe en IPv4 e IPv6.
Los números de puerto TCP y UDP son espacios de números completamente diferentes, simplemente se asignan en pares y las aplicaciones que generalmente necesitan usar el mismo número en cada uno.
IPv4 e IPv6 son protocolos algo distintos; en principio, una aplicación IPv6 puede aceptar conexiones IPv4, pero generalmente se considera un buen estilo tener dos zócalos separados.
fuente
bind()
en sockets BSD) es por dirección local.Cada entrada en la salida
netstat
olsof -i
se llama socket .Cada toma se hace única por una combinación de:
Esta combinación de variables se llama tupla de conexión .
Considere
ssh
.Si su máquina está funcionando
sshd
, verá una entrada en lanetstat
salida del servidor que se está ejecutando en el puerto22
, escuchando y esperando nuevas conexiones.Pero también verá entradas para cada conexión activa.
Entonces, la salida anterior muestra que el puerto
22
se está utilizando 3 veces en la misma máquina.En este caso, cada conexión es única porque cada una tiene una dirección remota o puerto diferente. Tenga en cuenta que incluso si solo uno de ellos es diferente, todavía hace que el socket sea único.
Pero también puede ser único por dirección local o puerto.
Por ejemplo, podría estar utilizando hosts virtuales basados en IP de Apache para mostrar un sitio diferente según el nombre de host o la dirección IP:
Aquí, hay dos sockets escuchando en el puerto 80.
En este ejemplo, si el tráfico entra con una dirección de destino de 1.2.3.4, se entregará al primer socket; si el destino es 1.2.3.5, va al segundo.
Sin embargo, el servidor tiene que hacer esto explícitamente. El valor predeterminado para un servidor es establecer la dirección local en
0.0.0.0
, también escrita*
, lo que significa que solo habrá un socket de escucha en ese puerto y aceptará todo el tráfico entrante en ese puerto.Como has descubierto, también es único por protocolo.
Por ejemplo, el servidor DNS BIND usa TCP y UDP:
Cada conexión también es única por familia de protocolos, lo que significa que IPv4 e IPv6 pueden ser distintos.
Esto depende de si el programador solicitó un zócalo solo IPv4, un zócalo solo IPv6 o un zócalo combinado IPv4 / IPv6.
En Linux, un socket IPv6 también acepta tráfico IPv4 a menos que el programador se lo indique y, por lo tanto, solo aparece una vez en la
netstat
salida.Pero el código fuente de Memcached muestra que está pidiendo explícitamente un socket solo IPv6, por lo que IPv4 e IPv6 aparecen por separado en su ejemplo.
fuente