51Testing软件测试论坛

标题: HTTP和WebSocket之间难舍难分的关系 [打印本页]

作者: lsekfe    时间: 2017-10-11 14:19
标题: 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的数据帧介绍以及服务器的搭建方法会在接下来的文章中进行分享。






欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2