Измерение RTT для TCP в ядре Linux

#linux #tcp #linux-kernel

#linux #tcp #linux-ядро

Вопрос:

Я реализую оценку RTT, подобную TCP, в пользовательском протоколе. Когда я смотрю в функцию

 static void tcp_rtt_estimator(struct sock *sk, long mrtt){
long m = mrtt; /* RTT */
  

Для первой итерации, когда предыдущие оценки RTT не выполнялись, фрагмент кода

 srtt = m << 3;          /* take the measured time to be rtt */
  

Почему значение не m берется непосредственно для srtt ? Насколько я понимаю, параметр mrtt_us — это просто значение в jiffies для текущего измерения времени в оба конца.

Является ли приведенное выше предположение mrtt_us неверным? Если да, то какое значение я должен передать этой функции?

PS- У меня есть измеренный RTT в jiffies, который я сейчас передаю этой функции. Очевидно, что это неверно, поскольку первое srtt значение становится чем-то отличным от измеренного rtt из-за srtt = m << 3

Комментарии:

1. Разве это не часть алгоритма сглаживания, применяемого к значению RTT, переданному в подпрограмму? Вероятно, требуется прочитать статью, связанную в комментариях в исходном коде: ee.lbl.gov/papers/congavoid.pdf

2. Да, но алгоритм сглаживания диктует, что первое измерение RTT должно использоваться непосредственно как SRTT, а соответствующие формулы должны использоваться из вторых измерений RTT. Раздел 2.2 в tools.ietf.org/html/rfc6298

Ответ №1:

Я понял это из одной из почтовых цепочек на LKML по адресу https://lkml.org/lkml/1998/9/12/41

В нем упоминается, что сохраненный SRTT фактически в 8 раз превышает реальный SRTT. Я думаю, что это сделано таким образом, чтобы обеспечить более высокую точность вычислений.

Итак, чтобы ответить на вопрос, измеренное значение RTT должно быть передано этой функции в jiffies (версия ядра 3.13)