Десять минут, чтобы изучить принцип вебсокета (обмен мгновенными сообщениями)

сервер HTTP WebSocket Ajax

1. Что такое Websocket и как он связан с http?

WebSocket этоHTML5Из дела (соглашения), то есть протокол HTTP не изменился, или это не имеет значения, но HTTP не поддерживает lasting соединение (длительное соединение, цикл соединения не засчитывается), другими словами, WebSocket поддерживает персистентное соединение связь (подумав: какая же это прочная связь?)

Во-первых, у HTTP есть 1.1 и 1.0, это так называемая keep-alive, которая объединяет несколько HTTP-запросов в один, но Websocket на самом деле является новым протоколом, который в принципе не имеет ничего общего с HTTP-протоколом, просто чтобы быть совместим с рукопожатием существующих браузеров. Это всего лишь спецификация, что означает, что это дополнение к протоколу HTTP.

Кроме тогоHtml5Относится к серии новых API или новых спецификаций, новых технологий. Сам протокол Http имеет только версии 1.0 и 1.1 и не имеет прямого отношения к самому Html. . С точки зрения непрофессионала, вы можете использовать протокол HTTP для передачи данных, отличных от HTML,

2. Что за протокол Websocket и в чем его преимущества?

Прежде всего, Websocket — это постоянный протокол, в отличие от HTTP, который является непостоянным протоколом. В качестве простого примера воспользуемся широко используемым в настоящее времяPHPжизненный цикл объяснить.

Жизненный цикл HTTP определяется запросом, то есть запросом и ответом, затем в HTTP 1.0 этот HTTP-запрос завершен.

В HTTP 1.1 были внесены улучшения, так что есть поддержка активности, то есть в HTTP-соединении можно отправлять несколько запросов и получать несколько ответов. Но помните Запрос = Ответ, что всегда имеет место в HTTP, запрос соответствует ответу (как пара ключ-значение карты).И эта реакция также пассивна и не может быть инициирована активно.

Другими словами, у вас столько ББ, какое отношение он имеет к Websocket? _(:з"∠)_ Ну, я собирался сказать Websocket. .

Прежде всего, Websocket основан на протоколе HTTP или заимствует протокол HTTP для выполнения части рукопожатия.

Сначала давайте посмотрим на типичное рукопожатие Websocket (позаимствовано из Википедии..)

GET /chat HTTP/1.1

Host: server.example.com

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==

Sec-WebSocket-Protocol: chat, superchat

Sec-WebSocket-Version: 13

Origin: http://example.com

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

Upgrade: websocket

Connection: Upgrade

Это ядро ​​Websocket, говорящее Apache, Nginx и другому серверу:

Внимание, я инициировал протокол Websocket, быстро помогите мне найти соответствующую обработку помощника ~ не старомодный HTTP.

Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==

Sec-WebSocket-Protocol: chat, superchat

Sec-WebSocket-Version: 13

Во-первых, Sec-WebSocket-Key — это Base64.

Значение encode, которое случайным образом генерируется браузером, сообщает серверу: торф, не валяй дурака, я хочу проверить, действительно ли Ni является помощником Websocket.

Затем Sec_WebSocket-Protocol — это определяемая пользователем строка, используемая для различения протоколов, требуемых различными службами по одному и тому же URL-адресу. Простое понимание: я хочу служить сегодня вечером, не ошибитесь~

Наконец, Sec-WebSocket-Version сообщает серверу, какой Websocket использовать.

Draft(协议版本),在最初的时候,Websocket协议还在Draft阶段,各种奇奇怪怪的协议都有,而且还有很多期奇奇怪怪不同的东西,什么Firefox和Chrome用的不是一个版本之类的,当初Websocket协议太多可是一个大难题。 .不过现在还好,已经定下来啦~大家都使用的一个东西~ 脱水:服务员,我要的是13岁的噢→_→

Затем сервер вернет следующие вещи, указывающие на то, что запрос принят и веб-сокет успешно установлен!

HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=

Sec-WebSocket-Protocol: chat

Это последняя зона ответственности HTTP.Сообщите клиенту, что я успешно переключил протокол~

Upgrade: websocket

Connection: Upgrade

Все еще исправлено сообщение клиенту, что предстоящее обновление — это протокол Websocket, а не mozillasocket, lurnarsocket или shitsocket.

Затем Sec-WebSocket-Accept — это ключ Sec-WebSocket-Key, подтвержденный сервером и зашифрованный. Сервер: Хорошо, понял, позвольте мне показать вам мое удостоверение личности, чтобы доказать это. .

Последний, Sec-WebSocket-Protocol, является окончательным используемым протоколом.

На данный момент HTTP завершил все это, а затем он полностью основан на протоколе WebStocket. Специальное соглашение не описано здесь.

—————— Часть технического анализа завершена ——————

Ваш TMD так долго был BBB, так что, черт возьми, использование Websocket, не может ли длинный опрос http или опрос ajax обеспечить передачу информации в реальном времени?

3. Роль веб-сокета

Прежде чем говорить о Websocket, я расскажу о принципах длинного опроса и опроса ajax.

ajax-опрос

Принцип AJAX-опроса очень прост, так что браузер отправляет запрос на несколько секунд, спросить, есть ли новая информация.

Репродукция сцены:

Клиент: Ла-ла, новой информации нет (Запрос)

Сервер: нет (Ответ)

Клиент: ля-ля-ля, есть ли новая информация (Запрос)

Сервер: Нет. . (Ответ)

Клиент: ля-ля-ля, есть ли новая информация (Запрос)

Сервер: Ты такой раздражающий, нет. . (Ответ)

Клиент: ля-ля-ля, есть новое сообщение (запрос)

服务端:好啦好啦,有啦给你。 (Ответ)

Клиент: ля-ля-ля, есть новое сообщение (запрос)

Сервер:. . . . . Нет. . . . Нет. . . нет (ответ) --- петля

длинный опрос

Долгий опрос, такой как длительный опрос кометы, на самом деле принцип аналогичен принципу опроса ajax, оба используют метод опроса, но методблокирующая модель(Был вызван, не получил, не положил трубку), то есть клиент инициирует соединение, если нет сообщения, он не вернет ответ клиенту. Не возвращаться, пока сообщение не будет возвращено после завершения,Отключить.Пока клиент не завершит обработку, он повторно отправит запрос Ajax на сервер. , опять и опять. Длинный опрос сам по себе не является настоящей технологией push, а просто вариантом традиционной технологии опроса.Но его функция состоит в том, чтобы имитировать толкающий механизм, когда реальная толкающая технология не может быть реализована.

Длинное соединение: Длинное соединение, такое как комета. Клиент отправляет Ajax-запрос на сервер, и после подключения к серверу клиент и сервер всегда остаются на связи. Когда на сервере есть сообщение об обновлении, оно будет немедленно отправлено клиенту,И связь не рвется. (долгий опрос отключен, долгое соединение отключено)

Репродукция длительного опроса:

Клиент: La La La, есть ли новая информация?

Сервер: угу. . Подождите, пока не будет новостей. . иди к тебе (Ответ)

Клиент: ля-ля-ля, есть ли какая-нибудь новая информация, если нет, пожалуйста, подождите, пока она будет доступна, прежде чем возвращать ее мне (Запрос) -loop

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

Что такое пассивность На самом деле сервер не может активно связываться с клиентом, только клиент может инициировать это.

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

Сказав это, давайте поговорим о вышеупомянутых дефектах

Из вышеизложенного нетрудно увидеть, что, несмотря ни на что, два вышеуказанных весьма ресурсоемки.

Опрос Ajax требует, чтобы сервер имел высокую скорость обработки и ресурсы. (Скорость) Длинный опрос требует высокой параллелизма, то есть возможности получать клиентов одновременно. (размер сайта)

Таким образом, это может произойти как с опросом ajax, так и с длинным опросом.

Клиент: Ла-ла-ла-ла, есть какая-то новая информация?

Сервер: месячная линия занята, повторите попытку позже (503 сервер недоступен)

客户端:。 . . .好吧,啦啦啦,有新信息么?

Сервер: месячная линия занята, повторите попытку позже (503 сервер недоступен)

Ближе к дому поговорим о Websocket

Из приведенного выше примера мы видим, что ни один из этих двух способов не является лучшим и требует много ресурсов.

Нужно больше скорости, нужно больше «телефонов». И то, и другое приведет к все большему и большему спросу на «телефоны».

Ах да, я забыл упомянуть, что HTTP по-прежнему является протоколом с отслеживанием состояния.

Говоря простым языком, официант — человек забывчивый, потому что к нему ежедневно поступает слишком много клиентов, и как только вы повесите трубку, он забудет все ваши вещи и выбросит все ваши вещи. Вы должны сказать серверу еще раз во второй раз.

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

Клиент: Ла-Ла-Ла, хочу создать протокол Websocket, требуемый сервис: чат, версия протокола Websocket: 17 (запрос HTTP)

Сервер: в порядке, подтверждено, обновлен до протокола Websocket (протоколы HTTP переключены)

Клиент: Пожалуйста, сообщите мне, когда у вас будет информация. .

Сервер: ок, иногда он скажет вам.

Сервер: балабабалабалабала

Сервер: балабабалабалабала

Сервер: Хахахахахахахаха

Сервер: смеюсь до смерти хахахахахаха

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

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

Фактически, используемая нами программа должна пройти через два уровня прокси, то есть протокол HTTP анализируется такими серверами, как Nginx, а затем отправляется соответствующему обработчику (PHP и т. д.) для обработки. Проще говоря, у нас есть очень быстрый оператор (Nginx), который отвечает за передачу проблемы в соответствующую службу поддержки клиентов (Handler).

Сам оператор в принципе достаточно быстрый, но он каждый раз застревает в службе поддержки (Handler), а скорость обработки старой службы поддержки слишком низкая. , что приводит к недостаточному обслуживанию клиентов. Websocket решает такую ​​проблему.После установления постоянное соединение может быть установлено напрямую с оператором.При наличии информации клиентская служба найдет способ уведомить оператора, а затем оператор передаст ее заказчику.

Это может решить проблему слишком низкой скорости обработки обслуживания клиентов.

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

Хоть оператор и очень быстрый, но каждый раз, когда им приходится слушать такую ​​кучу, эффективность тоже будет снижаться.При этом им приходится постоянно передавать информацию в службу поддержки, что не только тратит впустую обработку время обслуживания клиентов, но также потребляет передачу данных по сети Чрезмерный трафик/время.

Но для Websocket требуется только одно HTTP-рукопожатие, поэтому весь процесс связи устанавливается в одном соединении/состоянии, что позволяет избежать негосударственной природы HTTP, и сервер всегда будет знать вашу информацию, пока вы не закроете запрос, который решается оператором. должен неоднократно анализировать протокол HTTP и проверять идентификационную информацию.

При этом заказчик активно запрашивает, конвертирует на сервер (push) и отправляет, когда есть информация (разумеется, клиент все равно активно ждет отправки информации...), а когда ее нет информация, она передается оператору (Nginx), не занимая собственной скорости.Просто медленное обслуживание клиентов (Handler)

———————

Что касается того, как использовать Websocket на клиентах, которые не поддерживают Websocket. . Ответ - нет

Но вы можете пройти длинный опрос и упомянутый выше ajax

опрос для имитации аналогичного эффекта