I segmenti TCP con una dimensione di payload pari a 0 sono onnipresenti - si verificano praticamente in ogni stream TCP del mondo reale. Vengono inviati ogni volta che una parte desidera riconoscere la ricezione di dati dall'altra, ma non ha dati da inviare. (Questi sono comunemente noti come "pacchetti ACK", ma un "pacchetto ACK" è solo un segmento normale che non contiene dati).
Poiché tali pacchetti non contengono dati da consegnare all'applicazione utente, non causeranno il ritorno di recv()
- recv()
continuerà a bloccarsi fino all'arrivo di alcuni dati effettivi. Se recv()
restituisce 0, allora è un'indicazione precisa che l'altra estremità ha chiuso il suo lato della connessione e non invierà altri dati.
Ricorda che TCP è orientato al flusso: non c'è una mappatura 1-a-1 tra i dati restituiti da un unico recv()
chiamata e dei dati in un singolo segmento TCP. Una singola chiamata recv()
potrebbe restituire un blocco di dati che si sovrappone a diversi segmenti TCP e i dati in un singolo segmento TCP potrebbero essere restituiti in più chiamate recv()
. I confini tra i segmenti TCP non sono visibili all'applicazione utilizzando l'API socket BSD. Se si desiderano tali limiti, è necessario implementare se stessi utilizzando un protocollo a livello di applicazione all'interno del flusso TCP o utilizzare un protocollo orientato ai datagrammi come UDP.
+1 per menzionare gli ACK. –
I pacchetti ACK avranno un flag ACK impostato. – AlastairG
@AlastairG: Giusto, ma ogni pacchetto diverso dal 'SYN' iniziale o un reset della connessione ha il bit' ACK' impostato. – caf