Quiero alterar el valor TCP RTO (tiempo de espera de retransmisión) para una conexión, y algunas lecturas que he hecho sugieren que podría hacer esto, pero no revela dónde y cómo cambiarlo.
He mirado las /proc/sys/net/ipv4
variables, pero ninguna de las variables está relacionada con RTO. Agradecería que alguien me dijera cómo alterar este valor.
linux
linux-kernel
tcp
obiigbe91
fuente
fuente
ip route replace
lugar, parece que laip route
sintaxis ha cambiado un poco. Sin embargo, pude hacer la modificación con éxito. Solo para tener en cuenta, deberías comentar la respuesta, no la pregunta si quieres enviarme un ping: básicamente vi esto por accidente, pura suerte de que fuera reciente :)Respuestas:
La razón por la que no puede modificar el RTO específicamente es porque no es un valor estático. En cambio (a excepción del SYN inicial, naturalmente) se basa en el RTT (Tiempo de ida y vuelta) para cada conexión. En realidad, se basa en una versión suavizada de RTT y la variación de RTT con algunas constantes agregadas a la mezcla. Por lo tanto, es un valor dinámico y calculado para cada conexión TCP, y recomiendo este artículo que detalla más el cálculo y el RTO en general.
También es relevante el RFC 6298 que establece (entre muchas otras cosas):
¿El núcleo siempre establece RTO en 1 segundo? Bueno, con Linux puede mostrar los valores actuales de RTO para sus conexiones abiertas ejecutando el
ss -i
comando:Lo anterior es el resultado de una VM en la que he iniciado sesión con SSH y tiene un par de conexiones abiertas a google.com. Como puede ver, el RTO está configurado en 200 ish (milisegundos). Notará que no se redondea al valor de 1 segundo del RFC, y también puede pensar que es un poco alto. Esto se debe a que hay límites mínimos (200 milisegundos) y máximos (120 segundos) en juego cuando se trata de RTO para Linux (hay una gran explicación de esto en el artículo que vinculé anteriormente).
Por lo tanto, no puede alterar el valor RTO directamente, pero para redes con pérdida (como la inalámbrica) puede intentar ajustar F-RTO (esto puede estar habilitado dependiendo de su distribución). En realidad, hay dos opciones relacionadas relacionadas con F-RTO que puede ajustar (buen resumen aquí ):
Dependiendo de lo que intente optimizar, estos pueden ser útiles o no.
EDITAR: seguimiento de la capacidad de ajustar los valores rto_min / max para TCP a partir de los comentarios.
No puede cambiar el RTO mínimo global para TCP (como un aparte, puede hacerlo para SCTP, que están expuestos en sysctl), pero la buena noticia es que puede ajustar el valor mínimo del RTO en una ruta base. Aquí está mi tabla de enrutamiento en mi VM CentOS:
Puedo cambiar el valor de rto_min en la ruta predeterminada de la siguiente manera:
Y ahora, mi tabla de enrutamiento se ve así:
Finalmente, iniciemos una conexión y verifiquemos
ss -i
si esto se ha respetado:¡Éxito! El rto en la conexión HTTP (después del cambio) es de 15 ms, mientras que la conexión SSH (antes del cambio) es más de 200 como antes.
En realidad, me gusta este enfoque: le permite establecer el valor más bajo en las rutas apropiadas en lugar de globalmente, donde podría arruinar otro tráfico. De manera similar (vea la página de manual de ip ) puede ajustar la estimación de rtt inicial y la rttvar inicial para la ruta (utilizada al calcular el RTO dinámico). Si bien no es una solución completa en términos de ajustes, creo que la mayoría de las piezas importantes están ahí. No puede ajustar la configuración máxima, pero creo que, en cualquier caso, no será tan útil en general.
fuente
rto_max
? ¿Cómo establecemos un tiempo de espera máximo global?net.ipv4.tcp_retries1
y /net.ipv4.tcp_retries2
o IIRC similares) permitido, creo que puede llegar a un equivalente de un máximo RTO.