网络编程——2008年诞生的WebSocket网络通信协议

概念

WebSocket 是一种网络通信协议,它诞生于2008年,2011年成为国际标准。所有浏览器都已经支持WebSocket 协议。

WebSocket 协议 是随HTML5一起出来的新协议。WebSocket 协议实现了浏览器与服务器的全双工通信(full-duplex)。服务器可以主动推送消息给客户端。WebSocket 协议 握手需要借助HTTP请求完成。

http的缺陷

HTTP 协议有一个缺陷:通信只能由客户端发起。HTTP 协议做不到服务器主动向客户端推送信息。只能用时间间隔轮询服务器,轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。

Websocket作用

HTTP协议是被动的无状态协议,一个请求对一个响应,每次Request,需要建立TCP连接,客户端都需要重复带上用于鉴别客户端身份的信息到服务端,且报头冗余,且服务端无法主动推送消息给客户端。
为了解决 HTTP这种效率低、响应不及时、浪费通信带宽和服务端资源的问题,WebSocket诞生。
WebSocket一次请求持久连接的方式,解决了反复校验客户端身份的问题,服务端建立连接后可以主动推送消息给客户端,通信效率大大增加,节约了客户端、服务端和网络资源。

特点

WebSocket是一个持久化的协议,它是伴随HTTP5而出的协议,用来解决http不支持持久化连接的问题。
WebSocket和Socket是两个东西,Socket一个是网编编程的标准接口,而WebSocket是应用层通信协议。

WebSocket实现了浏览器/客户端(Browser/Client Agent )与服务器全双工通信,都能主动的向对方发送或接收数据,就像 Socket 一样,能更好的节省服务器资源和带宽,实现实时通讯。

WebSocket 需要类似 TCP 的客户端和服务器端通过握手连接,连接成功后才能相互通信。
WebSocket同 HTTP 一样,建立在 TCP 之上,通过 TCP 来传输数据。

WebSocket最大特点是:
服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是全双工通信,是属于服务器推送技术的一种。

诞生的目的是:实现 即时通讯,替代轮询。


其他特点包括:

(1)建立在 TCP 协议之上,服务器端的实现比较容易。

(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易被屏蔽,能通过各种 HTTP 代理服务器。

(3)数据格式比较轻量,性能开销小,通信高效。

(4)可以发送文本,也可以发送二进制数据。

(5)没有同源限制,客户端可以与任意服务器通信。

(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。ws://example.com:80/some/path

原理

WebSocket同HTTP一样也是应用层的协议,但是它是一种双向通信协议,是建立在TCP之上的。
WebSocket 类似 Socket 的 TCP 长连接的通讯模式,一旦 WebSocket 连接建立后,后续数据都以帧序列的形式传输。在客户端或Server 端断开 WebSocket 连接前,不需要客户端和服务端重新发起连接请求。在海量并发和 客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。

WebSocket在建立握手时,数据是通过HTTP传输的。在建立之后,不需要HTTP协议。

webSocket建立过程,WebSocket握手。

WebSocket的握手分为客户端请求和服务器端回应。


客户端先发起升级协议的请求

WebSocket握手:客户端发起升级协议的请求,采用标准的HTTP报文格式Get请求,在请求报文头中包含报头域:

Connection: Upgrade      表明连接需要升级
Upgrade: websocket        需要升级到 websocket协议
Sec-WebSocket-Version: 13          协议的版本为13

这是 WebSocket 的握手核心,告诉Nginx 等服务器:我发起的请求要用 WebSocket 协议,而不是 HTTP。

WebSocket数据传输:
WebSocket握手完成即升级完成,服务端将http协议切换成websocket数据协议;

WebSocket客户端的握手请求:

GET / HTTP/1.1               // 请求方式必须是GET请求,HTTP的协议必须是1.1
Connection:Upgrade           // 客户端请求升级连接
Upgrade:websocket            // 请求升级为websocket协议
Host: server.example.com     // 请求的主机
Origin: http://example.com   // 打开的socket的页面
Sec-Websocket-Key:s242sfdklf9fdsjklaghdgew== // 是一个 Base64 encode 的值,这个是浏览器随机生成的的字符串,与服务器响应的 Sec-WebSocket-Accept对应。客户端通过GUID来验证这个参数是不是一个有效请求
Sec-WebSocket-Version:13     // websocket使用的协议,RFC6455规定这个值必须是13
Sec-WebSocket-Protocol:chat, superchat     // 客户端可以指定应用程序支持的协议,服务器选择其中的一个做为双方通信的协议
Sec-webSocket-Extension:xxxx //客户端指定某些扩展协议,服务器选择其中一个

服务器响应升级协议

服务器端的回应如下:

HTTP/1.1 101 Switching Protocols // 服务器端同意客户端的握手请求
Connection: Upgrade              // 同意连接升级
Sec-WebSocket-Accept: fjsYeFDJKIsfds7sdf3fdssd=fs0= // 通过GUID计算出来的值
Sec-WebSocket-Version: 13                           // 对应websocket的版本
Upgrade: websocket                                  // 同意升级为websocket协议

服务端接收到升级协议的请求,如果服务端支持升级协议会做如下响应。

响应:
响应状态码 101 ,101 Switching Protocols  表示服务器支持切换协议,在发送完这个响应后,服务器将会切换到在Upgrade请求头中定义的那些协议。

如果服务器返回的响应头的状态码不是101,则客户端需要断开此连接,如果Sec-WebSocket-Protocol规定了其中的子协议则服务器必须响应其中一个,否则客户端必须断开这个连接。


升级协议完成以后,客户端和服务器就可以相互发送数据

WebSocket与HTTP的关系

WebSocket 是一个独立的基于 TCP 的协议,它与 HTTP 之间的关系就是它的握手请求可以作为一个升级请求(Upgrade request)经由 HTTP 服务器解释。
WebSocket是一个网络通讯协议, 只要理解数据帧格式和握手流程, 都可以完成基于websokect的即时通讯。

相同点:

都是一样基于TCP的,都是可靠性传输协议。都是应用层协议。


不同点:

WebSocket是需要握手进行建立连接的。
WebSocket是双向通信协议,模拟Socket协议,可以双向发送和接受信息。 HTTP是单向的。

WebSocket与Socket的关系

WebSocket是基于应用层的传输控制协议,而socket是基于传输层的传输控制协议。它们都是全双工的(可以同时接收和发送)。

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。
在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。当两台主机通信时,必须通过Socket连接,Socket则利用TCP/IP协议建立TCP连接。TCP连接则更依靠于底层的IP协议,IP协议的连接则依赖于链路层等更低层次。WebSocket则是一个典型的应用层协议。Socket是传输控制层协议,WebSocket是应用层协议。

HTML5与WebSocket的关系

虽然WebSocket是随着http5出的协议,但是WebSocket和http协议不是包含隶属关系。
WebSocket API 是 HTML5 标准的一部分, 但这并不代表 WebSocket 一定要用在 HTML 中,或者只能在基于浏览器的应用程序中使用。许多语言、框架和服务器都提供了 WebSocket 支持。


 

猜你喜欢

转载自blog.csdn.net/panjunnn/article/details/108741130