Domanda

Sono in esecuzione una macchina Linux in esecuzione 2.6.9-55.ELsmp, x86_64.

Sto cercando di impostare la finestra TCP di ricezione utilizzando la funzione setsockopt () utilizzando C. provo il seguente:

rwnd = 1024;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&rwnd, sizeof(rwnd));

Il segmento di codice di cui sopra è in un programma client che riceve i dati da un server. Quando ho dare il via al programma per ricevere e osservare l'output di tcpdump, osservo finestra di trattativa in questo modo:

11:34:40.257755 IP clientReceiver.42464 > serverSender.8991: 
S 1742042788:1742042788(0) win 5840 
<mss 1460,sackOK,timestamp 1688222886 0,nop,wscale 2>

Si vede che il programma client è infatti negoziando una finestra diversa da quello che ho impostato nel programma client. Tuttavia, da come posso interpretare il testo di Steven ( "/ IP Illustrated TCP, Volume 1") Sezione 20.4, credo che si pratica quanto si riferisce al secondo citazione blocco nella Sezione 20.4 utilizzando il setsockopt () chiamo io uso (vedi sopra ).

Mi piacerebbe capire dove ho sbagliato.

Forse la mia interpretazione di ciò che Stevens sta dicendo non è corretto. In tal caso, potrebbe punto me il modo corretto di impostare la dimensione del buffer di ricezione? Come prova della mia confusione, mi riferisco la pagina man socket TCP Linux a http: //linux.die .net / uomo / 7 / tcp (vedi commento sulla SO_RCFBUF).

Quello che mi manca in questa storia? Come faccio a controllare la dimensione del buffer di ricezione (e lo hanno mostrano nell'output tcpdump)? Si prega di notare che io alludo a qui un'impostazione dell'opzione presa SO_RCFBUF - ho capito che è quello che si presenta nella negoziazione finestra nel SYN

.

Ogni ingresso è apprezzato.

È stato utile?

Soluzione

È necessario utilizzare anche TCP_WINDOW_CLAMP

rcvbuf = 2048;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)& rcvbuf, sizeof(rcvbuf));
clamp = 1024;
setsockopt(sock, SOL_SOCKET, TCP_WINDOW_CLAMP, (char *)& clamp, sizeof(clamp));

Si noti la rcvbuf è due volte il morsetto, potrebbe essere di più. È possibile lasciare che autotune, il morsetto finestra continuerà a funzionare. Questo non è portabile.

Altri suggerimenti

La dimensione del buffer di ricezione può essere ridotta solo prima di collegare la presa - è possibile aumentare in qualsiasi momento. Quale ordine stai chiamando sockopt () in relativa a connect ()?

Per TCP, il valore rwnd deve essere passato durante recv.

recv (calzino, BUF, rwnd, 0);

Questa riceverà 1024 byte.

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