C'è una certa certezza che se si inviano 20 byte all'inizio di un flusso TCP, non arriveranno come due pezzi da 10 byte. Questo perché lo stack TCP non invierà segmenti così piccoli: esiste una dimensione MTU minima. Tuttavia, se l'invio è ovunque nel mezzo di uno stream, tutte le scommesse sono disattivate. È possibile che lo stack del protocollo impieghi 10 byte di dati per riempire un segmento e inviarlo, quindi i successivi dieci byte vanno a un altro segmento.
Lo stack del protocollo suddivide i dati in blocchi e li inserisce in una coda. Le dimensioni del blocco si basano sul percorso MTU. Se si esegue un'operazione di invio e sono ancora presenti dati in coda in sospeso, lo stack del protocollo in genere sbircia il segmento che si trova in coda alla coda e vedrà se c'è spazio in quel segmento per aggiungere altri dati. La stanza potrebbe essere piccola come un byte, quindi anche un invio a due byte potrebbe essere suddiviso in due.
Dall'altro lato, la segmentazione dei dati significa che possono esserci letture parziali. Un'operazione di ricezione può potenzialmente riattivare e ottenere dati quando arriva solo un segmento. Nell'API socket ampiamente implementata, una chiamata in ricezione può richiedere 20 byte, ma potrebbe restituire con 10. Naturalmente, è possibile creare un livello di buffer su di esso che si bloccherà fino a quando non vengono ricevuti 20 byte o la connessione si interrompe. Nel mondo POSIX, quell'API può essere lo stream I / O standard: è possibile fdopen
un descrittore di socket per ottenere uno FILE *
stream e si può usare fread
su di esso per riempire un buffer in modo tale che la richiesta completa sia soddisfatta da tutte le read
chiamate necessarie .
I datagrammi UDP inquadrano i dati. Ogni chiamata di invio genera un datagramma (ma vedi sotto sulla tappatura). L'altro lato riceve un datagramma completo (e, nell'API socket, deve specificare un buffer abbastanza grande da mantenerlo, altrimenti il datagramma verrà troncato). Datagrammi di grandi dimensioni vengono frammentati dalla frammentazione IP e vengono riassemblati in modo trasparente per le applicazioni. Se manca qualche frammento, l'intero datagramma viene perso; non c'è modo di leggere dati parziali in quella situazione.
Esistono estensioni all'interfaccia che consentono a più operazioni di specificare un singolo datagramma. In Linux, un socket può essere "tappato" (impedito l'invio). Mentre viene tappato, i dati scritti vengono assemblati in una singola unità. Quindi quando il socket viene "stappato", è possibile inviare un singolo datagramma.