【计网】HTTP与WebSocket的区别
WebSocket协议
1.定义
Websocket是html5提出的一个协议规范(2011年),参考rfc6455。
websocket约定了一个通信的规范,通过一个握手的机制,客户端(浏览器)和服务器(webserver)之间能建立一个类似tcp的连接,从而方便c-s之间的通信。在websocket出现之前,web交互一般是基于http协议的短连接或者长连接。
WebSocket他是为了解决客户端发起多个http请求到服务器资源浏览器必须要经过长时间的轮训问题而生的。
建立了WebSocket之后服务器不必在浏览器发送request请求之后才能发送信息到浏览器。这时的服务器已有主动权想什么时候发就可以发送信息到服务器。而且信息当中不必在带有head的部分信息了与http的长链接通信来说,这种方式,不仅能降低服务器的压力。而且信息当中也减少了部分多余的信息。
2.websocket的特点
WebSocket解决客户端发起多个http请求到服务器资源浏览器必须要经过长时间的轮询问题。
websocket是一种双向通信协议,采用异步回调的方式接受消息,当建立通信连接,可以做到持久性的连接,并进行通信。
WebSocket需要通过握手连接,类似于TCP它也需要客户端和服务器端进行握手连接,连接成功后才能相互通信。
建立连接后,WebSocket服务器和Browser都能主动的向对方发送或接收数据,实质的推送方式是服务器主动推送,只要有数据就推送到请求方。(变被动为主动)
3.websocket的握手(handshake)
(1)定义
出于兼容性的考虑,WS的握手使用HTTP来实现,客户端的握手消息就是一个普通的,带有Upgrade头的,HTTP Request消息。
(2)websocket请求报文
GET /chat HTTP/1.1 //1
Host: server.example.com //2
Upgrade: websocket //3
Connection: Upgrade //4
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== //5
Origin: http://example.com //6
Sec-WebSocket-Protocol: chat, superchat //7
Sec-WebSocket-Version: 13 //8
websocket请求报文的分析过程
第1行:与HTTP的Request的请求行一样
第2行:也与HTTP的Request的请求行一样
第3行:Upgrade是HTTP1.1中用于定义转换协议的header域。
如果服务器支持的话,客户端希望使用已经建立好的HTTP(TCP)连接,切换到WebSocket协议。第4行:Connection:HTTP1.1中规定Upgrade只能应用在直接连接中
带有Upgrade头的HTTP1.1消息必须含有Connection头,因为Connection头的意义就是,任何接收到此消息的人(往往是代理服务器)都要在转发此消息之前处理掉Connection中指定的域(不转发Upgrade域)。第5行:Sec-WebSocket-Key 是一个Base64encode的值,这个是浏览器随机生成的,用于服务端的验证,服务器会使用此字段组装成另一个key值放在握手返回信息里发送客户端
第6行:Origin作安全使用,防止跨站攻击,浏览器一般会使用这个来标识原始域。
第7行:Sec_WebSocket-Protocol是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议,识了客户端支持的子协议的列表。
第8行:Sec-WebSocket-Version标识了客户端支持的WS协议的版本列表。
(2)websocket响应报文
HTTP/1.1 101 Switching Protocols //1
Upgrade: websocket. //2
Connection: Upgrade. //3
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= //4
Sec-WebSocket-Protocol: chat. //5
websocket响应报文的分析
第1行:HTTP的版本为HTTP1.1,返回码是101,开始解析header域(不区分大小写)
第2行:有Upgrade头,且内容包含websocket。
第3行:有Connection头,且内容包含Upgrade
第4行:有Sec-WebSocket-Accept头,
生成步骤:①将Sec-WebSocket-Key的内容加上字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11(一个UUID),②将①中生成的字符串进行SHA1编码,③将②中生成的字符串进行Base64编码第5行:有Sec-WebSocket-Protocol头,要判断是否之前的Request握手带有此协议,如果没有,则连接失败。
4.websocket发送数据
WebSocket中所有发送的数据使用帧的形式发送。客户端发送的数据帧都要经过掩码处理,服务端发送的所有数据帧都不能经过掩码处理。否则对方需要发送关闭帧
一个帧包含一个帧类型的标识码,一个负载长度,和负载。负载包括扩展内容和应用内容。
HTTP1.1与WebSocket的异同
1.相同点
都是基于TCP的应用层协议。
都使用Request/Response模型进行连接的建立。
都可以在网络中传输数据。
在连接的建立过程中对错误的处理方式相同,在这个阶段WebSocket可能返回和HTTP相同的返回码。
2.不同点
http协议基于请求应答,只能做单向传输,是半双工协议,而WebSocket是全双工协议,类似于socket通信,双方都可以在任何时刻向另一方发送数据。
WebSocket使用HTTP来建立连接,但是定义了一系列新的header域,这些域在HTTP中并不会使用。
WebSocket的连接不能通过中间人来转发,它必须是一个直接连接。如果通过代理转发,一个代理要承受如此多的websocket连接不释放,就类似于一次DDOS攻击了。
WebSocket在建立握手连接时,数据是通过http协议传输的,但在建立连接之后,真正的数据传输阶段是不需要http协议参与的。
websocket传输的数据是二进制流,是以帧为单位的,http传输的是明文传输,是字符串传输,WebSocket的数据帧有序。
websocket的请求的头部和http请求头部不同,见上文。
3.HTTP的长连接与websocket的持久连接
(1)HTTP1.1的连接默认使用长连接(persistent connection),
即在一定的期限内保持链接,客户端会需要在短时间内向服务端请求大量的资源,保持TCP连接不断开。客户端与服务器通信,必须要有客户端发起然后服务器返回结果。客户端是主动的,服务器是被动的。
在一个TCP连接上可以传输多个Request/Response消息对,所以本质上还是Request/Response消息对,仍然会造成资源的浪费、实时性不强等问题。
如果不是持续连接,即短连接,那么每个资源都要建立一个新的连接,HTTP底层使用的是TCP,那么每次都要使用三次握手建立TCP连接,即每一个request对应一个response,将造成极大的资源浪费。
长轮询,即客户端发送一个超时时间很长的Request,服务器hold住这个连接,在有新数据到达时返回Response
(2)websocket的持久连接
- 只需建立一次Request/Response消息对,之后都是TCP连接,避免了需要多次建立Request/Response消息对而产生的冗余头部信息。
(3)图解
本人才疏学浅,若有错,请指出,谢谢!
如果你有更好的建议,可以留言我们一起讨论,共同进步!
衷心的感谢您能耐心的读完本篇博文
参考资料:刨根问底HTTP和WebSocket协议