Si può fare affidamento sulle dimensioni dei pacchetti in TCP / IP, almeno per la prima chiamata read () su una connessione?

1

Supponiamo di avere un'applicazione client che è nota per connettersi a un determinato IP e di inviare un messaggio di dimensioni fisse (di dimensione X = ~ dozzina di byte) al momento della connessione e attendere una risposta.

Se stai scrivendo un server, puoi garantire che la prima chiamata (non EAGAIN) a read () (supponendo che non ci siano errori) sul socket (non bloccante) dopo che accept () restituirà X?

La mia comprensione è che TCP / IP è un protocollo di streaming, quindi non è garantito, ma potrebbe essere vero nella pratica, dal momento che un pacchetto così piccolo non è probabile (possibile?) essere diviso durante la trasmissione.

    
posta Bwmat 25.08.2016 - 22:20
fonte

2 risposte

1

In pratica dipende in parte dall'applicazione client. Se il socket client ha disabilitato il buffering locale e ha scritto i byte sul socket un byte alla volta, è del tutto possibile che i 12 byte vengano trasferiti in più pacchetti a livello di filo.

E in parte sul modo in cui viene scritta l'applicazione server. Se la richiesta di lettura del socket del server sta bloccando e richiede 12 byte, attenderà 12 byte indipendentemente da come arrivano (o fino a quando si verifica un timeout o un errore). Tuttavia, i severs dovrebbero davvero utilizzare socket non bloccanti per motivi di prestazioni.

    
risposta data 25.08.2016 - 22:42
fonte
1

TCP è un protocollo orientato al flusso. È completamente legale per entrambi i sistemi operativi, un router o qualsiasi altro dispositivo coinvolto nella connessione per suddividere le scritture di qualsiasi dimensione in più pacchetti o ricombinarli. Un programma ben scritto deve gestire le letture brevi.

    
risposta data 26.08.2016 - 03:06
fonte

Leggi altre domande sui tag