Обработка потерь сегментов

Как бы хорошо ни была организована сеть, в ней время от времени случаются потери данных; по этой причине протокол TCP предусматривает способы управления этими потерями сегментов. Среди них — механизм для повторной передачи сегментов с неподтвержденными данными.

Сервис узла назначения, использующая протокол TCP, обычно подтверждает только данные, поступившие в непрерывной последовательности. В случае отсутствия одного или нескольких сегментов подтверждаются только данные в первой непрерывной последовательности байтов. Например, если были получены сегменты с порядковыми номерами от 1500 до 3000 и от 3400 до 3500, номером ACK будет 3001. Это связано с тем, что имеются сегменты с номерами SEQ от 3001 до 3399, которые не были получены.

Если TCP на узле источника не получит подтверждение по истечении установленного периода времени, он вернется к последнему полученному номеру ACK и повторно перешлёт данные из этой точки. Процесс повторной передачи не указывается в запросе комментариев (RFC), а оставляется до момента конкретной реализации протокола TCP.

При типичной реализации протокола TCP узел может переслать сегмент, поместить копию сегмента в очередь для повторной передачи и запустить таймер. После получения подтверждения данных сегмент удаляется из очереди. Если подтверждение не поступает до истечения времени таймера, сегмент пересылается повторно.

Нажмите кнопку «Воспроизведение» на рисунке, чтобы просмотреть анимированное представление повторной передачи потерянных сегментов.

В настоящее время узлы могут также использовать дополнительную функцию, которая называется выборочным подтверждением (SACK). Если оба узла поддерживают выборочные подтверждения, адресат может подтвердить байты в прерывающихся сегментах, в результате чего узел должен будет повторить передачу только недостающих данных.