TCP разбивает информацию, которую он отправляет, на сегменты ... по существу, сегменты - это порции данных, не превышающие текущее значение TCP MSS (максимальный размер сегмента), полученное от другого конца. Эти порции имеют увеличивающиеся порядковые номера (основанные на общем количестве байтов данных, отправленных в сеансе TCP), которые позволяют TCP знать, когда что-то потеряно в полете; первый порядковый номер TCP выбирается случайным образом, и в целях безопасности он не должен быть псевдослучайным числом. В большинстве случаев MTU вашей локальной сети меньше, чем MSS, поэтому они могут отправить вам несколько сегментов, прежде чем вы сможете ACK.
Полезно думать об этих вещах во временной последовательности, которую они стандартизировали ...
Первым пришло Положительное подтверждение , которое представляет собой механизм сообщения отправителю, что вы получили данные, и порядковый номер, с которым вы подтверждаете ACK, является максимальной байтовой последовательностью, полученной на фрагмент TCP (или сегмент), который он отправил .
Я покажу ниже, но в моих примерах вы увидите маленькие номера сегментов TCP, такие как 1,2,3,4,5 ... в действительности эти числа последовательности байтов будут большими, увеличивающимися, и между ними будут пропуски (но это нормально ... TCP обычно отправляет данные кусками длиной не менее 500 байт).
Итак, давайте предположим, что отправитель xmits номер сегмента 1,2,3,4,5 перед отправкой вашего первого ACK. Если все идет хорошо, вы отправляете ACK на 1,2,3,4,5, и жизнь идет хорошо. Если 2 потеряно, все удерживается до тех пор, пока отправитель не поймет, что 2 никогда не был подтвержден; он знает, потому что вы отправляете дубликаты ACK для 1. После надлежащего тайм-аута отправитель снова отправляет 2,3,4,5.
Затем Выборочное подтверждение было предложено как способ сделать это более эффективным. В том же примере вы подтверждаете ACK 1 и сегменты SACK с 3 по 5 вместе с ним (если вы используете сниффер, вы увидите что-то вроде «ACK: 1, SACK: 3-5» для пакетов ACK от вас). Таким образом, отправитель знает, что ему нужно только повторно передать сегмент TCP 2 ... так что жизнь лучше. Также обратите внимание, что SACK определил ребер смежных данных, которые вы получили; однако несколько несмежных сегментов данных могут быть одновременно SACK'd.
Отрицательное подтверждение - это механизм информирования отправителя только о пропущенных данных. Если вы не скажете им, что чего-то не хватает, они продолжат отправлять данные, пока вы не закричите, дядя.
HTH, \ м