websocket介绍与原理
websocket protocol 是html5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助http请求完成。
——百度百科
目的:即时通讯,替代轮询
网站上的即时通讯是很常见的,比如网页的qq,聊天系统等。按照以往的技术能力通常是采用轮询、comet技术解决。
http协议是非持久化的,单向的网络协议,在建立连接后只允许浏览器向服务器发出请求后,服务器才能返回相应的数据。当需要即时通讯时,通过轮询在特定的时间间隔(如1秒),由浏览器向服务器发送request请求,然后将最新的数据返回给浏览器。这样的方法最明显的缺点就是需要不断的发送请求,而且通常http request的header是非常长的,为了传输一个很小的数据 需要付出巨大的代价,是很不合算的,占用了很多的宽带。
缺点:会导致过多不必要的请求,浪费流量和服务器资源,每一次请求、应答,都浪费了一定流量在相同的头部信息上
然而websocket的出现可以弥补这一缺点。在websocket中,只需要服务器和浏览器通过http协议进行一个握手的动作,然后单独建立一条tcp的通信通道进行数据的传送。
原理
websocket同http一样也是应用层的协议,但是它是一种双向通信协议,是建立在tcp之上的。
连接过程 —— 握手过程 1. 浏览器、服务器建立tcp连接,三次握手。这是通信的基础,传输控制层,若失败后续都不执行。 2. tcp连接成功后,浏览器通过http协议向服务器传送websocket支持的版本号等信息。(开始前的http握手) 3. 服务器收到客户端的握手请求后,同样采用http协议回馈数据。 4. 当收到了连接成功的消息后,通过tcp通道进行传输通信。 websocket与http的关系 相同点 1. 都是一样基于tcp的,都是可靠性传输协议。 2. 都是应用层协议。 不同点 1. websocket是双向通信协议,模拟socket协议,可以双向发送或接受信息。http是单向的。 2. websocket是需要握手进行建立连接的。 联系
websocket在建立握手时,数据是通过http传输的。但是建立之后,在真正传输时候是不需要http协议的。
websocket与socket的关系
socket其实并不是一个协议,而是为了方便使用tcp或udp而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。
socket是应用层与tcp/ip协议族通信的中间软件抽象层,它是一组接口。在设计模式中,socket其实就是一个门面模式,它把复杂的tcp/ip协议族隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议。
当两台主机通信时,必须通过socket连接,socket则利用tcp/ip协议建立tcp连接。tcp连接则更依靠于底层的ip协议,ip协议的连接则依赖于链路层等更低层次。
websocket则是一个典型的应用层协议
区别
socket是传输控制层协议,websocket是应用层协议。
html5与websocket的关系
websocket api 是 html5 标准的一部分, 但这并不代表 websocket 一定要用在 html 中,或者只能在基于浏览器的应用程序中使用。
实际上,许多语言、框架和服务器都提供了 websocket 支持,例如:
* 基于 c 的 libwebsocket.org * 基于 node.js 的 socket.io * 基于 python 的 ws4py * 基于 c 的 websocket * apache 对 websocket 的支持: apache module mod_proxy_wstunnel * nginx 对 websockets 的支持: nginx as a websockets proxy 、 nginx announces support for websocket protocol 、websocket proxying * lighttpd 对 websocket 的支持:mod_websocket
websocket 机制
以下简要介绍一下 websocket 的原理及运行机制。
websocket 是 html5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 tcp 之上,同 http 一样通过 tcp 来传输数据,但是它和 http 最大不同是:
websocket 是一种双向通信协议,在建立连接后,websocket 服务器和 browser/client agent 都能主动的向对方发送或接收数据,就像 socket 一样; websocket 需要类似 tcp 的客户端和服务器端通过握手连接,连接成功后才能相互通信。
非 websocket 模式传统 http 客户端与服务器的交互如下图所示:
图 1. 传统 http 请求响应客户端服务器交互图
使用 websocket 模式客户端与服务器的交互如下图:
图 2.websocket 请求响应客户端服务器交互图
上图对比可以看出,相对于传统 http 每次请求-应答都需要客户端与服务端建立连接的模式,websocket 是类似 socket 的 tcp 长连接的通讯模式,一旦 websocket 连接建立后,后续数据都以帧序列的形式传输。在客户端断开 websocket 连接或 server 端断掉连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。
我们再通过客户端和服务端交互的报文看一下 websocket 通讯与传统 http 的不同:
在客户端,new websocket 实例化一个新的 websocket 客户端对象,连接类似 ws://yourdomain:port/path 的服务端 websocket url,websocket 客户端对象会自动解析并识别为 websocket 请求,从而连接服务端端口,执行双方握手过程,客户端发送数据格式类似:
清单 1.websocket 客户端连接报文
get /webfin/websocket/ http/1.1 host: localhost upgrade: websocket connection: upgrade sec-websocket-key: xqbt3imnzjbyqrinxeflkg== origin: http://localhost:8080 sec-websocket-version: 13
可以看到,客户端发起的 websocket 连接报文类似传统 http 报文,”upgrade:websocket”参数值表明这是 websocket 类型请求,“sec-websocket-key”是 websocket 客户端发送的一个 base64 编码的密文,要求服务端必须返回一个对应加密的“sec-websocket-accept”应答,否则客户端会抛出“error during websocket handshake”错误,并关闭连接。
服务端收到报文后返回的数据格式类似:
清单 2.websocket 服务端响应报文
http/1.1 101 switching protocols upgrade: websocket connection: upgrade sec-websocket-accept: k7djldlooiwig/mopvwfb3y3fe8=
“sec-websocket-accept”的值是服务端采用与客户端一致的密钥计算出来后返回客户端的,“http/1.1 101 switching protocols”表示服务端接受 websocket 协议的客户端连接,经过这样的请求-响应处理后,客户端服务端的 websocket 连接握手成功, 后续就可以进行 tcp 通讯了。
在开发方面,websocket api 也十分简单,我们只需要实例化 websocket,创建连接,然后服务端和客户端就可以相互发送和响应消息,在下文 websocket 实现及案例分析部分,可以看到详细的 websocket api 及代码实现。
websocket 实现
如上文所述,websocket 的实现分为客户端和服务端两部分,客户端(通常为浏览器)发出 websocket 连接请求,服务端响应,实现类似 tcp 握手的动作,从而在浏览器客户端和 websocket 服务端之间形成一条 http 长连接快速通道。两者之间后续进行直接的数据互相传送,不再需要发起连接和相应。
ecs云服务器建站教程app开发云服务器租赁费用云服务器怎样挂机游戏啊数据库怎么进入这里进不去了天津服务器代理公司云主机多少钱网站用云服务器配置请问怎么提交需要怎么操作阿里云5000g服务器价格