#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)