Я хочу изменить значение TCP RTO (время ожидания повторной передачи) для соединения, и некоторые прочитанные мною чтения показывают, что я могу это сделать, но не показывают, где и как это изменить.
Я посмотрел на /proc/sys/net/ipv4
переменные, но ни одна из переменных не связана с RTO. Буду признателен, если кто-нибудь подскажет, как изменить это значение.
linux
linux-kernel
tcp
obiigbe91
источник
источник
ip route replace
вместо этого добился успеха - кажется,ip route
синтаксис немного изменился. Я был в состоянии сделать модификацию успешно, хотя. Просто чтобы отметить, вы должны прокомментировать ответ, а не вопрос, если вы хотите пинговать меня - я в основном видел это случайно, просто удача, что это было недавно :)Ответы:
Причина, по которой вы не можете изменить RTO, заключается в том, что это не статическое значение. Вместо этого (за исключением первоначального SYN, естественно), он основан на RTT (Round Trip Time) для каждого соединения. На самом деле, он основан на сглаженной версии RTT и дисперсии RTT с некоторыми константами, добавленными в микс. Следовательно, это динамическое вычисляемое значение для каждого TCP-соединения, и я настоятельно рекомендую эту статью, в которой более подробно рассматриваются вычисления и RTO в целом.
Также актуальным является RFC 6298, в котором говорится (среди прочего):
Всегда ли ядро устанавливает RTO на 1 секунду? Что ж, в Linux вы можете показать текущие значения RTO для ваших открытых соединений, выполнив
ss -i
команду:Выше приведен вывод с виртуальной машины, в которую я вошел с помощью SSH и которая имеет пару открытых соединений с google.com. Как вы можете видеть, RTO на самом деле установлен на 200 мкс (миллисекунд). Вы заметите, что значение не округлено до 1 секунды из RFC, и вы также можете подумать, что оно немного выше. Это связано с тем, что для RTO для Linux существуют минимальные (200 миллисекунды) и максимальные (120 секунд) границы (это прекрасно объясняется в статье, на которую я ссылался выше).
Таким образом, вы не можете изменить значение RTO напрямую, но для сетей с потерями (например, беспроводных) вы можете попробовать настроить F-RTO (это может быть уже включено в зависимости от вашего дистрибутива). На самом деле есть два связанных параметра, связанных с F-RTO, которые вы можете настроить (хорошее резюме здесь ):
В зависимости от того, для чего вы пытаетесь оптимизировать, они могут или не могут быть полезны.
РЕДАКТИРОВАТЬ: следуя за возможностью настроить значения rto_min / max для TCP из комментариев.
Вы не можете изменить глобальный минимальный RTO для TCP (кроме того, вы можете сделать это для SCTP - они представлены в sysctl), но хорошая новость заключается в том, что вы можете настроить минимальное значение RTO для каждого маршрута основа. Вот моя таблица маршрутизации на моей CentOS VM:
Я могу изменить значение rto_min на маршруте по умолчанию следующим образом:
И теперь моя таблица маршрутизации выглядит так:
Наконец, давайте установим соединение и проверим,
ss -i
соблюдалось ли это:Успех! Значение rto для HTTP-соединения (после изменения) составляет 15 мс, тогда как SSH-соединение (до изменения) составляет 200+, как и раньше.
Мне действительно нравится этот подход - он позволяет вам установить более низкое значение на соответствующих маршрутах, а не глобально, где это может испортить другой трафик. Аналогично (см. Справочную страницу ip ) вы можете настроить начальную оценку rtt и начальную rttvar для маршрута (используется при расчете динамического RTO). Хотя это не полное решение с точки зрения настройки, я думаю, что большинство важных частей есть. Вы не можете настроить максимальную настройку, но я думаю, что в общем случае она не будет столь полезной.
источник
rto_max
? Как мы устанавливаем глобальное максимальное время ожидания?net.ipv4.tcp_retries1
и /net.ipv4.tcp_retries2
или аналогичных IIRC), я думаю, вы сможете получить эквивалент максимума RTO.