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。抓紧帮我处理掉。
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //Base64 encode的值验证是否真的Websocket的
Sec-WebSocket-Protocol: chat, superchat //用户定义的字符串,用来区分同URL下,不同的服务所需要的协议
Sec-WebSocket-Version: 13 //告诉服务器所使用的Websocket Draft(协议版本)
服务器返回如下,接受到请求, 成功建立Websocket。
Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key。Sec-WebSocket-Protocol 则是表示最终使用的协议。
总结WebSocket解决的问题
1、解决了HTTP协议的被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。
2、解决了Ajax轮询和long poll 同步有延迟,而且还非常消耗资源。
PS:最近学习了好多的偏底层的知识,因为在学习Swoole的时候,没有点底层的知识,无法理解Swoole。如果只是建立在使用Swoole的情况下,出现问题,根本不知道如何解决。
学习链接: