
с флагом SYN быстро, то такой большой задержки бы не было. Подведем итог: имеет место
следующая дилемма. Если отправлять повторный сегмент на установку соединения через малый
интервал времени после отправки первого сегмента (в случае не получения ответа, разумеется), это
приведет к быстрой установке соединения в случае случайной потери первого сегмента с флагом
SYN, но в этом случае соединение возможно вообще не удастся установить в сети, со
значительными задержками. Если же использовать длинный таймаут перед отправкой повторного
сегмента с флагом SYN, то, напротив, удастся установить соединения в сети с большими
задержками, но тогда в сети с малыми задержками, но большой вероятностью потери сегментов,
задержки перед установкой соединения будут большими. Итак вопрос: как выбрать оптимальную
задержку? Решение достаточно очевидно: начать с малой паузы перед отправкой повторного
сегмента, а затем УВЕЛИЧИВАТЬ время ожидания ответа перед отправкой каждого нового
сегмента с флагом SYN. Каждая операционная система используют свою стратегию установки
соединения, которая включает в себя количество отправляемых сегментов в флагом SYN, задержку
перед отправкой первого повторного сегмента и метод наращивания задержки перед отправкой
следующих сегментов, мы рассмотрим такие стратегии для Windows и Linux в свое время.
Рассматриваем второй случай – в ответ на сегмент с флагом SYN получено сообщение о
недостижимости узла или сети с помощью протокола ICMP (отметим, что сообщение от
недостижимости порта не используется с TCP – у данного протокола есть свой инструмент для
подобных ситуаций, такое ICMP сообщение используется только в случае с протоколом UDP, у
которого нет своих средств для уведомления клиента об отсутствии службы, связанной в
некоторым портом). С одной стороны может показаться, что получение такого ICMP сообщений
должно означать невозможность установления соединения из-за проблем с маршрутизацией, с
другой стороны такие сообщения нередко говорят о краткосрочных проблемах, поэтому TCP
рекомендует продолжать попытки установить соединение.
Третий случай: когда на сервере НЕТ связанного с портом-получателем процесса, сервер
должен сформировать в ответ на сегмент с флагом SYN сегмент с флагом RST, демонстрируя тем
самым невозможность установки соединения. В таком случае клиенту нет смысла повторять
попытки установить соединение в ближайшее время, хотя нередко реализации стека TCP/IP
пытаются еще несколько раз повторить пакет с флагом SYN и в таком случае. При этом таймаут
перед повторными посылками сегмента с SYN уже не стоит увеличивать, так как здесь имеет место
явный ответ от сервера, а не необходимость дождаться ответа, который ВОЗМОЖНО поступит.
И, наконец, рассматриваем последний случай: на узел поступил сегмент с флагом SYN и на
узле существует процесс, прослушивающий порт с таком номером. В этом случае сервер должен:
• Сообщить клиенту о готовности установить соединение (в сегменте-ответе будет установлен
флаг SYN)
• Сообщить клиенту свой ISN, передав его в поле Sequence Number в сегменте ответе
• Подтвердить получение от клиента его ISN, как нам известно, клиент будет передавать байты с
номером, на единицу большим, нежели его ISN, так же мы знаем, что номер ожидаемого байта
передается с помощью поля Acknowledged Number, следовательно, сервер должен в поле
Acknowledged Number сегмента-ответа передать клиенту увеличенный на единицу ЕГО
(клиента) ISN, подтвердив тем самым, что сервер ожидает от клиента байта номер ISN (клиента)
+ единица. Так как поле Acknowledged Number анализируется только в том случае, если в
сегменте установлен флаг ACK, сервер должен установить в сегменте-ответе этот флаг.
Итого: в случае готовности установить соединение сервер, получив сегмент a флагом SYN
от клиента, генерирует сегмент-ответ, в котором устанавливает флаги SYN, ACK, в поле Sequence
Number сервер передает клиенту свой ISN, в поле Acknowledged Number сервер передает
увеличенный на единицу ISN клиента.
Такой сегмент снова может потеряться в сети или быть доставлен клиенту. Если такой
сегмент потеряется, сервер должен через некоторый таймаут повторить свой сегмент, хотя не
исключено, что первым повторит свой сегмент с флагом SYN клиент по причине не получения
ответа на него. Для случая, когда сегмент с флагами SYN, ACK доставлен клиенту, можно сказать
следующее:
• Клиент сообщил серверу о своем желании установить соединение (флагом SYN)
• Клиент сообщил серверу свой ISN (полем Sequence Number)
• Сервер сообщил клиенту о готовности установить соединение (флагом SYN)
• Сервер подтвердил клиенту, что правильно понял его ISN (полем Acknowledged Number)