【一文读懂】HTTP与Websocket协议
HTTP协议
概述
HTTP (Hypertext Transfer Protocol),即超文本传输协议,是一种用于在客户端和服务器之间传输超文本(例如网页、图片、音频、视频等)的通信协议。它是万维网(WWW)的基础,负责在浏览器(客户端)和 web 服务器之间交换信息。HTTP 是一个 应用层 协议,位于 OSI 模型的第七层,通常通过 TCP(传输控制协议)进行通信。
HTTP 是无状态的、面向请求/响应的协议,意思是每一次请求都是独立的,服务器不会保存客户端的状态。每次客户端发起请求,服务器都必须处理并响应,即使是同一个客户端的连续请求,也被视为独立的。
HTTP 请求/响应模型
HTTP 协议基于请求/响应模型,通信流程包括两部分:客户端发送请求,服务器返回响应。
1. HTTP 请求报文(Request Message)
一个 HTTP 请求报文主要由以下几个部分组成:
-
请求行(Request Line)
-
请求方法(Request Method)
:定义了客户端希望进行的操作,常见的 HTTP 请求方法包括:
GET
:请求指定的资源,通常用于获取网页或文件。POST
:将数据提交到服务器,常用于表单提交。PUT
:上传数据,通常用于更新服务器上的资源。DELETE
:删除指定的资源。HEAD
:与GET
方法类似,但只返回响应头,不返回实际内容。PATCH
:用于对已有资源进行部分修改。
-
请求 URL(Request URL):指定资源的位置,例如
https://www.example.com/index.html
。 -
协议版本(HTTP Version):指定使用的 HTTP 协议版本,通常是
HTTP/1.1
或HTTP/2
。
示例:
GET /index.html HTTP/1.1
-
-
请求头部(Request Headers) 请求头部包含了请求的元信息,描述客户端环境、请求内容类型、认证信息等。例如:
User-Agent
:指定发起请求的客户端软件信息。Accept
:指定客户端能够处理的内容类型(如text/html
、application/json
等)。Host
:指定请求目标的主机名(用于虚拟主机的支持)。Cookie
:包含发送给服务器的 Cookie 数据。Authorization
:包含授权信息,用于身份验证。
示例:
User-Agent: Mozilla/5.0 Accept: text/html,application/xhtml+xml
-
请求体(Request Body) 请求体通常在
POST
、PUT
等方法中使用,用于传送数据到服务器(例如表单提交的数据、JSON 数据等)。GET
请求一般没有请求体。示例(POST 请求提交表单数据):
name=John&age=30
2. HTTP 响应报文(Response Message)
HTTP 响应报文由服务器发送回客户端,通常包含服务器处理请求后的结果。响应报文的组成部分如下:
-
响应行(Response Line)
- 协议版本(HTTP Version):指定响应所使用的 HTTP 协议版本。
- 状态码(Status Code):用于表示请求的处理结果,如成功、失败或错误。
- 状态短语(Status Phrase):对状态码的简短描述,例如
OK
、Not Found
等。
示例:
HTTP/1.1 200 OK
-
响应头部(Response Headers) 响应头部包含关于响应的元信息,描述服务器的状态、返回的数据类型等。例如:
Content-Type
:响应体的内容类型(如text/html
、application/json
等)。Content-Length
:响应体的长度(以字节为单位)。Date
:响应的时间戳。Set-Cookie
:服务器返回给客户端的 Cookie。
示例:
Content-Type: text/html; charset=UTF-8 Content-Length: 1234 Set-Cookie: sessionid=abcd1234
-
响应体(Response Body) 响应体包含了实际的数据内容,这是服务器返回给客户端的主体部分。对于
GET
请求,响应体通常是请求的网页内容、图片、视频等资源。对于 API 请求,响应体通常是 JSON 或 XML 格式的数据。示例(返回 HTML 内容):
<html><head><title>Welcome</title></head><body><h1>Hello, World!</h1></body> </html>
3. HTTP 状态码
状态码是服务器返回给客户端的一组三位数字,表示请求的处理状态。常见的状态码包括:
- 1xx (信息性状态码):请求已接收,继续处理。
100 Continue
:表示服务器已收到请求头部,客户端可以继续发送请求体。101 Switching Protocols
:服务器正在切换协议。
- 2xx (成功状态码):请求已成功处理。
200 OK
:请求成功,服务器返回响应数据。201 Created
:请求成功,资源已创建。204 No Content
:请求成功,但没有返回内容。
- 3xx (重定向状态码):需要客户端进一步操作来完成请求。
301 Moved Permanently
:资源已被永久移动到新位置。302 Found
:资源临时移动到新位置。304 Not Modified
:请求的资源未修改,可以使用缓存。
- 4xx (客户端错误状态码):请求有语法错误或无法完成。
400 Bad Request
:请求语法错误,服务器无法理解。401 Unauthorized
:需要用户认证。403 Forbidden
:服务器拒绝访问该资源。404 Not Found
:请求的资源不存在。
- 5xx (服务器错误状态码):服务器处理请求时发生错误。
500 Internal Server Error
:服务器内部错误,无法处理请求。502 Bad Gateway
:网关或代理服务器收到无效响应。503 Service Unavailable
:服务器暂时不可用。
4. HTTP 协议的版本
- HTTP/1.0:最初的 HTTP 协议版本,支持基本的请求和响应机制,但性能较低,缺乏多路复用等特性。
- HTTP/1.1:相比 HTTP/1.0,HTTP/1.1 增强了持久连接、管道化、分块传输等特性,减少了建立连接的次数。
- HTTP/2:引入了二进制协议、流的多路复用、头部压缩等技术,大大提高了性能,尤其是减少了页面加载时间。
- HTTP/3:基于 QUIC(Quick UDP Internet Connections)协议,旨在进一步提高性能,尤其在高延迟或丢包的网络环境中表现更佳。
5. HTTP 与 HTTPS
- HTTP:在客户端和服务器之间传输数据时,数据是明文的,容易受到中间人攻击。
- HTTPS:即 HTTP over SSL/TLS,数据在传输过程中会进行加密,确保通信的机密性和完整性。现代 web 应用普遍推荐使用 HTTPS 来保证安全性。
WebSocket
概述
WebSocket 是一种计算机通信协议,属于 应用层协议,它为客户端和服务器之间提供了一个 全双工、双向通信 的通道。WebSocket 通过建立在 TCP 之上的连接,允许客户端和服务器进行实时、低延迟的消息交换。WebSocket 由 IETF(Internet Engineering Task Force)发布,是一种适用于需要持续交换数据的应用的技术。
WebSocket 协议的引入,主要是为了解决传统的 HTTP 协议在实时通信中的不足,尤其是在高频率消息交互、双向通信等场景中。
特点
- 全双工通信(Full-Duplex):
- WebSocket 是一种 全双工(Full-Duplex)协议,意味着客户端和服务器可以同时发送和接收数据。这与传统的 HTTP 协议(单向请求-响应模式)不同。
- 实时性(Low Latency):
- 一旦 WebSocket 连接建立,客户端和服务器之间就可以在没有建立新的连接的情况下持续发送和接收数据。避免了频繁的连接与断开,极大减少了延迟。
- 持久连接:
- WebSocket 连接在创建后保持持久性,直到显式关闭。不同于 HTTP 请求-响应模型,WebSocket 不需要每次通信都重新建立连接,这使得通信更加高效。
- 低开销:
- WebSocket 数据帧结构非常简洁,不像 HTTP 那样包含冗余的头信息,因此每次传输的开销非常小,适合需要频繁数据交换的应用场景。
- 双向通信:
- WebSocket 支持 双向通信,这意味着服务器可以主动向客户端推送数据,而不必等到客户端发起请求。这对于需要实时推送数据的应用(如在线聊天、实时股票价格、游戏等)至关重要。
工作原理
-
连接建立:
- WebSocket 连接是通过HTTP 握手(HTTP Handshake)来建立的,但一旦建立连接,HTTP 连接就会升级为 WebSocket 连接。这一过程包括:
- 客户端发起一个 HTTP 请求,带有
Upgrade
头字段,向服务器请求从 HTTP 协议升级到 WebSocket 协议。 - 服务器响应请求并发送一个
101 Switching Protocols
的状态码,表示协议升级成功。
- 客户端发起一个 HTTP 请求,带有
例如,客户端请求:
GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13
服务器响应:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: x3JJHMbDL1EzLkh9WcR+Kk0M9L+Y=
- WebSocket 连接是通过HTTP 握手(HTTP Handshake)来建立的,但一旦建立连接,HTTP 连接就会升级为 WebSocket 连接。这一过程包括:
-
数据传输:
- 一旦建立 WebSocket 连接,客户端和服务器可以通过 WebSocket 数据帧 交换数据。这些数据帧的传输是非常高效的,并且可以支持不同类型的消息:文本、二进制数据等。
-
连接关闭:
- 当通信结束时,任一方(客户端或服务器)可以发起连接关闭请求,关闭时发送一个 Close 数据帧,另一方确认后连接关闭。
数据帧格式
WebSocket 数据帧的结构相对简单,通常包括以下部分:
- FIN、RSV、OpCode:标识数据帧的类型和一些控制信息。
- 掩码标志(Mask):指示数据是否经过掩码处理(客户端发送的数据必须加掩码,服务器数据通常不需要掩码)。
- 负载长度(Payload Length):表示数据负载的长度。
- 掩码密钥(Mask Key):如果数据有掩码,则包括掩码密钥。
- 负载数据(Payload Data):实际的传输数据(如文本、二进制数据)。
使用场景
- 实时聊天应用:WebSocket 使得服务器能够即时向客户端推送消息,特别适合即时聊天应用。
- 在线游戏:实时互动和低延迟是 WebSocket 在在线游戏中的应用亮点。
- 股票、金融数据传输:WebSocket 适用于需要实时更新的数据流传输,如金融市场数据、股票价格更新等。
- 物联网(IoT)设备通信:WebSocket 可以用于物联网设备与云端服务器之间的实时通信,实时传输传感器数据或设备状态。
- 协作应用:在协作编辑应用中(例如 Google Docs),WebSocket 可以帮助多用户实时同步内容。
总结
HTTP 协议:
- 是一种 无状态、单向 的协议,客户端通过请求与服务器进行交互,适用于请求-响应模型的通信,如浏览网页、下载文件等。
- 每次请求都需要重新建立连接,并且包含一定的头部信息,造成了较高的延迟和开销。
- 不适合需要 实时数据交换 的应用。
WebSocket 协议:
- 提供了 持久连接,支持 双向、全双工 的通信,适用于实时性要求高、需要低延迟和高频繁数据交换的应用,如实时聊天、在线游戏、实时数据流(如股票行情、直播视频等)。
- 一旦连接建立,客户端和服务器可以随时发送和接收数据,避免了频繁建立连接的开销,提高了通信效率。
特性 | HTTP 协议 | WebSocket 协议 |
---|---|---|
协议类型 | 无状态协议,基于请求-响应模型 | 双向全双工协议,基于持久连接 |
连接模式 | 每次通信都需要建立新的连接(无连接) | 一旦建立连接,通信会保持持续开放 |
通信方式 | 客户端发起请求,服务器响应 | 客户端和服务器都可以随时发送和接收数据 |
数据传输 | 基于请求-响应,每次请求/响应时都需要传输头信息 | 传输数据时不需要额外的头部信息,开销更小 |
传输效率 | 相对较低,频繁建立和断开连接带来高开销 | 高效,数据传输时无额外的连接建立和断开开销 |
连接生命周期 | 每次请求响应后连接关闭,短暂 | 连接保持打开状态,直到主动关闭 |
实时性 | 请求和响应之间的延迟较高 | 实时双向通信,适合实时应用(如在线聊天、游戏) |
数据格式 | 主要为文本/HTML,二进制数据需要转换 | 支持文本(如 JSON)和二进制(如二进制流) |
状态管理 | 无状态,每次请求相互独立 | 有状态,连接状态保持直到主动关闭 |
协议使用场景 | 网页加载、文件传输、浏览器与服务器的通信 | 实时通信应用,如即时消息、在线游戏、实时数据流 |
安全性 | 可以通过 HTTPS 进行加密传输 | 可以通过 WSS(WebSocket Secure)加密传输 |
头部信息 | 每次请求都会有冗长的头部信息 | 只有握手阶段需要头部信息,之后没有头部开销 |
协议设计 | 基于请求-响应的客户端-服务器模型 | 基于持久连接的双向通信模型 |
连接模式 | 无连接:每个请求/响应都需要建立连接 | 持久连接:连接建立后可以进行持续的双向通信 |