Domanda

Ho letto vari siti e tutorial online, ma io sono ancora confuso. Se il messaggio è più grande di IP MTU, quindi send() restituisce il byte inviati. Cosa succede al resto del messaggio? Devo chiamare di nuovo send() e tenta di inviare resto del messaggio? O è che livello IP qualcosa dovrebbe prendersi cura di automaticamente?

È stato utile?

Soluzione

Se si utilizza il protocollo TCP poi l'interfaccia presentato a voi è quella di un flusso di byte. Non è necessario preoccuparsi di come il flusso di byte riceve da un capo all'altro della connessione all'altro. È possibile ignorare MTU del livello IP. In realtà si può ignorare il livello IP del tutto.

Quando si chiama send() lo stack TCP sulla vostra macchina si occuperà di tutti i dettagli necessari per il flusso di byte che si sta spingendo nella vostra inviare chiamate a comparire da recv() chiama all'altra estremità della connessione.

L'unica cosa da ricordare è che con il protocollo TCP avete a che fare con un flusso e questo significa che uno send() può generare dati che arrivano nelle chiamate recv() multiple e chiamate send() multiple possono causare i dati che arrivano in una singola chiamata recv(). Lei ha alcun controllo su questo. Avete a che fare con un flusso di byte e ogni chiamata recv() possibile restituire qualsiasi numero di byte dal 1 al numero attualmente in circolazione (consentendo per i buffer adeguate passati alla chiamata recv()).

Dal momento che i commentatori hanno chiesto per esso;)

Nella maggior parte TCP stack send() è più probabile che non riescono a mandare tutto a causa buffer dello stack TCP sono pieni e (probabilmente) la finestra TCP è anche pieno e controllo di flusso è in funzione il che significa che la pila non può inviare più i dati fino alla fine remoto ACK alcuni dati e non è disposto a tamponare più a vostro nome. Io non ho incontrato uno stack TCP che si rifiuterà un send() a causa di sole considerazioni MTU ma credo che alcuni sistemi embedded snellita potrebbero comportarsi in quel modo ...

In ogni caso, se send() ritorna inferiore al numero di byte che avete fornito allora si dovrebbe inviare nuovamente i dati rimanenti ad un certo punto. Spesso send() bloccherà e attendere che si può inviare tutti i dati, e se hai impostato il socket in modalità non bloccante, allora probabilmente non si desidera riprovare subito l'invio se non riesce a trasmettere tutto come è probabile che finisce in un loop stretto ...

Probabilmente sarebbe utile per voi di essere più specifiche sul sistema operativo che si sta utilizzando.

Altri suggerimenti

Se il pacchetto è troppo grande per il transito della rete una frammentazione suggerimento ICMP viene inviata la segnalazione al mittente di ridurre la dimensione del pacchetto e riprova.

Se si utilizza TCP questi sono tutti dettagli che si dovrebbe aspettare il livello di rete per prendersi cura di per voi. Che moderna IP pile di effettivamente fare dietro le quinte per capire la MTU più basso lungo il percorso sembra essere diventato un po 'di magia nera.

WRT UDP si può ancora aspettare lo stack di frammentare per voi, ma in pratica dato il caso d'uso per UDP la sua non è l'ideale .. a seconda dell'applicazione in uso si rischia di vedere meglio le prestazioni attraverso la comprensione in modo esplicito il percorso MTU.

... sulla questione send () alcune pile si comportano in modo diverso, ma il WRT trattamento il codice dovrebbe essere lo stesso. Diciamo che avere 100 byte per l'invio ... send () restituisce 10 byte inviati. È necessario tenere chiamando inviare con i restanti 90 byte fino a quando il suo tutto spinto fuori il filo di inviare l'intero messaggio.

Utilizzando il blocco prese sulla piattaforma Windows send () sarà ususally ritorno dopo che tutto viene inviato .. Su altre piattaforme Linux .. et al sarà necessario continuare a inviare più spesso a spingere i dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top