Эта статья воспроизводится и уважает авторские права оригинального автора.
Время от времени видел ответ на Zhihu и сразу чувствовал, что информация, которую я читал ранее, не так хороша, как этот ответ.websocket
Понимание глубокое и древесное. Так что заходите в мой блог и делитесь. Я предпочитаю читать такие блоги, они очень легко читаются, не скучны, в них нет битвы евангелистов, они предназначены исключительно для обмена. Столько бреда, наконец-то лайк~
1. веб-сокет и http
WebSocket это что-то (протокол) из HTML5, а это значит, что протокол HTTP не изменился, или это не имеет значения, но HTTP не поддерживает постоянные соединения (длинные соединения, циклические соединения не в счет)
Первый HTTP имеет1.1
а также1.0
так называемыйkeep-alive
, объединяет несколько HTTP-запросов в один, ноWebsocket
По сути, это новый протокол, который не имеет ничего общего с протоколом HTTP, он просто должен быть совместим со спецификациями рукопожатия существующих браузеров, то есть является дополнением к протоколу HTTP и может быть понял через такую картинку.
Пересечения есть, но не все.
Кроме того, Html5 относится к ряду новых API или новых спецификаций и новых технологий. Сам протокол Http имеет только версии 1.0 и 1.1 и не имеет прямого отношения к самому Html. . С точки зрения непрофессионала, вы можете передавать данные, отличные от HTML, с помощью протокола HTTP, вот и все =. знак равно
Проще говоря, уровни разные.
2. Что за протокол Websocket и в чем его преимущества?
Прежде всего, Websocket — это постоянный протокол, в отличие от HTTP, который является непостоянным протоколом. Давайте возьмем простой пример и объясним его на широко используемом жизненном цикле PHP.
Жизненный цикл HTTP проходитRequest
определить, то естьRequest
ОдинResponse
, затем вHTTP1.0
, этот HTTP-запрос завершен.
В HTTP 1.1 были внесены улучшения, так что есть поддержка активности, то есть в HTTP-соединении можно отправлять несколько запросов и получать несколько ответов. Но помниRequest = Response
, Это всегда так в 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 сделал всю свою работу, и следующим шагом будет полное следование протоколу Websocket. Конкретный протокол здесь не описывается.
—————— Часть технического анализа завершена ——————
Вы так долго TMD и BBB, что, черт возьми, такое Websocket?http long poll
,илиajax轮询
Разве нельзя добиться передачи информации в режиме реального времени?
Хорошо, молодой человек, давайте поговорим об использовании Websocket. Приходите и дайте вам немного Ху (Су) Луо (Дан) Бу (Красный)
3. Роль WebSocket
Прежде чем говорить о Websocket, я, кстати, расскажу о нем.long poll
а такжеajax轮询
принцип.
ajax-опрос
Принцип ajax-опроса очень прост, пусть браузер каждые несколько секунд отправляет запрос, чтобы спросить сервер, есть ли новая информация.
Воспроизведение сцены:
Клиент: ля-ля-ля, есть ли новая информация (Запрос)
Сервер: нет (Ответ)
Клиент: ля-ля-ля, есть ли новая информация (Запрос)
Сервер: Нет. . (Ответ)
Клиент: ля-ля-ля, есть ли новая информация (Запрос)
Сервер: Ты такой раздражающий, нет. . (Ответ)
Клиент: ля-ля-ля, есть новое сообщение (запрос)
Сервер: Хорошо, хорошо, вот и все. (Ответ)
Клиент: ля-ля-ля, есть новое сообщение (запрос)
Сервер:. . . . . Нет. . . . Нет. . . нет (ответ) --- петля
long poll
long poll
На самом деле принципajax轮询
Почти все они используют метод опроса, но принята модель блокировки (все время звонить, не вешать трубку, если не получено), то есть после того, как клиент инициирует соединение, если нет сообщения, оно не будет return Ответ клиенту end. Он не возвращается, пока не будет сообщения.После возврата клиент снова устанавливает соединение, и цикл начинается снова и снова.
Воспроизведение сцены:
Клиент: ля-ля-ля, есть какая-то новая информация?
Сервер: угу. . Подождите, пока не будет новостей. . иди к тебе (Ответ)
Клиент: La La La, есть ли новая информация, если нет, пожалуйста, подождите, пока оно не доступен, прежде чем вернуть его мне (запрос) -Loop
На самом деле это видно из приведенных выше двух методов: постоянно устанавливает HTTP-соединение, а затем ждет обработки сервером, HTTP-протокол может отражать другойХарактер, пассивность.
Что такое пассивность На самом деле сервер не может активно связываться с клиентом, только клиент может инициировать это.
Проще говоря, сервер - очень ленивый холодильник (это стебель) (не будет, не может активно инициировать соединение), а у начальника есть заказ. есть, вы должны получить его хорошо.
После разговора об этом поговорим о вышеперечисленных недостатках (простите мой бред, OAQ)
Из вышеизложенного нетрудно увидеть, что, несмотря ни на что, два вышеуказанных весьма ресурсоемки.
Опрос Ajax требует, чтобы сервер имел высокую скорость обработки и ресурсы. (Скорость) Длинный опрос требует высокой параллелизма, то есть возможности получать клиентов одновременно. (размер сайта)
такajax轮询
а такжеlong poll
Это возможно.
Клиент: Ла-ла-ла-ла, есть какая-то новая информация?
Сервер: месячная линия занята, повторите попытку позже (503 сервер недоступен)
Клиент: . . . . Ладно, ла-ла-ла, есть новая информация?
Сервер: месячная линия занята, повторите попытку позже (503 сервер недоступен)
Клиент: Тогда сервер занят до смерти: холодильник, я хочу больше холодильников! Более. . Более. . (Я был неправ.. это снова стебель..)
Ближе к дому поговорим о Websocket
Из приведенного выше примера мы видим, что ни один из этих двух способов не является лучшим и требует много ресурсов.
Нужно больше скорости, нужно больше «телефонов». И то, и другое приведет к все большему и большему спросу на «телефоны».
Ах да, я забыл упомянуть, что HTTP по-прежнему является протоколом с отслеживанием состояния.
Говоря простым языком, официант — человек забывчивый, потому что к нему ежедневно поступает слишком много клиентов, и как только вы повесите трубку, он забудет все ваши вещи и выбросит все ваши вещи. Вы должны сказать серверу еще раз во второй раз.
Так что в этом случае пришел, пришел Websocket. Он решил несколько проблем HTTP. Во-первых, пассивный, когда сервер завершает обновление протокола (HTTP->Websocket), сервер может активно передавать информацию клиенту. Таким образом, приведенный выше сценарий можно изменить следующим образом.
Клиент: Ла-Ла-Ла, хочу создать протокол Websocket, требуемый сервис: чат, версия протокола Websocket: 17 (запрос HTTP)
Сервер: в порядке, подтверждено, обновлен до протокола Websocket (протоколы HTTP переключены)
Клиент: Пожалуйста, сообщите мне, когда у вас будет информация. .
Сервер: ок, иногда он скажет вам.
Сервер: балабабалабалабала
Сервер: балабабалабалабала
Сервер: Хахахахахахахаха
Подача: Смеюсь, я, хахахахахаха
Так получилось, что с помощью всего одного HTTP-запроса можно передавать постоянный поток информации. (В программировании такая конструкция называется обратным вызовом, то есть: вы будете уведомлять меня, когда у вас будет информация, вместо того, чтобы я дурачился и каждый раз спрашивал вас)
Такой протокол решает ситуацию, когда синхронизация выше задерживается и очень сильно потребляет ресурсы. Так почему же он решает проблему потребления ресурсов на сервере?
Фактически, используемая нами программа должна пройти через два уровня прокси, то есть протокол HTTP анализируется такими серверами, как Nginx, а затем отправляется соответствующему обработчику (PHP и т. д.) для обработки. Проще говоря, у нас очень быстро接线员(Nginx)
, он несет ответственность за передачу проблемы в соответствующее客服(Handler)
.
Сам оператор в принципе достаточно быстрый, но он каждый раз застревает в службе поддержки (Handler), а скорость обработки старой службы поддержки слишком низкая. , что приводит к недостаточному обслуживанию клиентов. Websocket решает такую проблему.После установления постоянное соединение может быть установлено напрямую с оператором.При наличии информации клиентская служба найдет способ уведомить оператора, а затем оператор передаст ее заказчику.
Это может решить проблему слишком низкой скорости обработки обслуживания клиентов.
При этом традиционным способом необходимо постоянно устанавливать и закрывать протокол HTTP.Поскольку HTTP является негосударственным, его необходимо каждый раз передавать повторно.identity info
(идентификационная информация), чтобы сообщить серверу, кто вы.
Хоть оператор и очень быстрый, но каждый раз, когда им приходится слушать такую кучу, эффективность тоже будет снижаться.При этом им приходится постоянно передавать информацию в службу поддержки, что не только тратит впустую обработку время обслуживания клиентов, но также потребляет передачу данных по сети Чрезмерный трафик/время.
Но для Websocket требуется только одно HTTP-рукопожатие, поэтому весь процесс связи устанавливается в одном соединении/состоянии, что позволяет избежать негосударственной природы HTTP, и сервер всегда будет знать вашу информацию, пока вы не закроете запрос, который решается оператором. должен неоднократно анализировать протокол HTTP и проверять идентификационную информацию.
При этом заказчик активно запрашивает, конвертирует на сервер (push) и отправляет, когда есть информация (разумеется, клиент все равно активно ждет отправки информации...), а когда ее нет информация, она передается оператору (Nginx), не занимая собственной скорости.Просто медленное обслуживание клиентов (Handler)
———————
至于怎么在不支持Websocket的客户端上使用Websocket。 .答案是: 不能
Но можно сказать вышеlong poll
а такжеajax 轮询
для имитации подобного эффекта