Pregunta

Me postulo un Linux ejecutando 2.6.9-55.ELsmp, x86_64.

Estoy tratando de establecer la ventana de recepción TCP mediante el uso de la función setsockopt () usando C. Trato lo siguiente:

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

El segmento de código anterior es en un programa cliente que recibe datos desde un servidor. Cuando me quito el programa para recibir y observar la salida de tcpdump, observo negociación ventana de este 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>

Vemos que el programa cliente es de hecho la negociación de una ventana diferente de lo que he puesto en el programa cliente. Sin embargo, desde la forma en que puede interpretar el texto de Steven ( "TCP / IP Illustrated, Volumen 1") Sección 20.4, creo que usted efectúa lo que se refiere a la segunda cita de bloque en la Sección 20.4 usando el setsockopt () llamo yo uso (ver más arriba ).

Me gustaría saber dónde he ido mal.

Tal vez mi interpretación de lo que está diciendo Stevens es incorrecta. En ese caso, ¿me podría apuntar a la forma correcta de ajustar el tamaño de búfer de recepción? Como prueba de mi confusión, me refiero la página de manual de Linux sockets TCP en http: //linux.die .net / hombre / 7 / tcp (ver comentario en SO_RCFBUF).

Lo que me falta en esta historia? ¿Cómo puedo controlar el tamaño de búfer de recepción (y que se muestre en la salida de tcpdump)? Tenga en cuenta que aludo aquí a un ajuste de la opción de socket SO_RCFBUF - entiendo que es lo que se muestra en la negociación ventana en el SYN

.

Cualquier entrada es apreciado.

¿Fue útil?

Solución

Es necesario utilizar también 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));

Tenga en cuenta la rcvbuf es el doble de la pinza, que podría ser más. Puede dejar que el autoajuste, la abrazadera ventana seguirá funcionando. Esto no es portátil.

Otros consejos

El tamaño de búfer de recepción sólo puede reducirse antes de conectar el enchufe - se puede aumentar en cualquier momento. ¿En qué orden se le llama sockopt () en relación con connect ()?

En TCP, el valor RWND se va a pasar durante recv.

recv (calcetín, buf, RWND, 0);

Este recibirá 1.024 bytes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top