3

Я пытаюсь понять трехстороннее рукопожатие, но плохо понимаю, как это применимо к реальному сценарию. Например, если я использую веб-браузер, такой как Mozilla Firefox, и захожу на сайт www.superuser.com, я считаю, что происходит следующее

  1. Я запускаю Firefox и в качестве приложения назначается случайный идентификатор процесса. Предполагая, что я запускаю с пустой страницы, это все, что происходит.

  2. Теперь, если я захожу на сайт www.superuser.com, мой компьютер инициирует контакт с сервером, отправляя пакет SYN.

  3. Сервер отвечает запросом, отправляя пакет ACK вместе со своим собственным пакетом SYN.

  4. Мой компьютер отвечает пакетом ACK, и соединение установлено.

Теперь путаница,

  1. Что именно означает установленное? Если бы мне пришлось, например, перейти на другую страницу на www.superuser.com, повторяется ли трехстороннее рукопожатие?

  2. Когда мой компьютер отправляет флаг FIN и когда сервер отвечает своим собственным пакетом FIN?

  3. Я понимаю, что приложение может иметь несколько потоков при отправке запроса с сервера, означает ли это, что каждый поток имеет свое собственное трехстороннее рукопожатие? Являются ли они независимыми друг от друга?

  4. Что означают различные состояния FIN_WAIT?

  5. Может ли сервер завершить соединение, не будучи инициированным клиентом, или он всегда должен инициироваться клиентом?

2 ответа2

3

Что именно означает установленное? Если бы мне пришлось, например, перейти на другую страницу на www.superuser.com, повторяется ли трехстороннее рукопожатие?

"Установлено" означает, что трехстороннее рукопожатие завершено, и соединение доступно для передачи данных (пока оно не будет закрыто).

Количество запросов зависит от протокола. В HTTP 1.0 выполняется только один запрос на каждое соединение - TCP-рукопожатие, HTTP-запрос, HTTP-ответ, TCP-закрытое рукопожатие. Чтобы получить таблицы стилей или изображения, нужно было установить больше соединений (возможно, несколько одновременно).

В HTTP 1.1 разрешены постоянные соединения, при которых соединение остается открытым (бездействующим) после первоначального запроса, и если браузеру требуется загрузить больше ресурсов (изображений, других страниц), он отправляет больше запросов по тому же соединению.

Другие протоколы часто выполняют длинные разговоры по одному соединению. FTP, с другой стороны, использует несколько кратковременных соединений "данных" в дополнение к первичному "контрольному" соединению.

Когда мой компьютер отправляет флаг FIN и когда сервер отвечает своим собственным пакетом FIN?

Когда ваш браузер решает закрыть соединение или "положить трубку", ваш компьютер отправляет пакет FIN, сервер отвечает на него FIN ACK, а ваш компьютер отвечает ACK.

Я понимаю, что приложение может иметь несколько потоков при отправке запроса с сервера, означает ли это, что каждый поток имеет свое собственное трехстороннее рукопожатие? Являются ли они независимыми друг от друга?

Темы не имеют значения. Единственная концепция - TCP-соединения. Каждое отдельное соединение имеет отдельное рукопожатие.

Каждый поток может установить несколько соединений; несколько потоков могут совместно использовать соединение; даже несколько процессов могут совместно использовать соединение в некоторых ситуациях.

Что означают различные состояния FIN_WAIT?

  1. клиент находится в ESTABLISHED → сервер отправляет FIN → клиент находится в FIN_WAIT1
  2. сервер находится в ESTABLISHED → сервер получает FIN → сервер находится в CLOSE_WAIT
  3. ...Я признаю, я не знаю. (Кто-то может свободно редактировать. Я нашел эту диаграмму.)

Может ли сервер завершить соединение, не будучи инициированным клиентом, или он всегда должен инициироваться клиентом?

Соединение может быть закрыто любым концом. Если демон HTTP закроет его, он будет работать так же, но в противоположном направлении - сервер отправит FIN, а ваш компьютер ответит FIN ACK ...


TCP указан в RFC 793. Статья в Википедии о TCP объясняет, как осуществляется протокол рукопожатия.

0
  1. это означает, что установлено соединение TCP (дуплексное соединение)

  2. когда соединение больше не требуется (некоторые браузеры и серверы некоторое время поддерживают соединение, видят заголовки http-соединения)

  3. каждое TCP-соединение является независимым и выполняет собственное рукопожатие при настройке соединения

  4. FIN_WAIT_1 означает, что FIN отправлено, но не подтверждено FIN_WAIT_2 означает, что оно подтверждено, но другая сторона еще не завершила FIN

  5. любой конец может прервать соединение, когда ему больше нечего отправить

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .