Impostazione finestra di ricezione TCP in C e lavorare con tcpdump in Linux
-
19-09-2019 - |
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.
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.