看完让你彻底搞懂Websocket原理,websocket和http的区别( 二 )


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的通信协议我也不会放过 , 去看看 , 会给自己设计协议带来不少的参考价值 。
如果时间允许 , 有标准的协议最好看看RFC文档 , 现在Chrome的翻译已经很好了 , 如果英文不太好 , 问题也不大 。关于TCP/IP相关的书籍《计算机网络:自顶向下方法》和谢希仁的《计算机网络》都是不错的入门书籍 。《TCP/IP详解》是经典 , 虽然出版已久 , 内容是没过时的 。网络应用脱离不了操作系统 , 所以可以再看看操作系统关于网络IO这一块的设计 。
如果是先建立TCP , 再进行的HTTP通信 , 那为何会说TCP是在HTTP报文外面包了一层TCP的信息?

看完让你彻底搞懂Websocket原理,websocket和http的区别


这得从网络的OSI七层协议说起 。TCP协议属于传输层 , 工作在第4层 。而HTTP协议属于应用层 , 工作在第7层 。所有网络传输最后都必须有第1层物理层来完成 , 也就是0101的物理电信号 。上层数据都是被层层封装 , 最后再转化为物理信号传输的 。1、OSI七层网络模型的来源早在互联网起源的时代 , 网络通讯并不是统一标准的 , 而是各家有各家的通讯方法 。

推荐阅读