非流式HTTP和流式的Websocket区别

  • Post author:
  • Post category:其他




Websocket简介

Websocket 是一种在 Web 应用程序中实现全双工、持久性连接的通信协议。它是基于 HTTP 协议构建的,但与传统的 HTTP 请求-响应模型不同。下面详细解释 Websocket 是如何实现的:

1.HTTP 握手:

当客户端想要与服务器建立 WebSocket 连接时,它首先发送一个普通的 HTTP 请求到服务器。这是一个特殊的 HTTP 请求,称为握手请求(Handshake Request)。该请求的头部包含了一些特定的标识信息,使服务器知道该请求是用于建立 WebSocket 连接的。

2.服务器响应:

服务器接收到握手请求后,会进行验证和协议升级过程。如果验证通过,服务器会返回一个特殊的响应,称为握手响应(Handshake Response)。该响应中包含一些特定的标识信息,表示服务器接受了客户端的握手请求,准备建立 WebSocket 连接。

3.协议升级:

在握手响应中,服务器通知客户端协议已升级为 WebSocket,并提供一个用于建立连接的唯一标识符,称为握手密钥(Handshake Key)。客户端接收到握手响应后,会进行协议切换,将连接升级为 WebSocket。

4.数据交换:

在建立 WebSocket 连接后,客户端和服务器之间可以进行双向的数据交换,而不再像传统的 HTTP 请求-响应模型那样限制在单向。双方可以互相发送消息,服务器可以主动向客户端推送数据,而不需要客户端周期性地发送请求。

5.连接维持:

WebSocket 连接是持久性的,它不像传统的 HTTP 连接那样会在每次请求-响应后断开。连接会一直保持打开状态,直到客户端或服务器主动关闭连接或发生异常。

总结起来,Websocket 是基于 HTTP 协议实现的,通过在 HTTP 握手过程中进行协议升级,将连接从普通的 HTTP 连接升级为 WebSocket 连接。这使得客户端与服务器之间可以建立持久性、全双工的通信连接,实现实时的数据交换和推送。Websocket 在实时应用程序中很有用,例如聊天应用、实时数据监控等。



HTTP是非流式的

HTTP 协议被称为非流式的主要原因是它在请求-响应模型中,在客户端和服务器之间进行数据传输时不支持实时的数据流。下面是一些解释:

1.请求-响应模型:HTTP 是基于请求-响应模型的协议,客户端发送一个请求,服务器返回一个响应。在这个模型中,客户端发送完整的请求,服务器在接收到完整的请求后才能发送完整的响应。这种模式是一种“一次性”交互,不支持持续的数据传输。

2.头部和主体分离:HTTP 请求和响应的格式中,有一个明确的分隔符将头部和主体分开。首先,客户端发送包含请求头部的请求,服务器收到请求后解析头部信息,并准备处理请求。然后,服务器返回一个包含响应头部的响应,再由客户端解析处理。头部信息中包含了诸如内容长度(Content-Length)等元数据,用于确定主体数据的大小。只有在完全接收到头部信息后,才能确定数据是否完整,从而开始处理主体数据。

3.连接管理:HTTP 是一种无状态协议,它并不维持持久性连接。每一次请求-响应交互后,连接都会被关闭。当需要多次交互时,每次交互都需要重新建立连接,这导致了额外的开销和延迟。

4.短暂性:HTTP 的设计初衷是为了传输文档和资源,每个请求通常只包含足够的信息来获取所需的内容,然后断开连接。这种短暂性的特点导致了 HTTP 不适合在单个连接上进行持续的、实时的数据流传输。

需要注意的是,尽管 HTTP 协议本身不支持流式传输,但可以通过一些技术和协议扩展来实现类似的功能。例如,使用长轮询(Long Polling)或基于 WebSocket 的通信可以在 HTTP 上模拟实时的流式传输。



WebSocket支持流式传输的原因

WebSocket 支持流式传输的主要原因是它提供了全双工(full-duplex)的双向通信通道,允许实时地在客户端和服务器之间传输数据流。下面是一些详细解释:

1.双向通信:与传统的 HTTP 协议不同,WebSocket 建立了一个持久的连接,可以在客户端和服务器之间实现全双工的通信。这意味着客户端可以同时发送和接收数据,而不需要等待服务器的响应。数据可以在任何一方传输,实现了实时的双向流式传输。

2.低延迟:WebSocket 使用 TCP 协议作为底层传输协议,与 HTTP 相比,WebSocket 通过减少连接建立和关闭的开销,以及减少头部信息传输的次数,可以实现更低的延迟。这使得实时数据的传输更加迅速和高效。

3.数据帧传输:WebSocket 将数据分割成多个帧(frame)进行传输,同时支持连续的数据帧传输。这意味着可以将大型数据流分成小块进行传输,而不需要等待全部数据接收完成。客户端和服务器可以逐个帧地发送和接收数据,从而实现流式的数据传输。

4.服务端推送:WebSocket 支持服务器主动向客户端发送数据,这被称为服务器推送(server push)或实时通知(real-time notifications)。服务器可以实时将数据推送给客户端,而不需要客户端明确发起请求。这样可以实现实时的流式数据传输,例如实时聊天、股票市场更新等应用场景。

5.协议升级:WebSocket 是作为 HTTP 的一个扩展协议设计的,它通过在初始 HTTP 握手请求中包含特定的头部信息来进行协议升级。如果服务器支持 WebSocket,它可以在握手后将连接升级为 WebSocket 连接,从而启用实时流式传输。

总结起来,WebSocket 支持流式传输的关键在于其全双工通信、低延迟、数据帧传输和服务端推送的特性。这使得 WebSocket 成为一种理想的协议,用于实现实时的、持久的、双向的流式数据传输。



HTTP和Websocket的区别

HTTP(HyperText Transfer Protocol)和WebSocket 是两种不同的协议,用于在客户端和服务器之间进行通信。它们在以下几个方面有所区别:



1.连接方式:

HTTP:HTTP 是一种无状态的请求-响应协议,客户端通过发送请求来获取服务器的响应。每个请求都需要建立新的连接,并在完成后关闭连接。

WebSocket:WebSocket 建立一次连接后,保持持久连接,支持全双工通信,客户端和服务器可以实时地进行双向通信。



2.请求-响应模式:

HTTP:HTTP 使用请求-响应模式,客户端发送请求,服务器返回响应。客户端必须明确发起请求,服务器才会做出响应。

WebSocket:WebSocket 支持双向通信,客户端和服务器可以随时发送和接收数据,而不需要等待对方的请求或响应。



3.数据传输方式:

HTTP:HTTP 通过短暂的请求-响应交互,在每次请求中传输有限的数据。每个请求完成后,连接被关闭,下一个请求需要重新建立连接。

WebSocket:WebSocket 使用数据帧传输,可以持续地传输大型数据流。数据可以分割成多个帧,按顺序传输,并且支持连续的数据帧传输。



4.实时性和效率:

HTTP:HTTP 是一个无状态的协议,每个请求都需要建立和关闭连接,这会导致一定的延迟和资源开销。它适用于间歇性的、非实时性的请求-响应模式。

WebSocket:WebSocket 通过保持持久连接并使用更低的开销来实现实时性和高效性。它适用于需要实时消息传递和双向通信的应用场景,如实时聊天、实时数据更新等。

总结起来,HTTP 是一种请求-响应协议,适用于间歇性的、非实时性的数据通信,并且在每个请求之间建立短暂的连接。而 WebSocket 是一种支持双向通信的协议,适用于实时性要求高的应用场景,通过保持持久连接和数据帧传输实现实时、高效的数据传输。



版权声明:本文为qq_51282224原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。