Я понимаю TCP Connection - описание ссылки
Я так понимаю подключение по TCP - исходная ссылка
Я так понимаю подключение по TCP - исходная ссылка
Обзор
TCP — это протокол, ориентированный на соединение. Транспортные соединения используются для передачи пакетов TCP. Установление и освобождение транспортных TCP-соединений является важным процессом в любой связи, ориентированной на установление соединения. Следовательно, в транспортном соединении есть три фазы, а именно: установление соединения, передача данных и разрыв соединения.
В процессе установления TCP-соединения необходимо решить три проблемы.
(1) Сделать так, чтобы одна сторона четко знала о существовании другой стороны. (2) Чтобы позволить обеим сторонам согласовать некоторые параметры (например, максимальное значение окна и т. д.). (3) Может транспортировать ресурсы объекта для распределения.
Установление TCP-соединения (трехстороннее рукопожатие)
Как показано на рисунке выше, на приведенном выше рисунке показан процесс подключения TCP. Предположим, что на узле A запущена клиентская программа TCP, а на хосте B запущена серверная программа TCP. Первоначально процессы TCP на обоих концах находятся в состоянии CLOSE. Квадраты под хостом на рисунке — это состояния процесса TCP. Обратите внимание, что A активно открывает ссылку, а B пассивно открывает соединение.
Процесс TCP-сервера B сначала создает быстрый TCB управления передачей и готовится принять запрос на соединение от клиентского процесса. Затем серверный процесс находится в состоянии LISTEN, ожидая запроса на подключение от клиента. Если да, ответьте.
Клиентский процесс TCP A также сначала создает TCB блока управления передачей, а затем отправляет сегмент запроса на соединение B. Это бит синхронизации заголовка SYN = 1, и он выбирает начальный порядковый номер seq = x. TCP предусматривает, что сегмент SYN не может передавать данные, но порядковый номер должен быть удален.В это время клиентская программа TCP переходит в состояние SYN-SEND (синхронизировано отправлено).
После получения сегмента запроса на соединение B отправляет подтверждение на A, если он согласен на соединение. В сегменте подтверждения как бит SYN, так и бит ACK должны быть установлены в 1, номер подтверждения равен ack = x + 1, а также должен быть выбран начальный порядковый номер seq = y. Обратите внимание, что этот сегмент также не может нести никаких данных, но также использует порядковый номер. В это время программа службы TCP переходит в состояние SYN-RCVD (синхронный прием).
После процесса подтверждения получает TCP-клиент B и проверяет, что B. Сегмент ACK сообщения подтверждения установлен, номер подтверждения ack = y + 1, а их количество seq = x + 1. Стандарты TCP, сегмент ACK может нести данные. Однако, если номер не несет данных, они не потребляются, и в этом случае следующий порядковый номер сегмента данных по-прежнему будет seq = x + 1. Затем устанавливается TCP-соединение, A для входа в состояние ESTABLISHED (установленное соединение). Когда B получает подтверждение, A также переходит в состояние ESTABLISHED.
Отпуск подключения TCP (четвертая волна)
После завершения передачи данных обе стороны связи могут разорвать соединение. Теперь и A, и B находятся в состоянии ESTABLISHED. Процесс приложения A сначала отправляет сегмент освобождения соединения в свой TCP, снова прекращает отправку данных и активно закрывает TCP-соединение. A устанавливает позицию управления завершением FIN в заголовке сегмента разрыва соединения на 1 и его порядковый номер seq = u, который равен порядковому номеру последнего байта данных в предыдущем процессе передачи плюс 1. В это время A входит в состояние FIN_WAIT_1 (бит 1 ожидания завершения) и ожидает подтверждения от B. Обратите внимание, что TCP предусматривает, что даже если сегмент FIN не несет данных, он использует порядковый номер.
B отправляет подтверждение сразу после получения сегмента сообщения, освобожденного соединением.Номер подтверждения ack = u + 1, а порядковый номер этого сегмента сообщения равен v, что равно последнему байту данных, которые были переданы до этого. Б плюс 1. Затем B входит в CLOSE_WAIT (близкое ожидание) состояние. Серверный процесс TCP в это время уведомляет процесс приложения высокого уровня, поэтому соединение от A к B освобождается. В это время TCP-соединение находится в полузакрытом состоянии, то есть у A нет данных для отправки, но B Если данные отправлены, A все равно должен их получить. То есть соединение от B к A не закрыто, и это состояние может продолжаться в течение определенного периода времени.
После того как A получает подтверждение от B, он переходит в состояние FIN_WAIT_2 (ожидание завершения 2), ожидая, пока B отправит сегмент освобождения соединения.
Если у B нет данных для отправки A, его прикладной процесс уведомляет TCP о разрыве соединения. В это время B отправляет сегмент освобождения соединения, чтобы сделать FIN = 1. Теперь предположим, что порядковый номер B равен w (в полузакрытом состоянии B мог отправить еще какие-то данные). B также должен повторить номер подтверждения ack = u + 1, который был отправлен в последний раз. В это время B входит в состояние LAST_ACK (последнее подтверждение) и ожидает подтверждения от A.
После того, как A получит сегмент освобождения соединения от B, он должен подтвердить это. В сегменте подтверждения установите для ACK значение 1, номер подтверждения ack = w + 1, а его собственный порядковый номер — seq = u + 1 (согласно стандарту TCP ранее отправленное FIN-сообщение использует порядковый номер). Затем войдите в состояние TIME_WAIT (время ожидания). Обратите внимание, что TCP-соединение еще не разорвано. A должен подождать время, установленное таймером 2MSL, прежде чем A перейдет в состояние CLOSE. Время MSL называется максимальным сроком службы сегмента, и RFC 793 рекомендует установить его равным 2 минутам. Но это чисто инженерное соображение, и MSL = 2 минуты может быть слишком большим для сегодняшних сетей. Таким образом, TCP допускает другое время и может использовать меньшее значение MSL в зависимости от реальной ситуации. Следовательно, после входа в состояние TIME_WAIT из A требуется 4 минуты, чтобы войти в состояние CLOSE, прежде чем будет установлено следующее новое соединение. Когда A отменяет соответствующий TCB блока управления передачей, TCP-соединение завершается.
две маленькие проблемы
Почему во время трехэтапного рукопожатия A отправляет подтверждение?В основном это делается для предотвращения внезапной повторной передачи сообщения о неудачном соединении на B, что приводит к ошибке.
Почему A должен ждать 2MSL в состоянии TIME_WAIT?
Во-первых, чтобы гарантировать, что A отправит последний сегмент ACK для достижения B.
Во-вторых, чтобы предотвратить появление только что упомянутого «несуществующего сегмента запроса на соединение» в этом соединении. После того, как A отправит последний сегмент ACK и истечет 2MSL, все сегменты, сгенерированные за время соединения, могут исчезнуть из сети. Таким образом, старый сегмент запроса на соединение не появится в следующем новом соединении.