LINUX.ORG.RU

ретрансмиссия tcp сегментов в ядре


0

1

Как устроена ретрансмиссия tcp сегментов в ядре (tcp/ipv4)? Ткните, пожалуйста, в соответствующие функциии.
Т.е. сегмент отправляется, ждем ACK, не дожидаемся и отправляем еще раз. Интересует ожидание и повторная отправка.
Формируется ли при ретрансмиссии заново tcp заголовок? По идее вроде должен (например, наш ACK мог измениться за время ожидания). Какие функции при этом вызываются? те же, что и при первоначальном формировании заголовка?

Ну надо искать по словам smoothed round trip или что-то вроде. Вот нашел, что есть переменная srtt, смотрите, где используется.

frey ★★
()

Смотри функцию tcp_connect(). Из нее видно, что используется специальный таймер для повтора:

/** inet_connection_sock - INET connection oriented sock
 *
   .....
 * @icsk_timeout:          Timeout
 * @icsk_retransmit_timer: Resend (no ack)
   .....
 */
ttnl ★★★★★
()
13 марта 2011 г.
Ответ на: комментарий от nocomer

Прошу прощения за некропостинг, но ответ здесь не был озвучен, поэтому приведу его, чтобы облегчить задачу тем, кто будет гуглить на эту тему.

icsk_retransmit_timer для TCP/IPv4 имеет в качестве обработчика функцию tcp_write_timer, которая вызывает tcp_retransmit_timer (либо tcp_probe_timer). tcp_retransmit_timer в свою очередь вызывает tcp_retransmit_skb, который среди прочего вызывает tcp_retrans_try_collapse и tcp_transmit_skb.

Таким образом, при повторной отправке сегмента TCP заголовок фактически формируется заново тем же способом, что и при первой отпраке.

nocomer
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.