Цялата истина за WebSocket
Добре познатият HTTP протокол по своята същност е синхронен, тоест изграден върху модела „заявка-отговор“. WebSocket е сериозно разширение на HTTP, което ще позволи на приложения (включително игри) да поддържат многопотребителско взаимодействие в реално време. Благодарение на него няма да има клиент и сървър с фиксирани роли, но ще се появят два равнопоставени участници в обмена на данни. Всеки в същото време работи самостоятелно и когато е необходимо, изпраща данни на друг. Втората страна реагира при необходимост и само ако възникне такава необходимост.
WebSocket е пълнодуплексен двупосочен комуникационен протокол през TCP връзка, предназначен за обмен на съобщения между браузър и уеб сървър в реално време. Програмистите и преди са се опитвали да решат проблема с "равенството" между сървъра и клиента. Те експериментираха с двупосочна комуникация, използвайки XMLHttpRequest заявки. Но беше много бавно, тъй като всеки път трябваше да се създава нова TCP връзка за всяко съобщение. За разлика от XMLHttpRequest, WebSockets установява единична TCP връзка и потвърждава, че сървърът може да комуникира с WebSocket, като прави специални проверки, след което сървърът и клиентът могат да изпращат текстови съобщения през установената връзка, ако е необходимо, което води до по-бърза комуникация. Връзката се поддържа отворена през цялото време, но не изпраща допълнителни HTTP заглавки. В същото време няма ограничения за броя на връзките в уеб сокети.
World Wide Web Consortium (W3C) в момента стандартизира Web Sockets API, а Internet Engineering Task Force (IETF) е в процес на приемане на стандарт за Web Socket протокол. WebSocket се поддържа до известна степен в следните браузъри:
Как работи протоколът?
След като страницата на сайта реши, че иска да отвори WebSocket към сървъра, тя създава специален javascript обект. Всичко започва точно както при обикновена HTTP заявка. Браузърът се свързва чрез TCP към 80-ия порт на сървъра, но дава малко необичайна GET заявка и ако сървърът поддържа WebSocket, тогава отговаря. Ако браузърът е доволен от това, той просто оставя отворена TCP връзката. Това е всичко - връзката е установена, каналът за обмен на данни е готов. Веднага щом едната страна иска да прехвърли някаква информация на другата, тя изпраща кадър с данни със следната форма: 0x00, , 0xFF Тоест просто низ от текст - поредица от байтове, към която нулевият байт 0x00 е прикрепен отпред и 0xFF в края. Няма заглавки или метаданни. Какво точно да изпратите, разработчиците изцяло оставят на преценката на разработчиците на сайта: XML, JSON, обикновен текст.

С помощта на протокола WebSockets можете също да прехвърляте двоични данни, в смисъл на картина. Те използват различен кадър с данни като този: 0x80, , "Един или повече байта" е много труден начин за определяне на дължината на тялото на съобщението. За да не създават ограничения върху дължината на предаваното съобщение и в същото време да не губят байтове нерационално, разработчиците на протокола са използвали следния алгоритъм. Всеки байт в инструкциятадължината се разглежда на части: най-значимият бит показва дали този байт е последният (0) или има други след него (1), а долните 7 бита съдържат действителните данни. Съответно, веднага щом се получи знакът на двоичния кадър с данни 0x80, следващият байт се взема и се оставя настрана в отделна „касичка“, след това към следващия байт – ако има зададен старши бит, тогава той също се прехвърля в „касичката“. И така нататък, докато не срещнете байт със старши бит - 0. Това означава, че този байт е последният в индикатора за дължина. Сгъва се и в касичка. Сега най-значимите битове се премахват от всички байтове в "касичката", а остатъкът се комбинира в едно цяло. Това ще бъде дължината на тялото на съобщението. Ефективността на този протокол обикновено е 95%. Разликата ще бъде особено забележима, ако правите чест обмен на малки блокове от данни. Скоростта на обработка също клони към скоростта на чист TCP сокет - в крайна сметка всичко вече е готово - връзката е отворена - просто изпращайте байтове.
Нюанси на протокола
Протоколът има своите плюсове и минуси. А първото е много повече.
Скоростта и ефективността на предаването осигурява малък размер на предаваните данни, които понякога дори ще се поберат в един TCP пакет - тук, разбира се, всичко зависи от логиката на разработчика. В същото време имайте предвид, че връзката вече е готова - няма нужда да губите време и трафик за нейното установяване.
Стандартизация, която ще премахне необходимостта от цял набор от технологии: Comet и всичко, което е навито върху него (Bayuex, LongPolling, MultiPart и т.н.), работещи върху хакове, а не по стандарти.
Живот на канала - WebSockets нямат ограничение за живота в неактивно състояние. Това означава, че вече не е необходимо връзката да се опреснява периодично, като няма право да затваря прокситосървър. Това означава, че връзката може да виси в неактивна форма и да не изисква ресурси. Вярно е, че TCP сокетите ще бъдат задръстени на сървъра. За да направите това, достатъчно е да използвате добър мултиплексор и нормален сървър може лесно да изтегли до един милион отворени връзки.
Сложни уеб приложения - HTTP има ограничение за броя на едновременните отворени сесии към един сървър. Следователно, за много различни асинхронни блокове на страницата, трябва да направите не само сървър, но и клиентски мултиплексор. Това ограничение не се отнася за протокола WebSocket. Отваря се толкова, колкото е необходимо.
Междудомейн приложения - ограниченията в протокола се въвеждат не на принципа "от-същия-произход", а от "разрешения-произход" и се определят не на клиента, а на сървъра.
Още една функция: UTF-8 е избрано като единственото разрешено кодиране. Сега за минусите.
Websockets също има проблеми с антивирусите. Така че в един от проектите, прехвърлени към този протокол, се оказа, че всички потребители, които са използвали антивирусна програма Avast в конфигурацията по подразбиране, не могат да работят нормално с приложението. По подразбиране Avast има така наречения режим "Web Screen", който реши, че протоколът Websocket е лош и тихомълком го "отряза".