Различия
Показаны различия между двумя версиями страницы.
сети:состояния_сеанса_tcp [2014/01/17 10:21] |
сети:состояния_сеанса_tcp [2022/04/01 15:08] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== состояния сеанса tcp ====== | ||
+ | Применимость: | ||
+ | |||
+ | Слова для поиска: | ||
+ | |||
+ | |||
+ | ---- | ||
+ | ===== Задача: | ||
+ | |||
+ | Как выглядят соединения по протоколу TCP | ||
+ | |||
+ | ===== Решение: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | ==== Состояния сеанса TCP ==== | ||
+ | < | ||
+ | |||
+ | {| class=" | ||
+ | !colspan=" | ||
+ | |- | ||
+ | |width=" | ||
+ | |Начальное состояние узла. Фактически фиктивное | ||
+ | |- | ||
+ | |''' | ||
+ | |Сервер ожидает запросов установления соединения от клиента | ||
+ | |- | ||
+ | |''' | ||
+ | |Клиент отправил запрос серверу на установление соединения и ожидает ответа | ||
+ | |- | ||
+ | |''' | ||
+ | |Сервер получил запрос на соединение, | ||
+ | |- | ||
+ | |''' | ||
+ | |Соединение установлено, | ||
+ | |- | ||
+ | |''' | ||
+ | |Одна из сторон (назовём её узел-1) завершает соединение, | ||
+ | |- | ||
+ | |''' | ||
+ | |Другая сторона (узел-2) переходит в это состояние, | ||
+ | |- | ||
+ | |''' | ||
+ | |Узел-1 получает ACK, продолжает чтение и ждёт получения сегмента с флагом FIN | ||
+ | |- | ||
+ | |''' | ||
+ | |Узел-2 заканчивает передачу и отправляет сегмент с флагом FIN | ||
+ | |- | ||
+ | |''' | ||
+ | |Узел-1 получил сегмент с флагом FIN, отправил сегмент с флагом ACK и ждёт 2*MSL секунд, | ||
+ | |- | ||
+ | |''' | ||
+ | |Обе стороны инициировали закрытие соединения одновременно: | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | |||
+ | </ | ||
+ | ==== Установка соединения | ||
+ | |||
+ | Процесс начала сеанса TCP — обозначаемое как «рукопожатие» (handshake), | ||
+ | |||
+ | 1. Клиент, | ||
+ | >* Сервер получает сегмент, | ||
+ | >** В случае успеха сервер посылает клиенту сегмент с номером последовательности и флагами SYN и ACK, и переходит в состояние SYN-RECEIVED. | ||
+ | >** В случае неудачи сервер посылает клиенту сегмент с флагом RST. | ||
+ | |||
+ | 2. Если клиент получает сегмент с флагом SYN, то он запоминает номер последовательности и посылает сегмент с флагом ACK. | ||
+ | >* Если он одновременно получает и флаг ACK (что обычно и происходит), | ||
+ | >* Если клиент получает сегмент с флагом RST, то он прекращает попытки соединиться. | ||
+ | >* Если клиент не получает ответа в течение 10 секунд, | ||
+ | |||
+ | 3. Если сервер в состоянии SYN-RECEIVED получает сегмент с флагом ACK, то он переходит в состояние ESTABLISHED. | ||
+ | >* В противном случае после тайм-аута он закрывает сокет и переходит в состояние CLOSED. | ||
+ | |||
+ | Процесс называется «трехэтапным согласованием» («three way handshake»), | ||
+ | |||
+ | Пример базового 3-этапного согласования: | ||
+ | |||
+ | TCP A TCP B | ||
+ | 1. CLOSED | ||
+ | 2. SYN-SENT | ||
+ | 3. ESTABLISHED <-- < | ||
+ | 4. ESTABLISHED --> < | ||
+ | 5. ESTABLISHED <-- < | ||
+ | |||
+ | В строке 2 TCP A начинает передачу сегмента SYN, говорящего об использовании номеров последовательности, | ||
+ | |||
+ | В строке 4 TCP A отвечает пустым сегментом с подтверждением ACK для сегмента SYN от TCP B; в строке 5 TCP B передает некоторые данные. Отметим, | ||
+ | |||
+ | |||
+ | |||
+ | ===== Смотрите также: ===== | ||
+ | |||
+ | * [[wikipedia> | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ---- | ||
+ | Актуальность: | ||
+ | |||
+ | {{tag> | ||