WebSocket是什么原理?为什么可以实现持久连接?( 二 )


特别注意:
【WebSocket是什么原理?为什么可以实现持久连接?】关于webcket持久连接 。本质上是下层tcp连接的保持 。核心问题同样是如何保活 。需要考虑Nat失效(基站最突出 。一般有效期只有3分钟)或者其它网络原因导致大量半连接存在 。解决方案就是合理的心跳时间 。一般我设置为2分50秒的样子 。
其它
不论是否从事网络编程 。都应该花时间学习下TCP/IP协议簇方面的知识 。着重理解分层原理 。各层的功能和为上层提供了哪些功能 。就像这个问题 。如果不对TCP有所了解 。回答的内容就没多大意义了 。阅读一个你比较熟悉的语言的的一种协议(比如http)实现项目的源码 。帮助应该很大 。
和网络IO密切相关的就是线程 。要设计高可用的TCP服务器 。必须要熟悉多线程 。网络IO和多线程是我认为最重要的两个核心知识点 。
关于协议的设计 。你可以多学习其他优秀的基于TCP实现的应用层协议 。简单的就有Redis的通信协议 。里面有阻塞式的消费者队列 。那个就需要一条单独的tcp通道 。协议设计是很有意思的一件事情 。就是mysql和mongodb的通信协议我也不会放过 。去看看 。会给自己设计协议带来不少的参考价值 。
如果时间允许 。有标准的协议最好看看RFC文档 。现在Chrome的翻译已经很好了 。如果英文不太好 。问题也不大 。
关于TCP/IP相关的书籍
《计算机网络:自顶向下方法》和谢希仁的《计算机网络》都是不错的入门书籍 。
《TCP/IP详解》是经典 。虽然出版已久 。内容是没过时的 。
网络应用脱离不了操作系统 。所以可以再看看操作系统关于网络IO这一块的设计 。
实际开发更多和Socket以及多线程打交道 。Windows下面可以看看《Windows核心编程》 。
其它的就是开源项目:Nginx 。netty等大量优秀的项目都在等你 。
还是要感谢大家对我写的东西有那么一点感兴趣 。能对大家有所帮助就更好了 。
其他观点:
解释WebSocket为什么可以实现持久连接 。还是先介绍一些什么是WebSocket 。以及它产生的原因是什么 。
是什么WebSocket?
WebSocket是一个协议 。
协议就是王八的屁股——规定 。你可以不遵守 。但是别人都遵守你不遵守 。你就跟别人玩不到一块去 。
WebSocket协议在2008年诞生 。2011年成为了国际标准 。现在绝大部分浏览器都已经支持了 。

WebSocket是什么原理?为什么可以实现持久连接?

文章插图
产生的原因
其实原因是为了弥补HTTP协议的不足 。因为HTTP协议只能由客户端发起请求 。并且一个Request要对应一个Response(长链接也是如此) 。
举个例子:
我之前做过一个小项目 。只有一个页面 。展示的是各个分公司当天的业绩 。就是挣了多少钱 。后台服务是Java 。数据库是Mysql 。有一张汇总表 。内容大概是北京-100万 。上海-80万这样的 。
流程很简单 。HTML页面发起请求到Java 。Java访问数据库查询数据 。再返回给HTML展示 。但是Mysql中的汇总表的数据 。是不定期更新的 。可能10分钟 。可能20分钟 。
最简单的做法:HTML中用JS设置一个定时轮询(Polling) 。每隔几秒去发起一次请求 。获取最新的数据 。如果数据没有变化 。页面也保持变化;缺点很明显 。前端发起的很多请求都是无效的(因为数据没有变化) 。
WebSocket是什么原理?为什么可以实现持久连接?

文章插图
WebSocket的通信原理
而WebSocket 。是要在客户端和服务器之间 。建立一个通道 。建立一个【真的长链接】 。
WebSocket是要借助于HTTP 。完成一部分工作 。我在找到一个WebSocket在线测试的网站 。打开之后查看请求和响应(具体网站连接也看下面图片中的信息) 。
WebSocket是什么原理?为什么可以实现持久连接?

文章插图
可以看出来协议里面多了两行:
Upgrade: websocket
Connection: Upgrade
这个就是关键内容了 。通过请求告诉服务器:看清楚咯 。请求要用WebSocket协议 。
服务器会回答:好的 。那我就切换到WebSocket协议啦 。
WebSocket是什么原理?为什么可以实现持久连接?

文章插图
到了这时候 。HTTP完成它所有工作 。客户端和服务器已经建立好了一个通道 。下面就按照WebSocket协议进行了 。服务端也就可以主动推送信息给客户端(双向) 。并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接 。故此WebSocket也就实现了持久连接 。

推荐阅读