Artículos hechos en Junio, 2007


Escala de ventana de TCP en Linux


Publicado por el Sábado 9 09Europe/Madrid Junio 09Europe/Madrid 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!

Ir a su página