Как поддерживается TCP-соединение TCP и как HTTP Keep-Alive влияет на него? - PullRequest
0 голосов
/ 28 апреля 2020

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

Таким образом, я узнал о TCP и понимаю как это работает, но есть еще один термин, который меня смущает - «TCP-соединение». Я видел это повсюду, и на самом деле там была тема, открытая с тем же вопросом ... но, как сказал в комментариях OP, никто на самом деле не ответил на вопрос: TCP против UDP - Что такое TCP-соединение?

", когда мы говорим, что между двумя хостами установлено соединение, что это значит? Если бы я мог получить микроскоп magi c и осмотреть сервер или клиента, и - a-ha! - найти соединение, на что бы я посмотрел? Какая переменная выделена кодом ОС? Какая-то запись в какой-то таблице? Как и когда она туда попадает, и как и когда она оттуда удаляется? "

Я читал, чтобы попытаться выяснить это самостоятельно,
Вот хороший ресурс, который детализирует поток HTTP, также упоминает «TCP-соединение» https://blog.catchpoint.com/2010/09/17/anatomyhttp/

Вот еще одна тема о HTTP Keep-alive, то же самое «TCP-соединение»: HTTP Keep Alive и TCP поддерживают активность


My понимание:
Когда клиент Требуются данные с сервера, происходит рукопожатие SYN / ACK, устанавливается это «соединение», и обе стороны согласовывают начальный порядковый номер, максимальный размер пакета и т. д. c.

до тех пор, пока это «соединение» "все еще открыт, клиент может запрашивать / получать данные, не делая другого рукопожатия. TCP Keep-alive посылает пульс, чтобы сохранить это «соединение» открытым

1) Каким-то образом HTTP-заголовок «Keep-alive» также сохраняет это TCP-соединение открытым, хотя HTTP-заголовки являются частью полезная нагрузка пакета, и, кажется, не имеет смысла, что уровень TCP будет анализировать заголовки HTTP?

Мне кажется, что «соединение» между двумя машинами в буквальном смысле никогда не может быть закрыт, потому что клиент всегда может поразить сервер пакетами (например, первый пакет SYN)

2) Является ли TCP-соединение только клиентом и сервером, сохраняя порядковый номер с другого IP-адреса? может быть, это просто флаг, который говорит: «Эй, этот клиент классный, принимай сообщения от него без рукопожатия»? Так что закрытие соединения будет просто стирать эти данные из памяти?

1 Ответ

1 голос
/ 28 апреля 2020

... обе стороны согласны с начальным порядковым номером

Нет, они не "согласны" с одним номером. Каждое направление имеет свою порядковую нумерацию. Таким образом, клиент отправляет в SYN на сервер начальный порядковый номер (ISN) для данных от клиента к серверу, сервер отправляет в своем SYN ISN для данных от сервера к клиенту.

Каким-то образом HTTP-заголовок «Keep-alive» также сохраняет это TCP-соединение «открытым» ...

Не совсем. С HTTP keep-alive клиент просто просит сервер не закрывать соединение после отправки HTTP-ответа, чтобы другой HTTP-запрос мог быть отправлен с использованием того же TCP-соединения. Сервер может решить следовать за клиентами w sh или нет.

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

Каждая сторона может отправить пакет с флагом FIN, чтобы указать, что она больше не будет отправлять какие-либо данные. Если обе стороны отправили FIN, соединение считается закрытым, так как никто ничего не отправит и, следовательно, ничего не может быть получено. Если одна сторона решает, что она не хочет получать больше данных, она может отправить пакет с флагом RST.

Является ли TCP-соединение «только клиентом и сервером», сохраняя порядковый номер из IP-адрес другого?

Вид. Каждая сторона сохраняет текущее состояние соединения, т.е. задействованные IP-адреса и порты, ожидаемый в настоящее время порядковый номер для приема, текущий порядковый номер для отправки, ожидающие байты, которые еще не были подтверждены ... Если такого состояния нет там (например, один сайт вышел из строя), тогда нет соединения.

... возможно, это просто флаг, который говорит: «Эй, этот клиент классный, принимай сообщения от него без рукопожатия»

Если получен пакет, который соответствует существующему состоянию, то он считается частью соединения, то есть он будет обработан и состояние будет обновлено.

То же самое происходит при закрытии соединение просто стирает эти данные из памяти?

Закрытие говорит другому, что больше не будет отправлено данных (используя FIN), и если обе стороны сделали это, обе они могут в основном удалить состояние и тогда больше нет связи.

...