Hay cierta seguridad de que si envía 20 bytes al comienzo de una secuencia TCP, no llegará como dos piezas de 10 bytes. Esto se debe a que la pila TCP no enviará segmentos tan pequeños: hay un tamaño mínimo de MTU. Sin embargo, si el envío está en algún lugar en medio de una transmisión, todas las apuestas están desactivadas. Podría ser que su pila de protocolos tome 10 bytes de los datos para llenar un segmento y enviarlo, y luego los siguientes diez bytes van a otro segmento.
Su pila de protocolos divide los datos en fragmentos y los coloca en una cola. Los tamaños de los fragmentos se basan en la ruta MTU. Si realiza una operación de envío, y todavía hay datos en cola pendientes, la pila de protocolos normalmente mirará el segmento que está en la cola de la cola y verá si hay espacio en ese segmento para agregar más datos. La habitación puede ser tan pequeña como un byte, por lo que incluso un envío de dos bytes se puede dividir en dos.
Por otro lado, la segmentación de datos significa que puede haber lecturas parciales. Una operación de recepción puede potencialmente despertarse y obtener datos cuando llega tan solo un segmento. En la API de sockets ampliamente implementada, una llamada de recepción puede solicitar 20 bytes, pero podría regresar con 10. Por supuesto, se puede construir una capa de almacenamiento en búfer que se bloqueará hasta que se reciban 20 bytes o se rompa la conexión. En el mundo POSIX, esa API puede ser la secuencia de E / S estándar: puede usar fdopen
un descriptor de socket para obtener una FILE *
secuencia, y puede usarla fread
para llenar un búfer de modo que la solicitud completa se satisfaga con tantas read
llamadas como sea necesario .
Los datagramas UDP enmarcan los datos. Cada llamada de envío genera un datagrama (pero vea más abajo sobre el descorche). El otro lado recibe un datagrama completo (y, en la API del socket, debe especificar un búfer lo suficientemente grande como para contenerlo, de lo contrario, el datagrama se truncará). Los grandes datagramas se fragmentan por fragmentación de IP y se vuelven a ensamblar de forma transparente para las aplicaciones. Si falta algún fragmento, se pierde todo el datagrama; no hay forma de leer datos parciales en esa situación.
Existen extensiones a la interfaz que permiten múltiples operaciones para especificar un solo datagrama. En Linux, se puede "tapar" un socket (evitar que se envíe). Mientras se tapa, los datos escritos se ensamblan en una sola unidad. Luego, cuando el zócalo está "descorchado", se puede enviar un solo datagrama.