Home

Page 76
Page 76
background image

Отметим,  что  в  сегменте 11 сервер  подтверждает  получение  от  клиента  флага FIN, 

увеличивая  на  единицу  переданное  клиентом  в  поле Sequence Number значение    и  заполняя 
результатом (5842) поле Acknowledged Number. Анализатор протоколов комментирует, что сегмент 
номер 11 является  квитанцией  на  сегмент  номер 10. После  этого  сегмента  передача  данных  от 
клиента  к  серверу  невозможна,  однако  в  обратном  направлении,  от  сервера  к  клиенту  передавать 
данные можно. Однако утилита sock не была настроена нами при запуске сервера соответствующим 
образом,  поэтому  сервер sock закрывает  и  свою  половину  соединения,  как  только  получает 
предложение о закрытии от клиента. Поэтому сервер, сразу после сегмента 11 отправляет сегмент 
12,  в  котором  сам  устанавливает  флаги FIN, ACK, предлагая  клиенту  закрыть  полусоединение,  в 
котором  сервер  мог  бы  передавать  данные,  хотя  в  этом  примере  и  не  передавал.  Рассмотрим 
сегмент 12, в  котором  клиент  «квитирует»  серверу  его  предложение  о  закрытии  соединения, 
заполняя  поле Acknowledged Number значением 2. После  сегмента 12 TCP соединение  является 
закрытым, по крайне мере в том приближении,  которое нам сейчас необходимо рассмотреть. 

Наконец,  рассмотрим  ситуацию,  в  которой  соединение  находится  в  полузакрытом 

состоянии,  при  этом  сторона,  закрывшая  свое  полусоединение,  продолжает  прием  данных  и  их 
квитирование.  Почему  смоделировать  такую  ситуацию  на  реальных  приложениях  достаточно 
сложно:  обычно  сервера,  получив  от  клиента  сегмент  с  флагами FIN, ACK (т.е.  предложение 
закрыть  полусоединение  от  клиента  к  серверу),  закрывают  и  свое  полусоединение,  т.е. TCP 
соединения  в  полузакрытом  состоянии  используются  относительно  редко.  Снова  воспользуемся 
утилитой sock. Запустим клиента командой: 
 

C:\>sock -h 192.168.0.89 999 <c:\text_c.txt 

 

Это заставит клиента использовать для ввода данных в соединение не клавиатуру, а заранее 

подготовленный файл, когда весь файл будет выведен в соединение, клиент немедленно попытается 
закрыть  свое  полусоединение (!), ключ –h заставит  клиент,  закрыв  свое  полусоединение  ожидать 
данных  в  том  полусоединении,  в котором  клиент  получает  данные  от  сервера.  В  итоге  поведение 
клиента  будет  таким:  соединиться  с  сервером,  отправить  серверу  содержимое  файла,  отправить 
сегмент с флагами FIN, ACK, продолжать принимать данные в соединении. 

Запустим сервер командой: 

 

C:\>sock -P5 -Q 10 -s 192.168.0.89 999 <c:\text_s.txt 

 

Это  заставит  сервер  так  же  осуществлять  ввод  данных  в  соединение  из  заранее 

подготовленного  файла,  при  этом  ключ –P заставит  сервер  подождать 5 секунд,  от  момента 
установки  соединения  перед  тем  как  передавать  данные  клиенту – это  сделано  для  того,  чтобы 
сервер начал передачу данных уже ПОСЛЕ того, как клиент закроет свое полусоединение. Однако, 
клиент закроет свое полусоединение быстро, как только передаст необходимые данные, сервер еще 
не успеет начать передачу данных, как уже получит от клиента сегмент с флагами FIN, ACK. Для 
того  чтобы  сервер,  получив  сегмент  с  флагами FIN, ACK не  спешил  закрывать  и  свое 
полусоединение,  используется  ключ –Q, который  заставляет  сервер  НЕ  отправлять  собственный 
сегмент  с  флагами FIN, ACK, получив  аналогичный  сегмент  от  клиента.  Итого,  временная 
диаграмма происходящего такова: клиент устанавливает соединение с сервером, после чего сервер 
запускает 5-и секундный таймер, описанный выше, а клиент передает серверу содержимое своего 
файла text_c.txt, передает  серверу  сегмент  с  флагами FIN, ACK, при  этом  клиенту  предписано 
продолжать прием данных в этом соединении. Сервер принимает данные от клиента, квитируем их, 
принимает  от  клиента  сегмент  с  флагами FIN, ACK (квитирует  его),  и  запускает 10-и  секундный 
таймер,  в  течение  которого  НЕ  отправляет  свой  сегмент  с  флагами FIN, ACK. Через 5 секунд  у 
сервера  срабатывает  таймер  перед  отправкой  своих  данных  в  соединение,  и  он  передает  клиенту 
содержимое своего файла text_s.txt. Вот мы и достигли цели ☺ - заставили сервер передать данные 
клиенту, который уже закрыл свое полусоединение. Клиент квитирует эти данные, а по истечении 
10-и секундного таймера сервер закрывает и свое полусоединение. Проанализируем файл TCP8.cap. 
 


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

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