目录
-
- HTTP是什么
- HTTP与TCP关系
- 数据封装传输过程
-
- [1. **协议层次模型**:](#1. 协议层次模型:)
- [2. **封装过程**:](#2. 封装过程:)
-
- [1. **应用层(HTTP)**:](#1. 应用层(HTTP):)
- [2. **传输层(TCP)**:](#2. 传输层(TCP):)
- [3. **网络层(IP)**:](#3. 网络层(IP):)
- [4. **数据链路层**:](#4. 数据链路层:)
- [5. **物理层**:](#5. 物理层:)
- WebSocket是什么
-
- [WebSocket URL 格式](#WebSocket URL 格式)
- 通过http协议升级为websocket协议
- ping-pong(心跳)机制
- websocket关闭连接
- websocket安全性
- [WebSocket 和 HTTP 之间区别](#WebSocket 和 HTTP 之间区别)
HTTP是什么
HTTP(超文本传输协议,Hypertext Transfer Protocol)是一种用于在网络上传输数据的协议。它是Web上信息传递的基础,允许客户端(通常是浏览器)和服务器之间交换文本、图像、视频和其他类型的数据。HTTP是一种无状态的请求-响应协议 ,意味着每次请求都是独立的,服务器不会记住之前的请求。
即请求一次,响应一次。
那么问题来了,HTTP是请求一次,响应一次,服务器不能给客户端发送信息。但是HTTP通过TCP建立长连接,为什么客户端服务器不能持续通信?
- HTTP的请求-响应模型是单向的无状态的
请求-响应模型
- 单向通信:在 HTTP 中,通信的基本模型是请求-响应模式。客户端发出请求后,服务器处理请求并返回响应。在这个过程中,客户端必须首先发起请求,服务器才能返回数据。
- 无状态:HTTP 是无状态的协议,服务器不会记住客户端的请求历史。这意味着每次请求都是独立的,服务器无法主动向客户端发送信息。
- 即使 TCP 连接保持开放,服务器仍然不能主动向客户端发送数据
- 持久连接:在 HTTP/1.1 中,引入了持久连接(Keep-Alive),允许多个 HTTP 请求/响应在同一个 TCP
连接上进行,而无需为每个请求建立新的 TCP 连接。这降低了连接建立和关闭的开销。- 连接的生存时间:持久连接的存在并不意味着客户端和服务器可以在同一连接上进行持续的双向通信。即使 TCP连接保持开放,服务器仍然不能主动向客户端发送数据,客户端必须先发送请求。
- HTTP/2改进的服务器推送并不是持续的双向通信
- 多路复用:在 HTTP/2中,虽然仍然遵循请求-响应模型,但允许在同一个连接上并行处理多个请求和响应。这种多路复用可以提高效率,减少延迟。
- 服务器推送:HTTP/2引入了服务器推送的功能,服务器可以在客户端发出请求之前,主动发送某些资源到客户端。这种方式虽然实现了服务器主动发送数据的能力,但仍然是在特定条件下进行的,并不是持续的双向通信。
- 持续通信的实现,WebSocket
- WebSocket:对于需要实时双向通信的应用,WebSocket 协议被引入。WebSocket允许在同一连接上进行持续的双向数据交换,客户端和服务器可以在任何时候发送和接收数据。这使得 WebSocket适用于实时聊天、在线游戏等需要频繁更新数据的场景。
HTTP局限性(HTTP1.1)
- 因为HTTP是无状态,半双工的通信。意味着客户端给服务端发请求或是服务端给客户端发请求,都需要建立TCP连接,一来一回都要三次握手,会造成资源浪费和延迟。
- 安全性,HTTP传输明文不安全,需要HTTPS加强安全性。
- 适应性差,HTTP设计初衷是用于静态页面,对动态内容支持不灵活。
请求和响应
HTTP 请求由客户端(通常是浏览器)发起,向服务器请求资源。一个标准的 HTTP 请求包括以下几个部分:
请求行,请求头,请求体
bash
GET /index.html HTTP/1.1
请求行
请求行包含三个部分:
请求方法:指示要执行的操作,如 GET、POST、PUT、DELETE 等。
请求 URI:指定要访问的资源的地址。
HTTP版本:指明使用的 HTTP 版本,例如 HTTP/1.1。
请求头请求头部包含多个键值对,用于传递客户端的信息和请求的附加参数。常见的请求头包括:
Host:请求的服务器名称和端口号。
User-Agent:客户端软件的名称和版本信息。
Accept:客户端可接受的内容类型。
Content-Type:发送数据的内容类型(对于 POST 和 PUT 请求)。
Authorization:身份验证信息。
请求体请求体用于在 POST、PUT 等方法中发送数据。例如,在表单提交中,数据通常会包含在请求体中。
bash
HTTP/1.1 200 OK
状态行
状态行包含三个部分:
HTTP 版本:指明使用的 HTTP 版本。
状态码:表示请求的处理结果(如成功、失败、错误等)。
状态描述:状态码的文本描述。
响应头响应头部包含多个键值对,提供关于服务器和响应的附加信息。常见的响应头包括:
Content-Type:响应内容的类型(如 text/html、application/json)。 服务器回复的数据格式
Content-Length:响应体的长度(以字节为单位)。
Set-Cookie:服务器发送的 cookie。
Cache-Control:缓存策略。
响应体响应体是实际传递给客户端的数据,可能是 HTML 页面、JSON 数据、图像等。对于成功的请求,响应体通常包含所请求的资源。
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 格式
cpp
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 提供加密和安全性 |
头部开销 | 请求和响应中都有额外的头部信息 | 连接后只有数据帧,头部信息较少 |