2010-09-07 15 views
12

¿Cómo funciona exactamente un socket de servidor? Cuando creo un socket de servidor java y acepto la conexión en el puerto 1234. ¿El servidor realmente usa el puerto 1234 para todos los clientes? He leído que cuando escribes un servidor de red, el socket realmente abre otro puerto una vez que se acepta la conexión.¿Cómo funciona exactamente un socket de servidor?

¿Es esto cierto? Si es así, ¿por qué no lo veo en netstat? Veo muchas conexiones como esta

tcp  0  0 ::ffff:MY_IP:1234 ::ffff:97.37.134.95:39236 ESTABLISHED 
tcp  0  0 ::ffff:MY_IP:1234 ::ffff:89.204.153.101:26117 ESTABLISHED 
tcp  0  0 ::ffff:MY_IP:1234 ::ffff:195.240.16.70:26193 ESTABLISHED 
tcp  0  0 ::ffff:MY_IP:1234 ::ffff:80.187.98.116:15012 ESTABLISHED 
tcp  0  0 ::ffff:MY_IP:1234 ::ffff:218.78.248.190:30794 ESTABLISHED 

¿De verdad están todas conectadas a mi servidor en 1234? Si es así, ¿no significa eso que el servidor podrá aceptar infinitas conexiones?

Respuesta

1

sí, el servidor puede aceptar cualquier cantidad de conexiones en un solo puerto. Esa es la diferencia entre el servidor y el socket del cliente, el socket del cliente puede tener solo una conexión por puerto.

+0

Entonces, según la lógica, ¿un servidor nunca se quedará sin clientes de servicio al puerto? – erotsppa

+0

@erotsppa nada es infinito en el trabajo de las máquinas. No estoy seguro de poder decir el número exacto, pero es muy grande. (entero (~ 2e9) probablemente) – Andrey

+0

2e9 es aproximadamente 512, vamos a subir a 2^16 (65536) menos algún valor reservado, y se acercará a la verdad. – kriss

3

¿Realmente están todos conectados a mi servidor en 1234?

Si es así, ¿no significa eso que el servidor será capaz de aceptar infinita número de conexiones?

Puede tener 2^32-2-1 (IP4) direcciones (deje uno libre para tener otro host en la misma red), y 2^16 puertos de socket remoto. Eso es mucho, pero no infinito. De todos modos, te quedarás sin memoria antes.

2

Sí, básicamente tienes razón.

El servidor está escuchando en algún puerto (el que usted configura) pero cuando acepta una conexión atribuirá un nuevo número de socket conectado.

Si no ve conectores conectados usando netstat, es probable que sea porque no lo llama con las opciones correctas. Debería tener una conexión LISTEN en el puerto del servidor y una conexión ESTABLISHED con un puerto local asignado para cada conexión remota activa. También podría tener algunos restos de conexión terminada (mal terminada) con el estado TIME WAIT.

A continuación se muestra un poco de extracto de mi sistema estado actual (conseguido con netstat -anlp en Linux)

tcp  0  0 0.0.0.0:3389   0.0.0.0:*    LISTEN  27002/rdpproxy 
tcp  0  0 10.10.4.185:3389  10.10.4.13:36725  ESTABLISHED 27233/rdpproxy 

El servidor es 10.10.4.185 y está escuchando en el puerto 3389. Cualquier IP remota y puerto remoto se le permite conectar.

La segunda línea muestra una sesión conectada. La dirección remota es 10.10.4.13 y reserva el puerto 36725 para esta dirección. Por lo tanto, puede abrir muchas conexiones desde 10.10.4.185 (décimo de miles) y aún más desde otros sistemas.

Y, no, eso no significa que su servidor pueda aceptar un número infinito de conexiones, su sistema puede salir de recursos y no podrá abrir nuevas conexiones mucho antes de ese límite.

+0

Bueno, eso es lo que otros dicen aquí, cuando aceptas una nueva conexión, no consumes ningún otro puerto local. – erotsppa

+0

@erotspaa: * consumes * puerto local adicional desde el rango alto. El puerto del servidor suele ser de rango bajo (puertos conocidos) y reservado. – kriss

+0

@erotspaa: pero ese no es un gran límite, ya que estos puertos están disponibles para cada IP. El problema con los puertos del servidor es que están vinculados a cualquier IP o a un conjunto restringido de IP. Por lo tanto, morirá de hambre mucho más rápido. – kriss

3

Los zócalos TCP/IP se identifican de manera única por la tupla (dirección local, puerto local, dirección remota, puerto remoto).

Esto proporcionará una gran cantidad de enchufes, pero no infinitos.

+0

¿Eso significa que un servidor no tendrá que preocuparse de quedarse sin puertos? Siempre tuve la impresión de que un servidor se quedará sin puerto si tiene más de 65535 conexiones. – erotsppa

+1

Esto es complicado. Técnicamente, el límite es solo 65535 conexiones con la misma dirección de igual, pero muchas acumulaciones de TCP/IP pesimisticamente previenen conflictos al mantener los puertos locales únicos en el tiempo de vinculación del socket. Puede desactivar esto con la opción de socket REUSEADDR, con una pequeña cantidad de riesgo. – Darron

0

No es infinito. Hay un limite En los sistemas operativos basados ​​en Unix, el comando ulimit le indicará la cantidad máxima de "archivos abiertos" que puede tener un proceso y también le permitirá cambiarlo. Si supera este límite, comenzará a ver IOExceptions relacionado con "Demasiados archivos abiertos".

Cuestiones relacionadas