什么是WebSocket?
它是一种让服务器与浏览器之间能实现可以实时双向聊天的技术。
像网页的Http模式,是网页请求去访问服务器,服务器回应,不断请求,不断回应,这种叫轮询。如果要等待一个消息,就要不断去请求,但是大部分请求得到的回应都是无消息,只有有新消息,才会拿到消息,这种的话,就很浪费资源,哪怕最后拿到消息,可能也要消耗时间,比如1秒或几秒。
于是就发明了WebSocket,核心思路就是,让浏览器和服务器从一开始就约定好,不再一问一答,升级成持续通话,它是在一次普通的http请求里完成了身份转换,客户端先发一条特殊的Http请求,请求头里带两个关键的字段,一个是Upgrade:websocket,意思是,请求升级到WebSocket协议,另一个是Connection:Upgrade,意思是,服务器如果支持webSocket,就会返回101状态码,表示,切换协议成功。从这刻起,这条TCP连接不再是Http连接了,它变成了一条双工的WebSocket连接,就像两个人拿着对讲机通话换成了直接用电话通话,两边都可以同时听同事说,不需要每次说话都拨号,连接建立后,数据传输的格式也变了,http的消息是纯文本头上加上可选的体,而WebSocket,传输的是一个个帧,这些帧不是让你肉眼看到的,而是高度结构化的二进制或文本数据包,每个帧前面只有几个字节的控制信息,后面紧跟着数据本身,开销极小,这根http请求动不动就带上一大堆Cookie、User-Agent等头部信息状态完全不同,低了几个数量级的数据开销,让WebSocket在需要高频小数据量传输的场景优势巨大,比如在线协作编辑文档,可能每敲一个字都要同步给其他人,如果用Http,一个字就要附带几百字节的头部信息,而WebSocket可能就多十几个字节,这种技术解决了什么问题?
它解决的是一个实时性的、服务器主动推送的痛点,在没有WebSocket的年代,为了让网页看起来像实时的,开发者绞尽脑汁地想各种方案,比如短轮询,隔几秒问一次,稍微进步一点的是长轮询,就是发一个请求过去,服务器不立即回应,而是等到真有消息的时候才回应,响应完连接关闭,客户端马上又发起下一个长轮询,这样做的缺点就是,会有一小段的消息空白期,而且服务器要维持大量挂起的连接,开销极大,WebSocket,直接把这些优化,它本来就允许服务器在任何时候主动给客户端发消息,比如一个股票行情页面,价格变动是服务器先知道,服务器可以先把最新价格推给所有在线的浏览器,不需要等浏览器来问。
WebSocket应用:聊天软件、多人游戏也是,每个玩家的移动、射击、释放技能都要毫秒级同步给其他玩家屏幕上,还有协同文档,还有刷视频看到某某正在输入这种状态提示,网页上送外卖的小图标、滴滴司机在移动的位置小图标;
它的缺点就是:它要求服务器和客户端维持长连接,这就意味着服务器要同时管理成千上万个活动链接,甚至上百万的活动连接,这对服务器的架构设计提出了挑战,不能像处理短连接一样,用完就扔掉,于是出现了专门对这种长连接优化服务器框架和编程模型,比如Node.js的Socket.IO库,或者Go语言的Gorilla WebSocket,帮开发者屏蔽了很多底层细节,可以像写普通事件监听一样处理消息,比如,WebSocket建立连接那次握手,是基于Http,所以它也能复用Http的80或者443端口,不容易被防火墙拦住,这也是它能广泛普及的原因。
安全性方面,websocket也有加密版本,叫wss://,本质上就是websocket的overTLS,和Https一样,数据在传输过程中是加密的。

浙公网安备 33010602011771号