HTTP与WebSocket

154 阅读2分钟

这两个协议我都用到过,从没对比过,今天就来对比一下这两个协议。

HTTP

什么是HTTP?

HTTP,英文:HyperText Transfer Protocol。中文:超文本传输协议。

特点:

  • 基于TCP协议。
  • 无状态的。

我们来简单的解释一下什么叫无状态?

每次请求之间没有任何联系,也就是服务器不知道每次请求是否是同一个用户。

为什么HTTP要设计成无状态协议?

那就要看他有什么优点:

  • 首先减少服务器压力,解放了服务器,每一个请求不会造成不必要的连接占用。
  • 由于每个请求无关联,如果第一个请求报错,后面的依然会继续。

可是还会出现缺点:

  • 每次请求会造成不必要的大量重复内容信息。

怎么解决这种无状态?

Cookie、Session解决HTTP无状态带来的问题。

HTTP/1.1默认是长连接(keep-alive)

长连接的意思就是,在一定时间内保持TCP连接,不断开的进行数据请求。

关于这部分请看我之前的文章:《TCP和HTTP请求之间的关系》

WebSocket

WebSocket协议是H5出的,他和HTTP不能说一点关系没有,应该说是交集关系。

HTTP是不支持持久连接的,而WebSocket解决了这样的问题。

特点:

  • WebSocket建立在TCP协议之上。

  • 与HTTP有良好的兼容性(有交集)。比如:默认端口也是80和443,并且握手阶段采用的是HTTP协议。

  • 持久化,也是对比HTTP来说。

  • WebSocket没有同源限制,客户端可以与任意服务器通信。

原理:

  • 基于HTTP协议来完成一部分握手。

  • 请求头如下:

  •   Upgrade: websocket
      Connection: Upgrade
      Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
      Sec-WebSocket-Key: mg8LvEqrB2vLpyCNnCJV3Q==
      Sec-WebSocket-Version: 13
    
  • Upgrade 和 Connection 通知服务器,浏览器端发起的是WebSocket协议。

  • Sec-WebSocket-Extensions:表示客户端想要的协议级的扩展。

  • Sec-WebSocket-Key:由浏览器随机生成的Base64编码值。

  • Sec-WebSocket-Version:表明客户端使用协议的版本。

  • 请求头的作用就是用来通知服务端,将协议改为WebSocket。并且使用Sec-WebSocket-Key进行确认。

  • 响应头如下:

  •   Upgrade: websocket
      Connection: Upgrade
      Sec-WebSocket-Accept: AYtwtwampsFjE0lu3kFQrmOCzLQ=
    
  • 通知浏览器已经改写成功了。

  • Sec-WebSocket-Accept:由服务端加密返回的Base64编码值。

总结:

简单的介绍了HTTP和WebSocket,后续如有更细,依然会补充在这里。