HTTP和WebSocket之间难舍难分的关系

Posted 搜狗测试

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP和WebSocket之间难舍难分的关系相关的知识,希望对你有一定的参考价值。


这段时间在工作当中首次涉及到了websocket协议,颇为感兴趣,因此希望给大家分享一下,其与原始的http协议的区别以及websocket的优点。

首先html5指的是一系列新的API,或者说新规范,新技术。WebSocket是HTML5中新协议、新API。Http协议本身只有1.0和1.1,也就是所谓的Keep-alive,把多个Http请求合并为一个。


那么为什么说http协议并不是一个持久连接的协议呢?

(1)Http的生命周期通过Request来界定,也就是Request一个Response,那么在Http1.0协议中,这次Http请求就结束了。在Http1.1中进行了改进,是的有一个Keep-alive,也就是说,在一个Http连接中,可以发送多个Request,接收多个Response。但是必须记住,在Http中一个Request只能对应有一个Response,而且这个Response是被动的,不能主动发起。

(2)WebSocket是基于Http协议的,或者说借用了Http协议来完成一部分握手,在握手阶段与Http是相同的。


客户端:

GET http://121.40.165.18:8088/ HTTP/1.1

Host:121.40.165.18:8088

Connection: Upgrade

Upgrade: websocket

Origin: http://www.blue-zero.com

Sec-WebSocket-Version:13

Sec-WebSocket-Key:4IDp1OUMMlQXNFifKUjovA==

服务端:

HTTP/1.1 101 SwitchingProtocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept:bRpTHaDDnJNwuZUNb0ZAcBYRU9A=


这样,我们就可以直接使用websocket协议与服务器进行消息传输了。熟悉http协议的同学会发现它与传统的http请求不太一样,head中多了几个字段:

    Upgrade:websocket

    Connection:Upgrade

    Sec-WebSocket-Version:13

    Sec-WebSocket-Key:4IDp1OUMMlQXNFifKUjovA==

前三条均是告诉服务器,我这里需要使用的websocket协议,希望将协议变化。而Sec-WebSocket-Key表示的是一个验证码,用来确定服务器提供的是websocket协议。

服务器收到request后返回的response中也包含了几条特有字段:

    HTTP/1.1101 Switching Protocols

    Upgrade:websocket

    Connection:Upgrade

    Sec-WebSocket-Accept:bRpTHaDDnJNwuZUNb0ZAcBYRU9A=

返回101证明协议已经改变,变为了websocket,最后附加的Sec-WebSocket-Accept是服务器经过确认并且加密过后的Sec-WebSocket-Key,用来表示自己的真实性。


HTTP通信:

Websocket通信:

由上图可知,websocket只要建立连接,之后客户端与服务器的通讯完全是自由的,客户端可以主动发送消息,同理服务端也可以主动进行消息推送。而http请求只能一个request对应一个response,所以服务端不能做到真正意义上的主动发送消息。而且连接建立起后只需要通过数据帧来进行传输,帧的头部信息远比http当中的head小多了,会节省大量的带宽。更适合做长时间的数据传输。但其缺点就是需要一直维持连接,因此对于服务器的端口资源消耗较大。


小编在此先简单介绍一下HTTP与WebSocket协议的区别,WebSocket的数据帧介绍以及服务器的搭建方法会在接下来的文章中进行分享。

以上是关于HTTP和WebSocket之间难舍难分的关系的主要内容,如果未能解决你的问题,请参考以下文章

TCP UDP socket http webSocket 之间的关系

python之WebSocket协议

WebSocket和HTTP的区别与联系

socket.io websocket

理清 WebSocket 和 HTTP 的关系

什么是WebSocket?