Home

Page 43
Page 43
background image

с  флагом 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) 


Copyright © 2021 Файлообменник files.d-lan.dp.ua

Использование любых материалов сайта возможно только с разрешения автора.