WebSocket的原理是什么

WebSocket的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

概念和原理

WebSocket协议和HTTP协议一样,都是在ISO七层模型的最顶层——应用层。WebSocket允许服务器端主动向客户端推送数据。在WebSocket协议中,客户端浏览器和服务器只需要完成一次握手就可以创建持久性的连接,并在浏览器和服务器之间进行双向的数据传输——全双工通讯。

HTTP和WebSocket连接生命周期对比图:

WebSocket的原理是什么

WebSocket协议是通过HTTP协议来建立传输层TCP连接的

web Socket请求头字段:

通过Connection:upgrade和upgrade:websocket字段把http协议升级成websocket协议,所以在请求头中的Connection和Upgrade表示客户端发起的是WebSocket请求;

同时请求头中还有Sec-WebSocket-Version字段表示客户端所使用的协议版本号,服务器会确认是否支持该版本号,如果支持了,服务端的响应就没有这个字段,如果不支持,响应的字段中就会有这个字段,对应的是服务端支持的版本号;

Sec-WebSocket-Key是一个Base64编码值,由浏览器随机生成,用于升级request,服务端拿到这个编码值会把http协议升级成websocket协议

Sec-WebSocket-Extensions表示客户端想表达的协议级的扩展;

Web Socket响应头字段:

HTTP/1.1 101 Switching procotols是一个切换协议,WebSocket协议通过HTTP协议来建立传输层的TCP连接;

Connection和Upgrade,和请求字段一样;

Sec-WebSocket-Accept: 表示服务器接受了客户端的请求,由Sec-Websocket-Key计算得来的,**计算方式:**将请求头中的Sec-WebSocket-Key和258EAFA5-E941-47DA-95CA-C5AB0DC85B11连接,然后进行SHA-1取哈希值,会得到一个20位的结果,然后再把这个结果用base64编码转换;

优点和缺点

优点:

支持双向通讯,实时性更强;

数据格式更轻量,性能开销小,通讯高效;因为http协议每次都要携带完整的头部,但是websocket在连接建立之后,从服务端到客户端只需要携带2-10个字节的头部,而从客户端到服务端也只需要2-10个字节的头部以及4个字节的掩码;

支持扩展,用户可以扩展协议或者实现自定义好的子协议(比如支持自定义压缩算法等),美剧硅谷中的pied piper的压缩算法应用于直播技术

缺点:

少部分浏览器可能不支持,浏览器支持的程度与方式有区别;

长连接对后端业务的代码稳定性要求更高,后端推送功能相对复杂;

成熟的 HTTP生态下有大量的组件可以复用,WebSocket较少;

应用场景:

即时聊天通讯,网站消息通知,

在线协同编辑,如腾讯文档;

多玩家在线游戏,视频弹幕,股票基金实时报价;

应用

业务场景:实现网站私信功能

方式一、使用AJAX轮询

WebSocket的原理是什么

分析这种方式:可以设置请求时间间隔特别短(如200ms),可以让用户基本感受不到延时,能够完成功能,但是这样做对网络、服务器的浪费都特别大,1. 大量的HTTP请求响应,每次都要通过TCP三次握手建立连接然后再返回;2。即便是没有消息,也要进行发送请求,后端Web服务器和WSGI服务器都要进行处理,如果用户量一大,这种方式的缺陷会非常明显。

<强>方式二,使用WebSocket建立连接

 WebSocket的原理是什么

分析这种方式:只需要建立一次连接即可,并且前端可以向后端推送,后端也可以向前端推送,并且是有消息了才会推送,没消息就不会推送,请求响应的头字节还小,优势非常明显。

<强>在django中应用这种技术

需要考虑的问题:

如何区别路由HTTP请求和WebSocket请求

如何兼容django的认证系统(因为私信肯定是要登录的,所以需要认证)

如果接收和推送WebSocket消息

如何通过ORM保存和获取数据

解决办法:使用django-channels或则dwebsocket

<强> django-channels

是什么:django-channels是一个位django提供异步扩展的库,通常主要用来提供WebSocket支持和后台任务,因为django是一个同步框架。

WebSocket的原理是什么