WebSocket协议的由来以及与Http协议的异同

版权声明:转载必须注明本文转自郭子轩的博客 https://blog.csdn.net/gpf1320253667/article/details/87895582

websocket要解决的问题

WebSocket主要被用来解决客户端发起多个http请求到服务器资源浏览器必须要经过长时间的轮询问题,即就是不使用轮询的方式,而是服务器端主动推数据的方式,但是该种方式需要依赖我们今天要讲的websocket协议来完成。
WebSocket其实是一种建立在Web基础上的一种简单模拟Socket的协议,其实我们平时所说的websocket本质其实指的就是webscoket协议,这是他的灵魂。

目前我们PC端使用的浏览器都已经支持http协议,为什么还要开发一种新的WebSocket协议呢?

我们知道HTTP协议是一种单向协议,即浏览器只能向服务器请求资源,服务器才能将数据传送给浏览器,而服务器不能主动向浏览器传递数据。分为长连接和短连接,http请求的每次连接都需要3次握手才能连接成功,然后才能进行数据传输,断开连接时需要经过4次挥手,每个request对应一个response;长连接则是相对于短连接而言的,需要通过心跳包机制来维持连接状态。

当初http协议设计成单向的也是有原因的,假设服务器能主动的推送数据给客户端浏览器,那客户端浏览器就太容易受到攻击,一些广告商也会主动的把一些广告信息在不经意间强行的传输给客户端,这不能不说是一个灾难。那么单向的http协议给现在的网站或Web应用程序开发带来了哪些问题呢?

让我们来看一个案例,现在假设我们想开发一个基于Web的应用程序去获取当前Web服务器的实时数据,例如股票的实时行情,火车票的剩余票数等等,这就需要客户端浏览器与WebServer端之间反复的进行http通信,浏览器不断的发送请求,也就是我们所说的请求轮询。

由于http数据包的头部数据量往往很大(通常有400多个字节),但是真正被服务器需要的数据却很少(有时只有10个字节左右),这样的数据包在网络上周期性的传输,对网络带宽而言难免是一种浪费。

要是在Browser能有一种新的网络协议,能支持客户端和服务器端的双向通信,而且协议的头部又不那么庞大就好了。WebSocket就是肩负这样一个使命登上舞台的。

websocket协议简介

WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如Chrome,Safrie,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome,从chrome12就已经开始支持,随着协议草案的不断变化,各个浏览器对协议的实现也在不停的更新。该协议还是草案,没有成为标准,不过成为标准应该只是时间问题了,从WebSocket草案的提出到现在已经有十几个版本了,目前对该协议支持最完善的浏览器应该是chrome,毕竟WebSocket协议草案也是Google发布的。

WebSocket协议是一种双向通信协议,它建立在TCP之上,同http一样通过TCP来传输数据,但是它和http最大的不同有两点:
1,WebSocket是一种双向通信协议,在建立连接后,WebSocket服务器和Browser/UA都能主动的向对方发送或接收数据,就像Socket一样,不同的是WebSocket是一种建立在Web基础上的一种简单模拟Socket的协议;
2,WebSocket需要通过握手连接,类似于TCP它也需要客户端和服务器端进行握手连接,连接成功后才能相互通信。

同http协议使用http://开头一样,WebSocket协议的URL使用ws://开头,另外安全的WebSocket协议使用wss://开头。
例如:ws://221.73.104.109:8282/
ws协议默认使用80端口,wss协议默认使用443端口。

websocket与TCP,HTTP的关系

WebSocket与http协议一样都是基于TCP的,所以他们都是可靠的协议,Web开发者调用的WebSocket的send函数在browser的实现中最终都是通过TCP的系统接口进行传输的。WebSocket和Http协议一样都属于应用层的协议,那么他们之间有没有什么关系呢?答案是肯定的,WebSocket在建立握手连接时,数据是通过http协议传输的,并且也只是用到http协议一些简单的字段而已。但是在建立连接之后,真正的数据传输阶段是不需要http协议参与的。

websocket 服务器的建立

果要搭建一个简单的Web服务器,我们会有很多选择,市场上也有很多成熟的产品供我们应用,比如开源的Apache(以前经常使用的ToomCat),安装后只需简单的配置(或者默认配置)就可以工作了。

但是如果想搭建一个WebSocket服务器就没有那么轻松了,因为WebSocket是一种新的通信协议,目前还是草案,没有成为标准,市场上也没有成熟的WebSocket服务器或者Library实现WebSocket协议,我们就必须自己动手写代码去解析和组装WebSocket的数据包。要这样完成一个WebSocket服务器,估计所有的人都想放弃,幸好的是市场上有几款比较好的开源库供我们使用,比如PyWebSocket,WebSocket-Node, LibWebSockets等等,这些库文件已经实现了WebSocket数据包的封装和解析,我们可以调用这些接口,这在很大程度上减少了我们的工作量。

下面就简单介绍一下这些开源的库文件。

  1. PyWebSocket
    

PyWebSocket采用Python语言编写,可以很好的跨平台,扩展起来也比较简单,目前WebKit采用它搭建WebSocket服务器来做LayoutTest。

我们可以获取源码通过下面的命令

svn checkouthttp://pywebsocket.googlecode.com/svn/trunk/ pywebsocket-read-only

更多的详细信息可以从http://code.google.com/p/pywebsocket/获取。

  1. WebSocket-Node
    

WebSocket-Node采用JavaScript语言编写,这个库是建立在nodejs之上的,对于熟悉JavaScript的朋友可参考一下,另外Html5和Web应用程序受欢迎的程度越来越高,nodejs也正受到广泛的关注。

我们可以从下面的连接中获取源码

https://github.com/Worlize/Websocket-Node

  1. LibWebSockets
    

LibWebSockets采用C/C++语言编写,可定制化的力度更大,从TCP监听开始到封包的完成我们都可以参与编程。

我们可以从下面的命令获取源代码

git clone git://git.warmcat.com/libwebsockets

猜你喜欢

转载自blog.csdn.net/gpf1320253667/article/details/87895582
今日推荐