2010-07-07 13 views
5

Nella programmazione socket TCP, se recv() restituisce 0, viene preso come un'indicazione che l'altro lato ha chiuso la connessione. Comunque, AFAIK, TCP RFC non impone il carico utile di TCP per essere> 0. Quindi, teoricamente, uno stack TCP può ricevere un messaggio con payload 0.Quale valore restituirà recv() se riceve un pacchetto TCP valido con un carico utile 0

Quindi, essenzialmente la mia domanda è cosa restituirà recv() riceve un pacchetto di payload di dimensioni 0? Se restituisce 0, allora come lo distinguiamo da un'indicazione di connessione chiusa.

risposta

11

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.

+0

+1 per menzionare gli ACK. –

+0

I pacchetti ACK avranno un flag ACK impostato. – AlastairG

+1

@AlastairG: Giusto, ma ogni pacchetto diverso dal 'SYN' iniziale o un reset della connessione ha il bit' ACK' impostato. – caf

3

A destra, secondo POSIX se recv restituisce 0, quindi il collegamento viene arrestato correttamente dal peer.

Se qualcuno è riuscito a inviare un pacchetto TCP con un carico utile di dimensione zero, allora il sistema operativo non deve restituire i dati al processo essendo bloccato recv chiamata di sistema su tale presa.

Ricordare che i payload TCP formano un flusso continuo che può essere suddiviso a caso dal sistema operativo, non una sequenza di datagrammi che deve essere restituita durante una singola chiamata di sistema.

Problemi correlati