Различия

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

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

сети:состояния_сеанса_tcp [2014/01/17 10:21]
сети:состояния_сеанса_tcp [2022/04/01 15:08] (текущий)
Строка 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>сеть}}