2010-02-08 8 views
10

Sto eseguendo una macchina Linux con 2.6.9-55.ELsmp, x86_64.Impostazione della finestra di ricezione TCP in C e utilizzo di tcpdump in Linux

Sto cercando di impostare la finestra di ricezione TCP utilizzando la funzione setsockopt() con C. I provare quanto segue:

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> 

vediamo che il programma client è infatti negoziando una finestra diversa da quello che ho impostato nel programma client. Tuttavia, dal modo in cui posso interpretare il testo di Steven ("TCP/IP Illustrated, Volume 1") Sezione 20.4, credo che tu effettui ciò a cui fa riferimento nella citazione del secondo blocco nella Sezione 20.4 usando la chiamata setsockopt() che uso (vedi sopra).

Mi piacerebbe capire dove ho sbagliato.

Forse la mia interpretazione di ciò che sta dicendo Stevens è errata. In tal caso, potresti indicarmi il modo corretto di impostare la dimensione del buffer di ricezione? Come prova della mia confusione, mi riferisco alla pagina man di socket TCP di Linux al http://linux.die.net/man/7/tcp (vedi commento su SO_RCFBUF).

Cosa mi manca in questa storia? Come posso controllare la dimensione del buffer di ricezione (e mostrarla nell'output di tcpdump)? Si noti che alludo qui un'impostazione dell'opzione socket SO_RCFBUF - Capisco che è ciò che appare nella negoziazione della finestra in SYN.

Qualsiasi input è apprezzato.

risposta

8

Si deve usare 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)); 

Annotare il rcvbuf è due volte il morsetto, potrebbe essere di più. Puoi lasciarla automaticamente, il morsetto della finestra funzionerà ancora. Questo non è portatile.

+1

Nota anche che il morsetto minimo è limitato a metà del RCVBUF minimo (di solito 4096, quindi il morsetto minimo è solitamente 2048). – caf

+0

Ho controllato questo, e i numeri sono in realtà 256 e (quindi) 128 per il valore minimo impostabile della RAMPA risp. Controlla il codice da tcp.c :: setsockopt() sotto il caso TCP_WINDOW_CLAMP, e controlla sock.h :: # define SOCK_MIN_RCVBUF 256.Grazie a tutti. Saluti! – Sonny

4

La dimensione del buffer di ricezione può essere ridotta solo prima di connettere il socket: è possibile aumentarlo in qualsiasi momento. Quale ordine stai chiamando sockopt() in relazione a connect()?

+0

Grazie per la risposta rapida. Io chiamo setsockopt() prima di connettermi(). – Sonny

-6

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

recv (calza, buf, rwnd, 0);

Questo deve ricevere 1024 byte.

+0

Ciao, grazie per la tua risposta. Da quello che so, questa chiamata recv() è per l'applicazione - cioè, questa è la velocità con cui l'applicazione consuma il flusso di byte pensato per questo. In altre parole, non credo che questa sia la finestra di ricezione che è negoziata da TCP all'inizio con il peer. – Sonny

+0

Questa è una dimensione del buffer dell'applicazione, non la finestra di ricezione. La finestra di ricezione è determinata dalla dimensione del buffer di ricezione socket meno la quantità di dati in sospeso è – EJP

Problemi correlati