什么是 WebSocket,它与 HTTP 有何不同?

今天翻译一篇关于 HTTP 和 WebSocket 的文章,HTTP 和 WebSocket 都是客户端 - 服务器通信中使用的通信协议。文章用几个例子解释了两者的不同以及分别适用在什么应用场景。有些容易混淆的概念(比如说 HTTP 长连接)和待补充的概念我用斜体字注解到了文章中。

HTTP 协议

HTTP 是单向的,客户端发送请求,服务器发送响应。举例来说,当客户端向服务器发送请求时,该请求以 HTTP 或 HTTPS 的形式发送,在接收到请求后,服务器会将响应发送给客户端。每个请求都与一个对应的响应相关联,在发送响应后客户端与服务器的连接会被关闭。每个 HTTP 或 HTTPS 请求每次都会新建与服务器的连接,并且在获得响应后,连接将自行终止。
HTTP 是在 TCP 之上运行的无状态协议,TCP 是一种面向连接的协议,它使用三向握手方法保证数据包传输的传递并重新传输丢失的数据包。

HTTP 可以运行在任何可靠的面向连接的协议(例如 TCP,SCTP)的上层。当客户端将 HTTP 请求发送到服务器时,客户端和服务器之间将打开 TCP 连接,并且在收到响应后,TCP 连接将终止,每个 HTTP 请求都会建立单独的 TCP 连接到服务器,例如如果客户端向服务器发送 10 个请求,则将打开 10 个单独的 HTTP 连接。并在获得响应后关闭。

理解上面这段关于 HTTP 的描述时我觉得还要了解一下 HTTP 长连接的概念,以及 HTTP 与 TCP 的关系,简单概括一下就是:

  • HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。
  • 每个 HTTP 连接完成后,其对应的 TCP 连接并不是每次都会关闭。从 HTTP/1.1 起,默认使用长连接,用以保持连接特性。使用长连接的 HTTP 协议,会在响应头有加入这个头部字段:Connection:keep-alive
  • 在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache,Nginx,Nginx 中这个默认时间是 75s)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
  • HTTP 属于应用层协议,在传输层使用 TCP 协议,在网络层使用 IP 协议。IP 协议主要解决网络路由和寻址问题,TCP 协议主要解决如何在 IP 层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP 有可靠,面向连接的特点。

HTTP 消息信息是用 ASCII 编码的,每个 HTTP 请求消息均包含 HTTP 协议版本(HTTP/1.1,HTTP/2),HTTP 方法(GET/POST 等),HTTP 标头(Content-Type,Content-Length),主机信息等。以及包含要传输到服务器的实际消息的正文(请求主体)。HTTP 标头的大小从 200 字节到 2KB 不等,HTTP 标头的常见大小是 700-800 字节。当 Web 应用程序在客户端使用更多 cookie 和其他工具扩展代理的存储功能时,它将减少 HTTP 标头的荷载。

WebSocket 协议

WebSocket 是双向的,在客户端 - 服务器通信的场景中使用的全双工协议,与 HTTP 不同,它以 ws:// 或 wss:// 开头。它是一个有状态协议,这意味着客户端和服务器之间的连接将保持活动状态,直到被任何一方(客户端或服务器)终止。在通过客户端和服务器中的任何一方关闭连接之后,连接将从两端终止。

让我们以客户端 - 服务器通信为例,每当我们启动客户端和服务器之间的连接时,客户端 - 服务器进行握手随后创建一个新的连接,该连接将保持活动状态,直到被他们中的任何一方终止。建立连接并保持活动状态后,客户端和服务器将使用相同的连接通道进行通信,直到连接终止。

新建的连接被称为 WebSocket。一旦通信链接建立和连接打开后,消息交换将以双向模式进行,客户端 - 服务器之间的连接会持续存在。如果其中任何一方(客户端服务器)宕掉或主动关闭连接,则双方均将关闭连接。套接字的工作方式与 HTTP 的工作方式略有不同,状态代码 101 表示 WebSocket 中的交换协议。

何时使用 WebSocket

  • 即时 Web 应用程序:即时 Web 应用程序使用一个 Web 套接字在客户端显示数据,这些数据由后端服务器连续发送。在 WebSocket 中,数据被连续推送 / 传输到已经打开的同一连接中,这就是为什么 WebSocket 更快并提高了应用程序性能的原因。
  • 例如在交易网站或比特币交易中,这是最不稳定的事情,它用于显示价格波动,数据被后端服务器使用 Web 套接字通道连续推送到客户端。
  • 游戏应用程序:在游戏应用程序中,你可能会注意到,服务器会持续接收数据,而不会刷新用户界面。屏幕上的用户界面会自动刷新,而且不需要建立新的连接,因此在 WebSocket 游戏应用程序中非常有帮助。
  • 聊天应用程序:聊天应用程序仅使用 WebSocket 建立一次连接,便能在订阅户之间交换,发布和广播消息。它重复使用相同的 WebSocket 连接,用于发送和接收消息以及一对一的消息传输。

不能使用 WebSocket 的场景

如果我们需要通过网络传输的任何实时更新或连续数据流,则可以使用 WebSocket。如果我们要获取旧数据,或者只想获取一次数据供应用程序使用,则应该使用 HTTP 协议,不需要很频繁或仅获取一次的数据可以通过简单的 HTTP 请求查询,因此在这种情况下最好不要使用 WebSocket。

注意:如果仅加载一次数据,则 RESTful Web 服务足以从服务器获取数据。

总结

WEBSOCKET

HTTP

WebSocket 是一种双向通信协议,可以通过重用已建立的连接通道将数据从客户端发送到服务器,或者从服务器发送到客户端。连接保持活动状态,直到被客户端或服务器终止。HTTP 协议是 TCP 协议之上的单向协议,TCP 是面向连接的传输层协议,我们可以在获得响应 HTTP 连接关闭后再使用 HTTP 请求方法来创建连接。
几乎所有的实时应用程序(如(交易,监视,通知)服务)都使用 WebSocket 在单个通信通道上接收数据。简单的 RESTful 应用程序使用无状态的 HTTP 协议。
所有经常更新的应用程序都应该使用 WebSocket,它比 HTTP 连接更快。当我们不想在特定时间内保留连接或不重复使用单个连接来传输数据时使用 HTTPHTTP 连接的速度比 WebSocket 慢。

来源:GeeksforGeeks

原文链接:
https://www.geeksforgeeks.org/what-is-web-socket-and-how-it-is-different-from-the-http/

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值