Что такое конекшены с сервером, как работают, зачем нужны и как использовать?

До этого знал что есть HTTP запросы, думал что хорошо их понимаю... И практически их использовал с веб сокетами, которые не очень понимал. Использую С#/.NET, c практической стороны можно говорить в контексте этого стека. Узнал что есть некие 'соединения'... Услышал что с Http1.1 все запросы по умолчанию снабжены заголовком Connection: keep-alive без явного добавления. То есть любой запрос порождает соединение, это ломает мое примитивное понимание запросов, а на место пустоты понимания ничего не приходит...

  1. В чем разница между просто последовательными запросами из Http1.0 и этими соединениями? Не понимаю зачем его 'держать' и что это вообще значит. Где тут выгода? Сейчас 'держать соединение' представляю по аналогии переиспользвания инстанса HttpClient, а не создавать новый каждый раз. Только тут на клиентах в рамках браузеров/мобильных либ TCP клиенты, которые работают не явно из кода который пишут фронтендщики. Это верное понимание или тут есть некий контекст концепций из описания протокола? Как тогда на стороне сервера может быть контроль количества соединений, если их количество должно быть известно только на клиенте?

  2. То есть эти клиенты создавая инстансы для запросов на сервер, отслеживают появления в ответе заголовка Connection: close для 'вызова Dispose' у инстанса, и прекращении его использования?

  3. Кто отправляет заголовок Connection: close? Веб сервера nginx, iis, kestrel или это делает ASP под капотом? Можно и руками добавлять используя ASP Core... но ни умения ни понимания зачем это нужно нет. Аналогично хотелось бы узнать какая часть должна отслеживать хедер Connection: keep-alive.

  4. Напишите, пожалуйста, что еще знаете в контексте вопроса 'Что такое конекшены с сервером, как работают, зачем нужны и как использовать?'. Любой ваш опыт или хорошие ссылки будет интересны.


Ответы (1 шт):

Автор решения: S.H.

Все очень просто.

Каждый раз, когда браузер "отрисовывает" страницу, это порождает "шквал" запросов на множество серверов. Потому что страница устроена очень сложно: это довольно много js-кода и десятки картинок с разных серверов.

Плюс к этому, этот js код начинает ajax-ом стучаться в разные методы бэкэнда.

Причем, по хорошему это должно идти не по http, а по https.

А теперь вспомним, что такое https. Это значит, что при устновлении каждого tcp-соединения происходит обмен открытыми ключами для создания зашифрованного канала - ssl handshaking.

И просто в HTTP 1.1 можно провести этот обмен ключами один раз между клиентом и конкретным сервером, а потом пользоваться уже установленным tcp соединением, не начиная всю эту возню с ключами заново при следующем обращении к тому же самому серверу.

Этот процесс абсолютно прозрачен как для сервера, так и для клиента. Более того, во многих случаях этот tcp-коннекшн существует между клиентом и энджинксом, который стоит "на входе" и служит системой распределения нагрузки, а сам nginx уже раскидывает запросы по целой ферме серверов для обслуживания бэкэнд-запросов, которые прячутся за ним.

Откровенно говоря, я не знаю, кто отправляет заголовок Connection: close. tcp соединения имеют свойство "протухать" - ну, перешли вы через дорогу, сотовый телефон подключился к другой вышке, а трансляция потоковой музыки через спотифай продолжается. Просто на более низком уровне, чем логика клиента, tcp коннекшн порвался и установился заново, когда понадобилось протащить с сервера следующий кусочек музкального потока.

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

Кстати, только что в голову пришел простой и любопытный эксперимент. Сделем простую страницу на сервере, поддерживающем http 1.1. Посмотрим на статистику открытых соединений на клиенте - ну,там, при помощи ss или более олдскульно - через netstat. Теперь откроем страницу в браузере.

Если я прав - то после полной загрузки страницы, когда уже всё прогрузилось и браузер ничего не ждёт, должны остаться одно или несколько открытых tcp-соединений с сервером, откуда была загружена страница. Это как раз позволило бы, если бы клиент захотел что то еще загрузить, воспользоваться уже открытым коннектом.

Если же мои представления не верны - я буду рад, если кто то меня поправит :-) - о, пока я писал ответ, в коментариях к вопросу сказали всё то же самое , только короче!

→ Ссылка