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