详细的HTTP2.0的东西,这里不展开了,详细参考官方文档 。HTTP相关知识推荐《HTTP权威指南》以及相关的RFC文档,尽量少去看博客上面支离破碎的小知识,体系化的认知结构对你帮助更大 。WebSocketWebSocket的出现,就是为了解决http协议不支持双向通信的缺口 。所以WebSocket的握手协议就是使用的HTTP消息来Upgrade 。
现代的Web场景,服务端推送的需求非常大,这个发展过程中使用的Ajax轮询,Comet等都只是临时解决方案,从设计上看,只为满足需求,一点都不优雅 。Html5规范将WebSocket纳入后,得到了现代几乎所有浏览器的支持,当然IE(10 才支持)仍然是一个巨坑,在乎用户覆盖面的产品依然要通过浏览器是否支持ws来做出降级处理(轮询、长连接) 。
websocket协议实现独占一条tcp通道,它负责从tcp流确定消息边界,解析出每个独立的消息包 。可进行全双工的双向通信 。题主所谓的WebSocket可以实现持久连接,只是的一个服务端WebSocket会话和对应的客户端WebSocket会话在使用一个固定的保持连接的TCP通信而已 。一般需要将服务端WebSocket会话和某位用户关联起来(客户单连接后,可以再单独发送凭证验证),实现给某个用户推送消息,只需根据关联找到对应的WebSocket会话调用发送API即可 。
应用使用单独实现websocket协议的服务\客户端组件,可以更加轻松地实现自定义协议:在websocket的二进制或者文本消息体内或者直接使用websocket的自协议定义机制封装自己定义的协议 。推荐大家如果有些需要自建IM服务器,推送服务器的场合尝试先用WebSocket来实现 。负载高(协议头消耗小),协议简洁,几乎所有客户端(减少了大量的工作)都有对应的开源项目可用,同时还是唯一可以在浏览器上用的双向通信协议(flash和silverlight等插件方式除外) 。
如果你要用websocket实现请求应答式的子协议,要点是你要设计唯一的请求标志,响应也将请求标志带回来,然后你就可以从客户端的请求队列中查找响应对应的请求将响应交给上层处理!特别注意:关于webcket持久连接,本质上是下层tcp连接的保持,核心问题同样是如何保活 。需要考虑Nat失效(基站最突出,一般有效期只有3分钟)或者其它网络原因导致大量半连接存在 。
解决方案就是合理的心跳时间,一般我设置为2分50秒的样子 。其它不论是否从事网络编程,都应该花时间学习下TCP/IP协议簇方面的知识,着重理解分层原理,各层的功能和为上层提供了哪些功能 。就像这个问题,如果不对TCP有所了解,回答的内容就没多大意义了 。阅读一个你比较熟悉的语言的的一种协议(比如http)实现项目的源码,帮助应该很大 。
和网络IO密切相关的就是线程,要设计高可用的TCP服务器,必须要熟悉多线程 。网络IO和多线程是我认为最重要的两个核心知识点 。关于协议的设计,你可以多学习其他优秀的基于TCP实现的应用层协议,简单的就有Redis的通信协议,里面有阻塞式的消费者队列,那个就需要一条单独的tcp通道 。协议设计是很有意思的一件事情,就是mysql和mongodb的通信协议我也不会放过,去看看,会给自己设计协议带来不少的参考价值 。
【理解websocket的原理,websocket原理】如果时间允许,有标准的协议最好看看RFC文档,现在Chrome的翻译已经很好了,如果英文不太好,问题也不大 。关于TCP/IP相关的书籍《计算机网络:自顶向下方法》和谢希仁的《计算机网络》都是不错的入门书籍 。《TCP/IP详解》是经典,虽然出版已久,内容是没过时的 。网络应用脱离不了操作系统,所以可以再看看操作系统关于网络IO这一块的设计 。
- 宝宝走路总是小跑,狗为什么总是小跑走路
- 28个神奇的机械工具,机械软件
- 50L水的怎么样,空调扇好用吗
- 只有T2能拍出她的美
- T1升级,通话界面又变成黑色的了
- 这个搜索悬浮窗口下方的搜索类别不可以自己自由搭配的
- 论坛里的贴子怎么被删除了?
- 今天用t2拍照,什么情况?
- 【bug】启动器bug
- 中国房价怎么了,中国的房价到底高不高呢
