Escala de ventana de TCP en Linux

Publicado por el sábado 9 de junio de 2007 en Amigos, Cultura libre, GNU/Linux, Software libre, Solución, Útil | 3 comentarios


Esto lo pongo aquí a 13 de diciembre de 2012, pero lo publiqué en Turbo-R, antiguo blog de Álex.
Allá por la pasada navidad se me ocurrió instalarme openSUSE 10.2 porque tenía un problema con el sonido en Kubuntu 6.10 que no conseguía solucionar. Me salía un mensaje diciéndome algo así como que se saturaba el buffer: lo solucioné más tarde cambiando el dispositivo de salida.

Para mi sorpresa, con el cambio a OpenSUSE me encontré con otro curiosísimo desaguisado: Me funcionaban sólo unas pocas páginas web, como Google o Ya.com. Las demás se quedaban en el intento de cargar, aunque cualquier ping llegaba perfectamente. El entuerto persistíó en Fedora Core 6 y más recientemente en el Kubuntu Feisty de mi hermano Juanjo (y no en el mio, inexplicablemente). Busqué y busqué, pregunté por foros y en las news (comp.os.linux.misc), pero nadie me supo decir nada.

Ayer por fin publicaron la solución en las news. Escribo esto con la esperanza de que le sirva a alguien más. Que me corrija el gran gurú del TCP/IP, Konamiman, si me equivoco en algo.

Por lo visto todo se debe a que desde el kernel 2.6.17 se ha modificado el valor por defecto de la escala de ventana de TCP (TCP window scaling), que era 0.

En los albores de Internet el número máximo de bytes que se transmitian antes de mandar una señal de acuse de recibo (ACKnowledgement) era de 64 KB, pero tal cantidad se ha quedado pequeña con las líneas de banda ancha actuales, así que ya en 1992 se inventó lo del TCP window scaling, que es un parámetro en las transaccciones que permite multiplicar los bytes enviados por una cifra de 8 bits.

El problema está en que existe un error en la mayoría de los routers de los servidores en Internet por el que machacan el valor de escala de ventana con un 0 si es superior, con lo que cliente y servidor no llegan a entenderse y se ralentiza la transferencia, o simplemente no funciona, como me pasaba a mi.

He aquí el remedio en cuestión:

Solución permanente editando /etc/sysctl.conf:

Añadir esto para un tamaño de ventana óptimo:

net.ipv4.tcp_wmem = 4096 16384 131072
net.ipv4.tcp_rmem = 4096 87380 174760

Y reiniciar

O añadir esto para dejar la ventana en 64KB:

net.ipv4.tcp_window_scaling = 0

Solucion temporal:

Escribir lo siguiente en un terminal:

sudo -s
echo “4096 16384 131072” > /proc/sys/net/ipv4/tcp_wmem
echo “4096 87380 174760” > /proc/sys/net/ipv4/tcp_rmem

ó:

sudo -s
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling

¡Que aproveche!

3 comentarios

  1. probe esta configuracion pero la prueba la hago con un socket local y un servidor local configurados para que se conecten en la misma maquina y me da un ancho de ventana de 65536*2=131072 y cuando configuro con tus comandos me sigue dando el mismo ancho de ventana, y nose porque me da ese ancho de ventana y tampoco porque no realiza ningun cambio al modificar la escala de ventana de linux.

    Estoy trabajando con centOS a 64 bits con 8 de ram.

    Me gustaria saber si ahy una forma de medir el ancho de ventana de linux o incluso de windows pero localmente (socket local y servidor local configurados en java )

    Contestar
  2. Hola, espero llegar a tiempo. Realmente lo que aquí publico lo saqué de las news, yo tengo muy poca idea de cómo funciona el asunto. Fue más que nada para tenerlo a mano y por si era útil para alguien más.

    Es posible que esos comandos específicos solo sirvan para la distro de la que hablo: Kubuntu y muy antigua.

    Cuando has hecho la última pregunta me he dirigido a http://commandlinefu.com y me ha salido esto, aunque no sé si es lo que pides:

    ifstat -nt

    Contestar
    • El comando iftop está muy bien también, te muestra además el origen del tráfico y más datos.

      Contestar

Publica un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *