Почему трехстороннее рукопожатие TCP увеличивает порядковый номер при подтверждении?

Почему трехстороннее рукопожатие TCP увеличивает порядковый номер при подтверждении во время начального рукопожатие? Чем это лучше, чем просто оставить номер подтверждения равным порядковому номеру?

Связь устанавливается с

Client sends SYN,A
Server responds with SYN-ACK,A+1,B
Client confirms with ACK,B+1

Чем это лучше, чем

Client sends SYN,A
Server responds with SYN-ACK,A,B
Client confirms with ACK,B

person Witness Protection ID 44583292    schedule 24.07.2011    source источник


Ответы (1)


Это потому, что поле ACK означает это, когда установлен флаг ACK:

Номер подтверждения (32 бита) – если флаг ACK установлен, то значением этого поля является следующий порядковый номер, который ожидает получатель.

Если он не установлен в (начальный порядковый номер + 1), это будет непоследовательно означать как подтверждение SYN (оба флага SYN, так и ACK должны быть установлены в этом пакете), и сообщение о том, что он снова ожидает этот порядковый номер (т.е. не получил).

person Mat    schedule 24.07.2011
comment
Извините, я, должно быть, туплю. Я не вижу несоответствия, поэтому мои правки. - person Witness Protection ID 44583292; 24.07.2011
comment
ACK == n означает, что я получил все сообщения до порядкового номера n-1, поэтому пришлите мне то, что у вас есть для порядкового номера n. Таким образом, в вашем примере будет запрашиваться повторная отправка SYN от клиента, что не имеет никакого смысла. Использование другой семантики порядковых номеров для начального рукопожатия сделало бы весь протокол более сложным для реализации, чем это уже есть, без уважительной причины. - person Mat; 24.07.2011
comment
Я думаю, вы имеете в виду, что увеличение порядкового номера на самом деле не обязательно для начального рукопожатия соединения, но увеличение необходимо для последующих подтверждений TCP, поэтому оно просто используется все время. Я приму это как ответ. - person Witness Protection ID 44583292; 27.07.2011