websocket-http

START >_

最近工作上接触到了websocket这概念,发现自己以前对它的理解一直都是错的,于是搜索了一下资料,决定写下来记录下来.

http协议

单向

  • 客户端发起请求,服务端接收请求并响应,request–>response.

  • http建立在tcp之上,每个http请求发送到服务器时,客户端和服务端会打开TCP连接,客户端收到响应后,连接断开.

  • 例如如果客户端向服务器发送10个请求,则将打开10个单独的HTTP连接。并在获得响应后关闭。

http与tcp

  • http的长连接和短连接实际上是TCP长链接和短连接
  • 每个HTTP连接完成后,其对应的TCP连接并不是每次都会关闭。从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这个头部字段:Connection:keep-alive
  • 长连接状态下,当一个网页打开完成,就是请求响应完成后,客户端和服务端之间的TCP连接不会关闭,如果客户端再次访问这个网页,将再次使用这条已经建立的TCP连接.当然也不会永久保持,有一个超时时间,一般是服务器端设定(如nginx默认时间是75s).
  • 长连接需要客户端和服务端都支持
  • http是应用层协议,在传输层使用TCP协议,在网络层使用IP协议.
    • IP协议: 解决网络路由和寻址
    • TCP协议: 解决如何在IP层之上可靠地传递数据包.(可靠收发,重传机制,保证顺序等)

数据结构

HTTP消息信息是用ASCII编码的,每个HTTP请求消息均包含HTTP协议版本(HTTP/1.1HTTP/2),HTTP方法(GET/POST等),HTTP标头(Content-TypeContent-Length),主机信息等。以及包含要传输到服务器的实际消息的正文(body)。

HTTP标头的大小从200字节到2KB不等,HTTP标头的常见大小是700-800字节。当Web应用程序在客户端使用更多的如cookie等其他工具扩展代理的存储功能时,它将减少HTTP标头的荷载。

websocket协议

双向

  • 全双工协议,以ws://或者wss://开头
  • 有状态协议,这意味着客户端和服务端之间的连接将保持活动状态,直到被任何一方终止.终止时,连接将从两端终止.

连接过程

  1. 比如client要向server建立连接,首先会发送一个request到服务端,此时类似http

  2. server收到请求,会跟client开始建立TCP连接,三次握手,此时类似socket/tcp连接

  3. 当连接建立起来后,就会一直保持,并以全双工模式交换数据,直到某一方断开.

    忘记了在哪里看到类似的比喻:

    客户端骑马(http request)拉着两条水管到服务端请求建立连接,服务端收到后就跟客户端连起来两条水管(全双工长链接).直到某一端要拔掉水管(断开连接),则另一端也会拔掉水管(断开连接)

http长连接和websocket持久连接

http长连接

  • 即在一定的期限内保持链接,客户端会需要在固定时间内向服务端请求大量的资源,保持TCP连接不断开。客户端与服务器通信,必须要由客户端发起然后服务器返回结果。客户端是主动的,服务器是被动的。
  • 实际上是在一个TCP连接上传输多个request|respone消息对,存在资源浪费,实时性不强等缺点
  • 长轮询,即客户端发送一个超时时间很长的request,服务器hold住这个连接,在有新数据到达时response

websocket持久连接

  • 只需建立一次request|respone消息对,之后都是TCP连接,避免了需要多次建立request|respone消息对而产生的冗余头部信息。

总结

WEBSOCKETHTTP
全双工单向,服务端不能主动推数据到客户端
一次建立持续使用一次请求一个连接,每次连接都要重新tcp握手

具体要看使用场景:

如果需要长时间保持连接,持续交换数据时,使用websocket,此时比起使用特定时间的http长连接速度更快,也不存在断连重连的情况,如:

  • IM
  • 实时更新的页面

如果只是简单的一次请求获取数据,使用HTTP即可

参考


websocket-http
http://example.com/2022/07/02/websocket-http/
作者
Peter Pan
发布于
2022年7月2日
许可协议