¿Cómo se realiza la comunicación de bajo nivel entre sockets en el servidor y el cliente?

  1. Un programa de usuario escribe en un socket. Esta escritura en realidad corresponde a una llamada al sistema, una subrutina del sistema operativo. El sistema operativo toma el control.
  2. El sistema operativo descubre que la escritura corresponde a un determinado socket (que está vinculado a un puerto especificado). Debería concluir el contenido pasado a la llamada write () en un paquete UDP o TCP (en realidad, TCP es más complicado, ya que el sistema operativo guarda una copia de los datos y no los envía hasta que piensa que la red / otro la computadora podrá manejarlo; estos son control de congestión y control de flujo, respectivamente). Asumiré UDP a partir de ahora, ya que es el caso más simple. Los paquetes UDP siempre se envían de inmediato, por lo que el sistema operativo ahora envuelve el paquete en un paquete IPv4 o IPv6 adecuado, ahora debe pasarlo a la interfaz de red para enviarlo, lo que lo envolverá en otra capa más probablemente en un marco de ethernet o Un marco wifi.
  3. Cuando la tarjeta de red puede, enviará el paquete físico. Para una conexión wifi, esto podría llevar algún tiempo, ya que su transceptor wifi esperará a que finalicen otras transmisiones para enviar el paquete; Ethernet en estos días tiende a ser full-duplex, por lo que puede enviarse casi de inmediato. Cuando la tarjeta de red finalmente llegue a enviar el paquete, la trama se modulará en una señal apropiada para el medio en el que viaja.
  4. un enrutador recibe el paquete, lee el destino de la trama y lo reenvía. Algunos enrutadores pueden incluso traducir entre diferentes tipos de conexiones, por lo que necesitarán extraer el paquete IP subyacente y leer la dirección IP de destino desde allí y reenviar el paquete de acuerdo con esa dirección.
  5. Finalmente, la tarjeta de red de la otra computadora recibe una trama (o potencialmente, varias tramas; es posible que el paquete tenga que viajar a través de enlaces que requieren que se divida en paquetes más pequeños; esto es compatible con IP; si esto sucede, el receptor es responsable del reensamblaje).
  6. El marco se desenvuelve y se interpreta el paquete IP subyacente. Esto se desenvolverá aún más para revelar un paquete UDP.
  7. El número de puerto contenido en el paquete UDP informa al sistema operativo de la computadora receptora a qué socket va el paquete. Por supuesto, es posible que no haya un socket abierto en ese puerto, en cuyo caso el paquete se descartaría. Pero si hay un socket allí, el sistema operativo debe colocar este paquete en un lugar donde pueda encontrarlo una llamada de lectura: el búfer UDP del socket. Además, en este punto, las llamadas al sistema como select () y epoll () en este socket probablemente deberían volver a sus programas, lo que indica que el socket está listo para ser leído.
  8. Finalmente, el programa llama a read () en el socket y los datos se devuelven. Si no hay datos disponibles, el programa puede necesitar esperar en la llamada al sistema read () hasta que se reciban los datos.

¿Quieres más detalles en un punto en particular?