Как работает взаимодействие пакетов с выборочным подтверждением TCP?

может ли кто-нибудь объяснить, как работает взаимодействие пакетов с выборочным подтверждением TCP? Я нашел определение в Википедии, но я не могу получить четкую картину того, что действительно делает выборочное признание по сравнению с положительным и отрицательным признанием.

1 ответов


TCP разбивает информацию, которую он отправляет на сегменты... по сути, сегменты-это куски данных, не превышающие текущее значение TCP MSS (максимальный размер сегмента), полученное с другого конца. Эти блоки имеют увеличивающиеся порядковые номера (на основе общего количества байтов данных, отправленных в сеансе TCP), которые позволяют TCP знать, когда что-то потерялось в полете; первый порядковый номер TCP выбирается случайным образом, и для целей безопасности это не должно быть псевдослучайным числом. Большинство время, MTU вашего локального ethernet меньше, чем MSS, поэтому они могут отправить вам несколько сегментов, прежде чем вы сможете ACK.

полезно думать об этих вещах во временной последовательности, которую они стандартизировали...

первым Признание, который является механизмом сообщения отправителю, что вы получили данные, а порядковый номер, с которым вы ACK,-это максимальная последовательность байтов, полученная на TCP-фрагмент (a.к. сегмент) он послал.

Я продемонстрируйте ниже, но в моих примерах вы увидите небольшие номера сегментов TCP, такие как 1,2,3,4,5... на самом деле эти порядковые номера байтов будут большими, увеличивающимися и иметь промежутки между ними (но это нормально... TCP обычно отправляет данные кусками длиной не менее 500 байт).

Итак, предположим, что номер сегмента отправителя xmits 1,2,3,4,5 перед отправкой первого ACK. Если все идет хорошо, вы посылаете ACK для 1,2,3,4,5, и жизнь хороша. Если 2 потеряется, все будет отложено до отправитель понимает, что 2 никогда не был ACK'D; он знает, потому что вы отправляете дубликаты ACKs для 1. При правильном тайм-аут, отправитель снова xmits 2,3,4,5.

затем Выборочное Признание был предложен как способ сделать это более эффективным. В том же примере вы ACK 1 и SACK сегменты с 3 по 5 вместе с ним (если вы используете сниффер, вы увидите что-то вроде "ACK:1, SACK:3-5" для пакетов ACK от вас). Таким образом, отправитель знает, что он должен только ретранслировать TCP сегмент 2... так что жизнь лучше. Кроме того, обратите внимание, что мешок определил края из непрерывных данных, которые вы получили; однако, несколько несмежных сегментов данных могут быть SACK'D одновременно.

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

HTH, \m