Lección 21: TCP Sockets — Servidor y cliente
TCP (Transmission Control Protocol) es la base de toda comunicación confiable en la red. Cuando abres un navegador, ejecutas un Git fetch, o conectas dos procesos NCCL para entrenamiento distribuido — en la mayoría de los casos TCP trabaja detrás de escena. En esta lección escribiremos un servidor T
Imagina un servidor TCP como un restaurante. Primero eliges un número de mesa (bind a un puerto), luego abres la puerta y anuncias 'estamos abiertos' (listen), y te sientas a esperar que entre un cliente (accept). El cliente llega (connect), se sienta a la mesa, pide (send), y recibe su pedido de vuelta (recv). TCP garantiza que cada plato llegue en el orden correcto y sin faltantes — como un mesero que verifica que cada plato llegó antes de servir el siguiente.
- socket
- Un punto final para la comunicación en red. Se representa en el código como un descriptor de archivo (un entero) al que puedes escribir y del que puedes leer, igual que un archivo.
- bind
- Asignar una dirección IP y un puerto a un socket. La syscall bind() le dice al kernel: 'este socket recibirá conexiones que lleguen al puerto X'.
- listen
- Pasar el socket a modo pasivo, en el que está listo para aceptar conexiones entrantes. El parámetro backlog define cuántas conexiones en espera puede mantener el kernel en cola.
- accept
- Extraer la siguiente conexión de la cola de espera. Devuelve un nuevo descriptor de archivo dedicado exclusivamente a ese cliente. El socket original sigue escuchando a otros clientes.
- SO_REUSEADDR
- Una opción de socket que permite volver a asociar (bind) el puerto inmediatamente después de que el servidor se cierra, sin esperar a que termine el estado TIME_WAIT. Esencial en desarrollo para no recibir 'Address already in use' en cada reinicio.