====== web-socket ====== В отличии от сокетов транспортного уровня, которые являются интерфейсом, через которые протоколы прикладного уровня обращаются к сервисам транспортного уровня, web сокет это протокол, который описывает правила взаимодействия между разными хостами на прикладном уровне. Web сокеты работают через [[:glossary:net:protocols:http|HTTP]]. Зачем тогда нужен такой протокол "обёртка"? HTTP работает по принципу "запрос - ответ", таким образом сервер не может ничего отправить клиенту, пока он не запросит этого. Web сокеты устанавливают постоянное соединение, по которому оба участника соединения могут в любой момент отправлять данные. Web socket имеет специальный префикс в URL - ''%%ws://%%'' или ''%%wss://%%'' (если совместно в SSL TLS) Работа протокола стоится из двух частей: установка соединения и передача данных. ==== Установление соединения ==== 1) Клиент отправляет серверу HTTP GET запрос с опцией ''Upgrade'', в которой указывает протокол, на который нужно перейти. Так же в заголове указывается случайно сгенерированный ключ web сокета - 16 байт. Ключ предоставляется в кодировке ''base 64''. {{:glossary:net:protocols:web_socket1.png?500}} 2) Сервер подтверждает установление соединения, посылая HTTP ответ. Код 101 означает смену протокола. В заголовке `Upgrade`, также указывается протокол на который происходит переключение. {{:glossary:net:protocols:web_socket2.png?500}} После этого между клиентом и сервером устанавливается прямое TCP соединение по котором данные передаются уже без использования протокола HTTP. ==== Передача данных ==== Web socket поддерживает фрагментацию кадров. В web сокетах есть кадры трех типов: * кадры, которые передают текстовую информацию представленную в кодировке utf-8; * кадры, которые передают данные в двоичном виде; * управляющие кадре которые используются для поддержания или для закрытия соединения.