La raison pour laquelle vous ne pouvez pas modifier spécifiquement le RTO est qu'il ne s'agit pas d'une valeur statique. Au lieu de cela (sauf pour le SYN initial, naturellement), il est basé sur le RTT (Round Trip Time) pour chaque connexion. En fait, il est basé sur une version lissée de RTT et la variance RTT avec quelques constantes jetées dans le mix. Par conséquent, c'est une valeur calculée et dynamique pour chaque connexion TCP, et je recommande fortement cet article qui va plus en détail sur le calcul et le RTO en général.
La RFC 6298 est également pertinente et indique (entre autres):
Chaque fois que le RTO est calculé, s'il est inférieur à 1 seconde, alors le RTO DEVRAIT être arrondi à 1 seconde.
Le noyau définit-il toujours RTO à 1 seconde alors? Eh bien, avec Linux, vous pouvez afficher les valeurs RTO actuelles pour vos connexions ouvertes en exécutant la ss -i
commande:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 10.0.2.15:52861 216.58.219.46:http
cubic rto:204 rtt:4/2 cwnd:10 send 29.2Mbps rcv_space:14600
ESTAB 0 0 10.0.2.15:ssh 10.0.2.2:52586
cubic rto:201 rtt:1.5/0.75 ato:40 cwnd:10 send 77.9Mbps rcv_space:14600
ESTAB 0 0 10.0.2.15:52864 216.58.219.46:http
cubic rto:204 rtt:4.5/4.5 cwnd:10 send 26.0Mbps rcv_space:14600
Ce qui précède est la sortie d'une machine virtuelle à laquelle je suis connecté avec SSH et a quelques connexions ouvertes sur google.com. Comme vous pouvez le voir, le RTO est en fait réglé sur 200 ish (millisecondes). Vous remarquerez que ce n'est pas arrondi à la valeur de 1 seconde du RFC, et vous pouvez également penser que c'est un peu élevé. C'est parce qu'il y a des limites min (200 millisecondes) et max (120 secondes) en jeu quand il s'agit de RTO pour Linux (il y a une grande explication à cela dans l'article que j'ai lié ci-dessus).
Donc, vous ne pouvez pas modifier directement la valeur RTO, mais pour les réseaux avec perte (comme le sans fil), vous pouvez essayer de modifier le F-RTO (cela peut déjà être activé en fonction de votre distribution). Il existe en fait deux options liées au F-RTO que vous pouvez modifier (bon résumé ici ):
net.ipv4.tcp_frto
net.ipv4.tcp_frto_response
Selon ce que vous essayez d'optimiser, cela peut être utile ou non.
EDIT: suivi de la possibilité de modifier les valeurs rto_min / max pour TCP à partir des commentaires.
Vous ne pouvez pas changer le RTO minimum global pour TCP (en passant, vous pouvez le faire pour SCTP - ceux-ci sont exposés dans sysctl), mais la bonne nouvelle est que vous pouvez modifier la valeur minimale du RTO sur une route par route base. Voici ma table de routage sur ma machine virtuelle CentOS:
ip route
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
169.254.0.0/16 dev eth0 scope link metric 1002
default via 10.0.2.2 dev eth0
Je peux modifier la valeur rto_min sur l'itinéraire par défaut comme suit:
ip route change default via 10.0.2.2 dev eth0 rto_min 5ms
Et maintenant, ma table de routage ressemble à ceci:
ip route
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
169.254.0.0/16 dev eth0 scope link metric 1002
default via 10.0.2.2 dev eth0 rto_min lock 5ms
Enfin, commençons une connexion et vérifions ss -i
pour voir si cela a été respecté:
ss -i
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 10.0.2.15:ssh 10.0.2.2:50714
cubic rto:201 rtt:1.5/0.75 ato:40 cwnd:10 send 77.9Mbps rcv_space:14600
ESTAB 0 0 10.0.2.15:39042 216.58.216.14:http
cubic rto:15 rtt:5/2.5 cwnd:10 send 23.4Mbps rcv_space:14600
Succès! La rto sur la connexion HTTP (après le changement) est de 15 ms, tandis que la connexion SSH (avant le changement) est de 200+ comme avant.
En fait, j'aime cette approche - elle vous permet de définir la valeur inférieure sur les itinéraires appropriés plutôt que globalement là où cela pourrait gâcher le trafic. De même (voir la page de manuel ip ), vous pouvez modifier l’estimation rtt initiale et la rttvar initiale pour l’itinéraire (utilisé lors du calcul du RTO dynamique). Bien que ce ne soit pas une solution complète en termes de peaufinage, je pense que la plupart des éléments importants sont là. Vous ne pouvez pas modifier le paramètre maximum, mais je pense que cela ne sera généralement pas aussi utile dans tous les cas.