Что делать, если сегмент квитирования TCP потерян?

В трехстороннем рукопожатии TCP будет отправлено 3 сегмента (SYN, SYN ACK, ACK). Что делать, если третий сегмент (ACK) потерян? Отправляется ли отправитель повторно отправить сегмент или отказаться от установления соединения? И как два узла знают, что сегмент потерян?

Ответы

Ответ 1

TCP имеет порядковый номер во всех пакетах. Следовательно, легко узнать, был ли потерян пакет или нет. Если хост не получает ACK в пакете, он просто передает его.

В большинстве случаев, даже если этот ACK был потерян, повторная отправка не будет по очень простой причине. Непосредственно после ACK хост, который открыл TCP-протокол, скорее всего, начнет отправлять данные. Эти данные будут, как и все TCP-пакеты, иметь номер ACK, поэтому получатель получит ACK таким образом. Следовательно, отправитель SYN-ACK не должен заботиться о том, чтобы он не получил ACK, потому что он получает "неявный" ACK в следующем пакете.

Повторная отправка SYN-ACK необходима только в том случае, если данные вообще не получены.

Обновление: я нашел место в RFC, которое конкретно указано:

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

Другими словами, если ACK отбрасывается, но следующий пакет не отбрасывается, то все в порядке. В противном случае соединение должно быть reset. Это имеет смысл.

Ответ 2

Я не эксперт в этой конкретной ситуации, но я подозреваю, что произойдет, так это то, что клиент будет думать, что он подключен, но сервер не будет. Если клиент пытается отправить данные на сервер, сервер отклонит его и отправит RST-пакет клиенту, чтобы он мог reset его "соединение".