tipos socket servidor programacion interfaz funciona ejemplos como comando cliente sockets networking tcp

sockets - servidor - socket tcp



¿Ha abierto el servidor socket para cada proceso de cliente? (3)

Estoy confundido con respecto a los enchufes. Por lo que sé, socket es una combinación de dirección IP y número de puerto. Es solo una abstracción de programación que permite escribir o leer de una secuencia (en el caso de TCP). Ahora, de lo que no estoy absolutamente seguro, es si el servidor tiene UNA o más tomas al servir al cliente. Digamos http en el puerto 80.

¿Todos los datos de varios clientes se enviaron a un socket (servidor: 80) y algún proceso del servidor UBER los distingue según la dirección de entrada o hay más sockets basados ​​en la combinación de la dirección del cliente y el número de puerto creado por la capa TCP ?. ¿Puede alguien describir esto a fondo con un algoritmo paso a paso (para múltiples clientes atendidos al mismo tiempo) y no solo con el servidor vincula el socket al puerto, el servidor escucha el socket, el servidor sirve datos?


Estás confundiendo las conexiones TCP con los sockets. Un socket no es un concepto de nivel de red. Es un concepto de sistema operativo. Existe una conexión TCP en la red como una combinación única de (fuente-ip, puerto-fuente, dest-ip, dest-puerto). Un socket es un identificador para un puerto abierto o una conexión abierta (esta declaración se simplifica ligeramente). Cuando comencé, también pensé que esto era confuso y un error de diseño del sistema operativo (pero es lo que es y estamos atrapados con él). El error de diseño es que la operación permitida para cada uno de los diferentes enchufes es muy diferente. Estos casos de uso deberían haber sido dos conceptos independientes con diferentes nombres y diferentes API.

Como puede ver, no hay una relación 1: 1 entre conectores y conexiones.

¿Alguien puede describir esto a fondo con el algoritmo paso a paso?

Un servidor abre un socket para que el sistema operativo sepa que quiere escuchar o conectarse. Entonces, cada conexión aceptada dará como resultado un nuevo zócalo independiente . Sin embargo, cada conexión nueva está en el mismo servidor: ip y puerto de servidor. Solo el cliente-ip y / o el puerto-cliente son diferentes. El servidor lee y escribe en los sockets por conexión. El socket de puerto abierto es solo para aceptar nuevas conexiones.

El servidor conceptualmente es así:

var openPortSocket = Open(80); //HTTP port while(true) { var connectionSocket = openPortSocket.Accept(); ServeConnectionOnNewThread(connectionSocket); }

Este es un modelo lógico. Las llamadas API reales son diferentes. La mayoría de los servidores usan async IO, por ejemplo. Sin embargo, eso no es relevante para tu pregunta.

Los clientes deben usar un puerto de cliente diferente para cada conexión. Esto es exactamente lo que hace tu navegador.


Por lo general, en el lado del servidor, después de que se crea el socket y se lo vincula a una combinación particular de puerto / dirección, se llamará a una función llamada Listen (o similar). Esto hace que este socket sea un socket de escucha; solo está esperando que se inicien los intentos de conexión.

Después de esto, habrá una llamada a una función llamada algo así como Accept en el socket de escucha. Esta llamada tomará una solicitud de conexión pendiente del socket de escucha, creará un nuevo socket y lo devolverá.

Toda comunicación posterior entre el cliente y el servidor será a través de este nuevo socket (en el extremo del servidor), durante la duración de la conexión.

Se pueden usar diferentes técnicas para lograr la escalabilidad si el servidor necesita manejar múltiples conexiones de clientes simultáneamente. Una técnica simple (que no se adapta a miles de clientes conectados) es generar un nuevo subproceso / proceso (según lo que sea barato en su O / S) para entregar esta conexión y luego el subproceso / proceso original vuelve a llamar a Accept .

Otras técnicas pueden implicar colocar el zócalo en algún tipo de grupo o poder tener zócalos generando eventos que se procesan mediante un número fijo de hilos, a medida que cada zócalo necesita atención.


Puedo hablar principalmente sobre Linux, aunque creo que la mayoría de los kernels OS funcionan de manera similar. La respuesta corta es que el núcleo hace la mayor parte del trabajo.

El kernel se comunica con algún tipo de interfaz de red, que básicamente consiste en traducir señales del cable al kernel y viceversa. Los sockets y las direcciones son meramente descriptivos de una conexión dada. El kernel realiza un seguimiento de qué procesos internos están relacionados con qué pares de socket / dirección y dirigirá los datos en consecuencia. En general, esto se implementa como FIFO: primero en entrar, primero en salir. Esto es cierto para los datos entrantes y salientes.

Si un servidor está conectado a múltiples clientes, generalmente es responsabilidad de la aplicación enviar paquetes separados a cada uno de los clientes conectados, lo que significa que la aplicación debe realizar un seguimiento de la cantidad de clientes activos. Algunos kernels y / o NIC pueden hacer algo de esto por ti. Si se trata de una red local y desea enviar paquetes a cada cliente conectado a la red, puede enviar paquetes de difusión, que solo deben enviarse una vez, pero recibirán todas las conexiones.

Si desea mucha más información, este enlace es muy completo:

¿Cuál es la diferencia entre un puerto y un socket?