WebSocket协议是基于TCP的一种网络协议;WebSocket的诞生是因为http不能长时间实现双工通信是通过,需要多个http链接来实现再这样就浪费了资源性能也不好,为了解决这一问题创造了WebSocket;双工通信是指同一时刻客户端和服务器端同时发送信息,服务器可以主动推送消息,避免了HTTP轮询;轮询是程序不断滴去查询服务器是否有新的内容,有更新立即推送给客户端。其他功能还有链接协商和同源策略、与既有的HTTP基础设施互操作、基于消息的通信和高效消息分帧、子协议协商及可扩展性;形成了浏览器中最灵活的传输机制。
但是websocket并不能取代http、xhr、sse,为了追求最佳性能利用这些机制的长处,形成了websocket的多标准。
websocket包含了两个高层级组件;http握手和二进制消息分帧机制;http用于协商链接参数,二进制消息分帧机制用于支持低开销的基于消息的文本和二进制数据传输。websocket是一个独立的协议,可在浏览器外实现通信。
websocket二进制分帧;帧是最小的通信单位,包含可变长度的帧首部和净荷部分,净荷又包含不完整或者完整的消息;消息是一系列帧与应用消息对等;websocket使用了自定义的二进制分帧,把每个消息切分成一个或多个帧,发送到目的地后在组装起来,等接收完消息后在通知接收端。是否把消息分成帧有服务器和客户端实现决定。每一帧的第一位表示当前帧是不是消息的最后一帧;一条消息有可能只对应一帧。操作码便是被传输帧的类型,传输数据时是文本还是二进制,检查链接有效性时是关闭还是呼叫亦或回应;掩码位表示净荷是否有掩码;净荷长度由可变长度字段表示,例如0~125是指净荷长度,如127则是8字节表示的64位无符号整数是这一帧的长度;掩码是32位用于给净荷加掩护;净荷是应用数据也可以是扩展性的其他数据。websocket通信是通过帧交换实现的,帧将净荷视为不透明的数据块。所以websocket是容易堵塞的,且不支持多路复用。为了实现不阻塞封装帧并加上信道ID这样websocket就可以减少阻塞;最终的解决阻塞办法是使用不同信道、多路并行发送消息。
websocket还允许对协议进行扩展;数据格式和websocket协议的语言通过新的操作码和数据字段扩展,这一强大特性允许客户端和服务器在基本的websocket分帧之上实现更多功能不需要应用代码介入或协助。websocket有两项扩展多路复用和压缩,
创建对象(varws =newWebSocket(url,name);)→发送文本消息(ws.send(msg);)→接收消息ws.onmessage = (function(){...})();→
错误处理(ws.onerror = (function(){...})();)→关闭连接(ws.close();)
websocket支持绝大部分主流浏览器。