Los segmentos TCP con un tamaño de carga de 0 son omnipresentes, se producen en casi todas las corrientes TCP del mundo real. Se envían siempre que una de las partes desea acusar recibo de datos de la otra, pero no tiene datos para enviar por su cuenta. (Estos son comúnmente conocidos como "paquetes ACK", pero un "paquete ACK" es solo un segmento regular que no contiene datos).
Dado que tales paquetes no contienen ningún dato para entregar a la aplicación del usuario, no harán que recv()
regrese - recv()
continuará bloqueando hasta que lleguen algunos datos reales. Si recv()
devuelve 0, entonces es una indicación definitiva de que el otro extremo ha cerrado su lado de la conexión y no enviará más datos.
Recuerde que TCP es orientado a flujo: hay no un mapeo 1-a-1 entre los datos devueltos por un solo recv()
llamada y los datos en un segmento TCP solo. Una sola llamada a recv()
podría devolver un bloque de datos que se superpone a varios segmentos TCP, y los datos en un único segmento TCP podrían devolverse en múltiples llamadas recv()
. Los límites entre los segmentos TCP no son visibles para la aplicación que utiliza la API de sockets BSD. Si desea dichos límites, debe implementarse usando un protocolo de capa de aplicación dentro de la secuencia TCP, o usar un protocolo orientado a datagramas como UDP.
+1 por mencionar ACK. –
Los paquetes ACK tendrán un indicador de ACK establecido. – AlastairG
@AlastairG: Correcto, pero cada paquete que no sea el 'SYN' inicial o un restablecimiento de conexión tiene el bit' ACK' establecido. – caf