Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

сети:состояния_сеанса_tcp [2014/01/17 10:21] (текущий)
Строка 1: Строка 1:
 +====== состояния сеанса tcp ======
 +Применимость:​ TCP
 +
 +Слова для поиска:​
 +
 +
 +----
 +===== Задача:​ =====
 +
 +Как выглядят соединения по протоколу TCP 
 +
 +===== Решение:​ =====
 +
 +{{:​сети:​5_4.gif|Состояния TCP}}
 +
 +
 +====  Состояния сеанса TCP  ====
 +<​exttab1>​
 +
 +{| class="​standard"​ text-align: left"
 +!colspan="​2"​ | Состояния сеанса TCP
 +|-
 +|width="​120px"​|'''​CLOSED'''​
 +|Начальное состояние узла. Фактически фиктивное
 +|-
 +|'''​LISTEN'''​
 +|Сервер ожидает запросов установления соединения от клиента
 +|-
 +|'''​SYN-SENT'''​
 +|Клиент отправил запрос серверу на установление соединения и ожидает ответа
 +|-
 +|'''​SYN-RECEIVED'''​
 +|Сервер получил запрос на соединение,​ отправил ответный запрос и ожидает подтверждения
 +|-
 +|'''​ESTABLISHED'''​
 +|Соединение установлено,​ идёт передача данных
 +|-
 +|'''​FIN-WAIT-1'''​
 +|Одна из сторон (назовём её узел-1) завершает соединение,​ отправив сегмент с флагом FIN
 +|-
 +|'''​CLOSE-WAIT'''​
 +|Другая сторона (узел-2) переходит в это состояние,​ отправив,​ в свою очередь сегмент ACK и продолжает одностороннюю передачу
 +|-
 +|'''​FIN-WAIT-2'''​
 +|Узел-1 получает ACK, продолжает чтение и ждёт получения сегмента с флагом FIN
 +|-
 +|'''​LAST-ACK'''​
 +|Узел-2 заканчивает передачу и отправляет сегмент с флагом FIN
 +|-
 +|'''​TIME-WAIT'''​
 +|Узел-1 получил сегмент с флагом FIN, отправил сегмент с флагом ACK и ждёт 2*MSL секунд,​ перед окончательным закрытием соединения
 +|-
 +|'''​CLOSING'''​
 +|Обе стороны инициировали закрытие соединения одновременно:​ после отправки сегмента с флагом FIN узел-1 также получает сегмент FIN, отправляет ACK и находится в ожидании сегмента ACK (подтверждения на свой запрос о разъединении)
 +|-
 +|}
 +
 +
 +</​exttab1>​
 +====  Установка соединения ​ ====
 +
 +Процесс начала сеанса TCP — обозначаемое как «рукопожатие» (handshake),​ состоит из 3 шагов.
 +
 +1. Клиент,​ который намеревается установить соединение,​ посылает серверу сегмент с номером последовательности и флагом SYN.
 +>* Сервер получает сегмент,​ запоминает номер последовательности и пытается создать сокет (буферы и управляющие структуры памяти) для обслуживания нового клиента.
 +>** В случае успеха сервер посылает клиенту сегмент с номером последовательности и флагами SYN и ACK, и переходит в состояние SYN-RECEIVED.
 +>** В случае неудачи сервер посылает клиенту сегмент с флагом RST.
 +
 +2. Если клиент получает сегмент с флагом SYN, то он запоминает номер последовательности и посылает сегмент с флагом ACK.
 +>* Если он одновременно получает и флаг ACK (что обычно и происходит),​ то он переходит в состояние ESTABLISHED.
 +>* Если клиент получает сегмент с флагом RST, то он прекращает попытки соединиться.
 +>* Если клиент не получает ответа в течение 10 секунд,​ то он повторяет процесс соединения заново.
 +
 +3. Если сервер в состоянии SYN-RECEIVED получает сегмент с флагом ACK, то он переходит в состояние ESTABLISHED.
 +>* В противном случае после тайм-аута он закрывает сокет и переходит в состояние CLOSED.
 +
 +Процесс называется «трехэтапным согласованием» («three way handshake»),​ так как несмотря на то что возможен процесс установления соединения с использованием 4 сегментов (SYN в сторону сервера,​ ACK в сторону клиента,​ SYN в сторону клиента,​ ACK в сторону сервера),​ на практике для экономии времени используется 3 сегмента.
 +
 +Пример базового 3-этапного согласования:​
 +
 +    TCP A                                                    TCP B
 +    1.  CLOSED ​                                              ​LISTEN
 +    2.  SYN-SENT ​   --> <​SEQ=100><​CTL=SYN> ​              ​-->​ SYN-RECEIVED
 +    3.  ESTABLISHED <-- <​SEQ=300><​ACK=101><​CTL=SYN,​ACK> ​ <-- SYN-RECEIVED
 +    4.  ESTABLISHED --> <​SEQ=101><​ACK=301><​CTL=ACK> ​      ​-->​ ESTABLISHED
 +    5.  ESTABLISHED <-- <​SEQ=301><​ACK=101><​CTL=ACK><​DATA>​ <-- ESTABLISHED
 +
 +В строке 2 TCP A начинает передачу сегмента SYN, говорящего об использовании номеров последовательности,​ начиная со 100. В строке 3 TCP B передает SYN и подтверждение для принятого SYN в адрес TCP A. Надо отметить,​ что поле подтверждения показывает ожидание TCP B приема номера последовательности 101, подтверждающего SYN с номером 100.
 +
 +В строке 4 TCP A отвечает пустым сегментом с подтверждением ACK для сегмента SYN от TCP B; в строке 5 TCP B передает некоторые данные. Отметим,​ что номер последовательности сегмента в строке 5 совпадает с номером в строке 4, поскольку ACK не занимает пространства номеров последовательности (если это сделать,​ придется подтверждать подтверждения — ACK для ACK!).
 +
 +
 +
 +===== Смотрите также: =====
 +
 +  * [[wikipedia>​TCP]]
 +  * [[http://​book.itep.ru/​4/​44/​tcp_443.htm|Протокол TCP (Семенов Ю.А., ИТЭФ-МФТИ)]]
 +  * [[http://​www.opennet.ru/​docs/​RUS/​iptables/#​TCPCONNECTIONS|TCP соединения (Руководство по iptables 1.1.19)]]
 +  * [[http://​mm.lti-gti.ru/​informatics/​sys2/​10.htm|Основы операционных систем. Практикум (Интернет-Университет Информационных Технологий,​ http://​www.INTUIT.ru)]]
 +
 +---- 
 +Актуальность:​ 2014/01/17 09:52 
 +
 +{{tag>​сеть}}