目录
HTTP是什么
HTTP(超文本传输协议,Hypertext Transfer Protocol)是一种用于在网络上传输数据的协议。它是Web上信息传递的基础,允许客户端(通常是浏览器)和服务器之间交换文本、图像、视频和其他类型的数据。HTTP是一种无状态的请求-响应协议,意味着每次请求都是独立的,服务器不会记住之前的请求。
即请求一次,响应一次。
那么问题来了,HTTP是请求一次,响应一次,服务器不能给客户端发送信息。但是HTTP通过TCP建立长连接,为什么客户端服务器不能持续通信?
HTTP局限性(HTTP1.1)
- 因为HTTP是无状态,半双工的通信。意味着客户端给服务端发请求或是服务端给客户端发请求,都需要建立TCP连接,一来一回都要三次握手,会造成资源浪费和延迟。
- 安全性,HTTP传输明文不安全,需要HTTPS加强安全性。
- 适应性差,HTTP设计初衷是用于静态页面,对动态内容支持不灵活。
请求和响应
HTTP 请求由客户端(通常是浏览器)发起,向服务器请求资源。一个标准的 HTTP 请求包括以下几个部分:
请求行,请求头,请求体
GET /index.html HTTP/1.1
HTTP/1.1 200 OK
HTTP的主要特点:
- 请求-响应模型:客户端向服务器发送请求,服务器处理请求并返回响应。
- 无状态:每个请求都是独立的,服务器不保留请求之间的状态信息。
- 灵活性:支持多种数据格式,包括HTML、XML、JSON等。
- 可扩展性:可以通过不同的HTTP头部和状态码扩展功能。
HTTP版本:
- HTTP/1.0:最早的版本,简单易用,但存在一些性能问题。
- HTTP/1.1:增强了性能,支持持久连接和更多的控制功能。
- HTTP/2:引入了多路复用、服务器推送等功能,提升了性能。
- HTTP/3:基于QUIC协议,进一步优化了连接的建立和数据传输的效率。
HTTP与TCP关系
- TCP:属于传输层协议,负责在网络上提供可靠的数据传输。它确保数据包在传输过程中的完整性和顺序,并能处理丢包、重传等问题。
- HTTP:属于应用层协议,构建在TCP之上,负责具体的数据交换和应用逻辑(如网页请求和响应)。
- HTTP 并不直接与 TCP 进行数据交互,而是将应用层数据交给传输层(TCP)。TCP 将 HTTP 的请求或响应报文作为数据负载,并通过 TCP 连接发送到目的地。
- 在传输过程中,TCP 负责保证 HTTP 数据段的完整性和有序性。TCP 对 HTTP 数据报文进行分段、传输,然后接收端再通过 TCP 重组这些数据段,最后将完整的 HTTP 数据交给应用层的 HTTP 服务器或客户端处理。
数据封装传输过程
HTTP(超文本传输协议)是对应用层的数据进行封装,并将封装后的数据通过TCP协议传输。
1. 协议层次模型:
- HTTP(应用层协议):HTTP 位于 OSI 模型的应用层,负责定义客户端和服务器之间的请求与响应格式。HTTP 处理的是 Web 内容(如 HTML 页面、图片、视频等)的传输。
- TCP(传输层协议):TCP 位于 OSI 模型的传输层,负责数据的可靠传输。TCP 对应用层传递下来的数据进行分段传输,并保证数据按顺序、无差错地到达目的地。
2. 封装过程:
在网络通信中,数据通过逐层封装的方式进行传输。具体来说,HTTP 数据是通过如下步骤封装和传输的:
1. 应用层(HTTP):
- HTTP 客户端(如浏览器)发送 HTTP 请求,生成应用层的数据报文。这包括 HTTP 请求行、头部、以及消息体等内容。
2. 传输层(TCP):
- HTTP 的数据报文被传递到传输层,TCP 协议对其进行分段,并为每个段添加 TCP 头部信息(如序列号、端口号、校验和等)。这就是 TCP 数据段。
- TCP 确保分段的数据可靠传输,并在必要时进行重传和确认。
3. 网络层(IP):
- TCP 数据段传递到网络层,IP 协议负责对这些段进行进一步封装,加入源 IP 和目标 IP 地址,生成 IP 数据包。
4. 数据链路层:
- 最后,网络层的 IP 包被传递到数据链路层,在这里被封装成帧,准备在物理层上传输(如以太网帧)。
5. 物理层:
- 数据链路层的帧通过物理层(如电缆、无线等)在网络上传输。
WebSocket是什么
WebSocket 是一种(应用层的)网络通信协议,旨在实现客户端和服务器之间的全双工(双向)通信。它为实时 Web 应用程序提供了一种有效的解决方案,能够在一个持久连接上进行低延迟的数据交换。
HTTP是半双工通信。
WebSocket URL 格式
ws://[host]:[port]/[path]
ws:表示 WebSocket 协议(未加密)。
wss:表示安全的 WebSocket 协议(加密,类似于 HTTPS)。
[host]:服务器的主机名或 IP 地址。例如,example.com。
[port]:可选,指定端口号。如果省略,默认端口为 80(对于 ws)或 443(对于 wss)。
[path]:服务器上 WebSocket 服务的路径。例如,/chat。
ws和HTTP默认端口相同,都是80;wss和HTTPS默认端口相同,都是443。
通过http协议升级为websocket协议
- 客户端发起 HTTP 请求
客户端使用标准的 HTTP GET 方法,向服务器发送请求,同时在请求头中包含一些特别的字段,以指明希望升级到 WebSocket。 - 服务器响应
如果服务器支持 WebSocket 协议,它将会返回一个 101 状态码的 HTTP 响应,表明协议已成功升级。 - 建立 WebSocket 连接
一旦客户端收到带有 101 状态的响应,HTTP 连接就升级为 WebSocket 连接,双方可以开始以 WebSocket 格式进行双向通信。
ping-pong(心跳)机制
WebSocket 的 Ping-Pong 机制是维持连接稳定性的重要手段,确保双方在长时间不活动的情况下仍然能够保持连接有效性。
机制流程
- 连接建立后:当 WebSocket 连接建立时,双方开始通信并交换数据。
- 定时发送 Ping 帧: 一般情况下,服务器会设置一个定时器,定期向客户端发送 Ping 帧。例如,每隔 30 秒发送一次。
- 客户端回应 Pong 帧: 客户端在收到 Ping 帧后,立即发送 Pong 帧作为响应。这表明连接仍然有效且双方都能正常通信。
- 监测连接状态: 如果服务器在一定时间内没有收到客户端的 Pong 响应,它可能会认为连接已断开,可以选择关闭连接或尝试重新连接。
websocket关闭连接
使用 WebSocket API 中的 close() 方法。
close() 方法可以接受两个可选参数:
code: 一个整数,表示关闭连接的状态码。常用的状态码包括:
1000 - 正常关闭。
1001 - 由于端点迁移而关闭。
1002 - 收到无效的数据。
1003 - 收到无效的数据类型。
reason: 一个字符串,表示关闭连接的原因(可选)。
websocket安全性
使用 wss:// 协议而不是 ws://。WSS 是 WebSocket 协议的安全版本,它通过 TLS(传输层安全协议)对数据进行加密,确保在网络上传输的数据不被窃听或篡改。
使用wss时,必须提供有效的SSL/TLS证书。
WebSocket 和 HTTP 之间区别
特性 | HTTP | WebSocket |
---|---|---|
协议类型 | 无状态的请求-响应协议 | 全双工通信协议 |
连接方式 | 每次请求都要建立新的连接 | 一旦建立连接,可以持续使用同一连接 |
数据传输模式 | 单向(客户端发送请求,服务器响应) | 双向(客户端和服务器可以相互发送消息) |
性能效率 | 较高的延迟(每次请求都需建立连接) | 低延迟(长连接,减少握手次数) |
数据格式 | 通常为文本/HTML、JSON等 | 可以是文本、二进制数据 |
协议升级 | 不支持 | 支持通过 HTTP 升级到 WebSocket |
心跳机制 | 无 | 可以实现心跳机制以保持连接活跃 |
适用场景 | 适用于静态内容、REST API请求 | 适用于实时应用,如聊天、游戏等 |
安全性 | 使用 HTTPS 提供安全性 | 使用 WSS 提供加密和安全性 |
头部开销 | 请求和响应中都有额外的头部信息 | 连接后只有数据帧,头部信息较少 |