Websocket协议详解

前言

本文主要介绍Websocket是什么以及其协议内容。

WebSocket 协议实现在受控环境中运行不受信任代码的一个客户端到一个从该代码已经选择加入通信的远程主机之间的全双工通信。该协议包括一个打开阶段握手规定以及通信时基本消息帧的定义。其基于TCP之上。此技术的目标是为基于浏览器的应用程序提供一种机制,这些应用程序需要与服务器进行双向通信,而不依赖于打开多个HTTP连接(例如,使用XMLHttpRequest或和长轮询)。

Websocket能做什么

过去,创建需要在客户端和服务之间双向通信(例如,即时消息和游戏应用)的web应用,需要通过HTTP来轮询服务器来获取更新然后如果是推送消息则发送另一个请求(现在很多应用也依旧采用这种方式)。这样做会存在一些问题。

服务器端被迫提供两类接口,一类提供给客户端轮询新消息,一类提供给客户端推送消息给服务器端。

HTTP协议有较多的额外费用(overhead),每次发送消息都会有一个HTTP header信息,而且如果不用Keep-Alive每次还都要握手。

客户端的脚本比如JS可能还需要跟踪整个过程,也就是说我发送一个消息后,我可能需要跟踪这个消息的返回。

一个简单的办法是使用单个TCP连接双向传输。这是为什么提供WebSocket 协议。与WebSocket API结合WSAPI,它提供了一个HTTP轮询的替代来进行从web 页面到远程服务器的双向通信。

协议内容

Websocket协议主要包括两个部分,一个是握手的规则,另一个是数据传输的方式及载体格式。,可以开发者工具看看Network里面的内容。

一旦客户端和服务器握手成功后,数据传输部分就开始了,这是一个全双工的通信。客户端与服务器之间互相传输数据的的基本单位根据规格说明书里我们称为"Messages"。在实际网络中,这些Message由一个或多个Frames组成,Websocket的Message里的frame和计算机网络里说的的frame并不是对应关系,后面会详细介绍Frame的结构。

握手

打开阶段握手目的是兼容基于HTTP的服务器软件和中间件,以便单个端口可以用于与服务器交流的HTTP客户端和与服务器交流的WebSocket客户端。所以WebSocket客户端的握手是一个HTTP Upgrade请求(Http status code 101):

Charles中请求信息请求头(上)和响应头(下)

这里关于字段就讲几个字段以及它们的考量

Origin(请求头)

Origin用来指明请求的来源,Origin头部主要用于保护Websocket服务器免受非授权的跨域脚本调用Websocket API的请求。也就是不想没被授权的跨域访问与服务器建立连接,服务器可以通过这个字段来判断来源的域并有选择的拒绝。

Sec-WebSocket-Key(请求头)以及Sec-WebSocket-Accept(响应头)

另一方面,Websocket协议需要保证客户端发起的Websocket连接请求只会被能理解Websocket协议的服务器所识别。

Really, as you are mentioned, if you are aware of websockets (that is what to be checked), you could pretend to be a websocket server by sending correct response. But then, if you will not act correctly (e.g. form frames correctly), it will be considered as a protocol violation. Actually, you can write a websocket server that is incorrect, but there will be not much use in it.

And another purpose is to prevent clients accidentally requesting websockets upgrade not expecting it (say, by adding corresponding headers manually and then expecting smth else). Sec-WebSocket-Key and other related headers are prohibited to be set using setRequestHeader method in browsers.

相关推荐
虎头金猫21 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
只睡四小时1 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
wuyk5551 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
XUEYUAN52121 天前
ASN 自治系统号风控:平台如何通过 IP 所属自治域批量识别代理流量
python·网络协议·http·网络安全·socks5
QYRdata1 天前
年均增速24.2%!机器人数据湖未来六年增长动能强劲
网络·机器人·服务发现
CHENKONG_CK1 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip
chshang19921 天前
工业路由器是什么?浅谈5G工业网络中的IR602
网络·物联网·5g·智能路由器
萧瑟余晖1 天前
Netty 核心组件与 Reactor 模型详解
网络·架构
ITxiaobing20231 天前
IP 定位服务选型指南:从准确率到工程落地的技术考察
linux·服务器·网络
wuyk5551 天前
【Socket 进阶之路】第 9 章 Linux 网络服务量产稳定性优化|心跳保活、TIME_WAIT、SO_LINGER、内存池、断线重连、完整异常防护框架
linux·服务器·开发语言·网络·物联网