中年|Web端即时通讯实践干货:如何让WebSocket断网重连更快速?


本文作者网易智慧企业web前端开发工程师马莹莹 。 为了提升内容质量 , 收录时有修订和改动 。
1、引言在一个完善的即时通讯IM应用中 , WebSocket是极其关键的一环 , 它为基于Web的即时通讯应用提供了一种全双工的通信机制 。 但为了提升IM等实际应用场景下的消息即时性和可靠性 , 我们需要克服WebSocket及其底层依赖的TCP连接对于复杂网络情况下的不稳定性 , 即时通讯的开发者们通常都需要为其设计一套完整的连接保活、验活以及断片网重连方案 。
就断网重连而言 , 其重连响应速度将严重影响了上层应用的“即时性”和用户体验 。 试想打开网络一分钟后 , 微信的网络不能即时感知到socket连接的恢复 , 无法即时收发聊天消息的话 , 是不是很崩溃?
因此 , 如何在复杂网络场景下 , 更即时快速地感知网络变动 , 并快速恢复WebSocket的可用性 , 就变得尤为重要 。 本文将基于笔者的开发实践 , 分享WebSocket在不同状态下、不同的网络状态下 , 应该如何实现快速断网重连 。
* 阅读对象:本文适合有过IM底层网络实际开发经验 , 或者对底层网络实现有较深了解的开发者阅读 。 如果对底层网络了解甚少 , 建议跳过本文 , 直接阅读网络本文末尾附录部分的基础后再回头来看 。

* 内容点评:本文内容没有高大上 , 但比较干货 , 实用性较高 , 内容也很通俗 , 建议可详细阅读 。 文中虽讲的是WebSocket , 但思想可以延伸应用到基于TCP协议的同类技术中 。
本文已同步发布于“即时通讯技术圈”公众号 。
2、预备知识本文中将要分享的内容是基于实践总结 , 如果你对Web端的即时通讯知识还一头雾水 , 务必先读:《新手入门贴:史上最全Web端即时通讯技术原理详解》、《Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE》 。
限于篇幅 , 本文不会深究WebSocket技术细节 , 如有兴趣请系统学习:
《新手快速入门:WebSocket简明教程》《WebSocket详解(一):初步认识WebSocket技术》《WebSocket详解(二):技术原理、代码演示和应用案例》《WebSocket详解(三):深入WebSocket通信协议细节》《WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)》《WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)》《WebSocket详解(六):刨根问底WebSocket与Socket的关系》3、快速了解WebSocket
Websocket诞生于2008年 , 在2011年成为国际标准 , 现在所有的浏览器都已支持(详见《新手快速入门:WebSocket简明教程》) 。 它是一种全新的应用层协议 , 是专门为web客户端和服务端设计的真正的全双工通信协议 , 可以类比HTTP协议来了解websocket协议 。
中年|Web端即时通讯实践干货:如何让WebSocket断网重连更快速?
本文插图

(图片引用自《WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)》)
它们的不同点:
1)HTTP的协议标识符是http , WebSocket的是ws;
2)HTTP请求只能由客户端发起 , 服务器无法主动向客户端推送消息 , 而WebSocket可以;
3)HTTP请求有同源限制 , 不同源之间通信需要跨域 , 而WebSocket没有同源限制 。
它们的相同点:
1)都是应用层的通信协议;
2)默认端口一样 , 都是80或443;

3)都可以用于浏览器和服务器间的通信;
4)都基于TCP协议 。
两者和TCP的关系图:
中年|Web端即时通讯实践干货:如何让WebSocket断网重连更快速?
本文插图

(图片引用自《新手快速入门:WebSocket简明教程》)
有关Http和WebSocket的关系 , 可以详读:
《WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)》《WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)》有关WebSocket和Socket的关系 , 可以详读:《WebSocket详解(六):刨根问底WebSocket与Socket的关系》.


推荐阅读