WebSocket原理和如何实现持久连接

HTTP协议

HTTP协议是基于TCP协议的应用层协议。HTTP协议的工作模式是request/response模式。在一次通信中,必须首先由client向server发起TCP连接,然后server接受该TCP连接请求,在TCP连接建立之后,首先由client发起HTTP request,然后server再发出HTTP response。

问题:Server不允许发送TCP请求。也就是说明Server没有收到request的情况下,没把发发送response给客户端。

解决方法:

1、多个HTTP请求不断发出。如Ajax轮询,浏览器每隔几秒就问下服务器是否还有新的消息。随之而来的问题占用服务器资源。

2、long poll 跟Ajax轮询差不多的。采取的是阻塞模式。没有收到服务器端的响应,就一直不返回Response给客户端。这点感觉好像个孩子。看到好玩的好吃的话,一定要到手,否则就哭着不走。哈哈… 带来的问题就是需要很高的并发。

WebSocket

WebSocket是Html5新的协议。借用了HTTP的协议来完成一部分握手。实现了浏览器与服务器全双工通信。HTTP协议建立在TCP协议之上的,当进行HTTP通信时候,Client和Server之间已经建立起了一个TCP连接,而任何TCP连接都是可以用来双向通信的,所以我们就可以利用这个现成的TCP连接来实现Client和Server的双向通信。

 

WebSocket连接如何建立

Step 1 建立TCP连接(这一步是一切的基础,和HTTP一样)

Step 2 通过TCP连接,发送HTTP Get 请求,其中包含关键的Upgrade: websocket header。

Step 3 Server收到HTTP请求后,会把Step 1的TCP连接的用户层协议从HTTP转变为WebSocket。至此,HTTP部分就退出舞台了,WebSocket开始接管一切。

借用Wikipedia,来看一个典型的Websocket握手

WebSocket理解和如何实现长连接

红色框中的就是WebSocket的核心了。告诉应用服务器我发起的请求是WebSocket。抓紧帮我处理掉。

Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //Base64 encode的值验证是否真的Websocket的

Sec-WebSocket-Protocol: chat, superchat  //用户定义的字符串,用来区分同URL下,不同的服务所需要的协议

Sec-WebSocket-Version: 13  //告诉服务器所使用的Websocket Draft(协议版本)

服务器返回如下,接受到请求, 成功建立Websocket。

成功建立Websocket
Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key。Sec-WebSocket-Protocol 则是表示最终使用的协议。

总结WebSocket解决的问题

1、解决了HTTP协议的被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。

2、解决了Ajax轮询和long poll 同步有延迟,而且还非常消耗资源。

PS:最近学习了好多的偏底层的知识,因为在学习Swoole的时候,没有点底层的知识,无法理解Swoole。如果只是建立在使用Swoole的情况下,出现问题,根本不知道如何解决。

学习链接:

1、理解WebSocket

2、WebSocket 是什么原理?为什么可以实现持久连接?

3、简单理解Socket

WebSocket原理和如何实现持久连接》有2个想法

  1. Pingback引用通告: Swoole入门教程(一) - 莫飞 | 忠诚于梦想的人才可能胜利

发表评论

邮箱地址不会被公开。