原文: http://zhangxiao.org/2018/WebSocket/intro/
WebSocket是一种能在单个TCP链接
上进行全双工通信
的协议。php
在链接建立后
,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的状况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还须要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部
,此项开销显著减小了。html
因为协议是全双工的,因此服务器能够随时主动给客户端下发数据。相对于HTTP请求须要等待客户端发起请求服务端才能响应,延迟明显更少;即便是和Comet等相似的长轮询比较,其也能在短期内更屡次地传递数据。web
与HTTP不一样的是,Websocket须要先建立链接,这就使得其成为一种有状态的协议,以后通讯时能够省略部分状态信息。而HTTP请求可能须要在每一个请求都携带状态信息(如身份认证等)。segmentfault
Websocket定义了二进制帧,相对HTTP,能够更轻松地处理二进制内容。跨域
Websocket定义了扩展,用户能够扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。浏览器
相对于HTTP压缩,Websocket在适当的扩展支持下,能够沿用以前内容的上下文,在传递相似的数据时,能够显著地提升压缩率。服务器
不一样于HTTP,WebSocket并无同源限制,客户端能够与任意服务器通讯websocket
默认端口同HTTP/HTTPs,也是80
和443
socket
握手阶段采用 HTTP 协议,所以握手时不容易屏蔽,能经过各类 HTTP 代理服务器。性能
对比 | HTTP | WebSocket |
---|---|---|
协议标识 | http/https | ws/wss |
端口 | 80/443 | 80/443 |
普通80端口:ws://example.com:80/some/path
加密443端口:wss://example.com:80/some/path
Java/Python/Node/Php/.NET,好像都是支持的(表示心虚,我只是百度了一圈,都能找到现成解决方案)
维基百科 WebSocket
WebSocket 教程(阮一峰)
WebSocket资料总结
websocket与comet的性能对比
浅谈HTTP长链接
WEB通信技术之短轮询、长轮询(comet)、长链接(SSE)、WebSocket