通信:(10) 应用层(第5层):http 与 https

1. http

1.1 浏览器访问一个网页的过程

  1. 用户输入网址(域名)

  2. 浏览器通过DNS服务器查询域名对应的IP地址(浏览器会将查询结果"域名→IP"缓存在本地)

  3. 浏览器与<Web服务器IP地址:80端口>建立TCP连接

  4. 浏览器在握手③中携带HTTP请求报文(指明要访问哪个html网页)

  5. 服务器返回HTTP响应报文(携带html文件)

  6. 如果html引用了其他n个元素,还需要n组HTTP请求&响应(持续、非持续工作方式有所区别)

1.2 http的五种工作方式

复制代码
--------------------------------------------------------------------------------
1. 非持续连接 (HTTP/1.0)
   特点: 一请求一连接,每次都要握手挥手
   RTT : 2N (N=资源数量)
--------------------------------------------------------------------------------
客户端                              服务器
  |                                   |
  |--- [SYN] -----------------------> |  (1. TCP握手)
  |<-- [SYN+ACK] -------------------- |
  |--- [ACK] -----------------------> |
  |                                   |
  |--- [REQ 1] --------------------- >|  (2. 传输对象1)
  |<-- [RES 1] ---------------------- |
  |                                   |
  |--- [FIN] -----------------------> |  (3. TCP挥手 - 关闭)
  |<-- [ACK+FIN] - - - - - - - - - - -|
  |                                   |
  |--- [SYN] -----------------------> |  (4. 重新握手 - 传输对象2)
  |<-- [SYN+ACK] -------------------- |
  |--- [ACK] -----------------------> |
  |--- [REQ 2] --------------------- >|
  |<-- [RES 2] ---------------------- |
  |                                   |
  | (每个对象都重复上述过程,效率极低)   | 
  |                                   |

--------------------------------------------------------------------------------
2. 持续连接 - 非流水线 (HTTP/1.1 默认)
   特点: 一连接多请求,但必须"等一个回一个" (串行)
   RTT : 2 + N
--------------------------------------------------------------------------------
客户端                              服务器
  |                                   |
  |=== TCP 三次握手 (仅1次) ==========>|
  |                                   |
  |--- [REQ 1] --------------------- >|
  |<-- [RES 1] ---------------------- |  (必须等RES1回来)
  |                                   |
  |--- [REQ 2] --------------------- >|  (才能发REQ2)
  |<-- [RES 2] ---------------------- |
  |                                   |
  |--- [REQ 3] --------------------- >|
  |<-- [RES 3] ---------------------- |
  |                                   |
  |=== TCP 四次挥手 (最后1次) ========>|
  |                                   |
  (存在队头阻塞:前一个慢,后面全等)

--------------------------------------------------------------------------------
3. 持续连接 - 流水线 (HTTP/1.1 可选)
   特点: 请求可连续发,但响应必须按序回
   RTT : 2 (理论最优,但有缺陷)
--------------------------------------------------------------------------------
客户端                              服务器
  |                                   |
  |=== TCP 三次握手 (仅1次) ==========>|
  |                                   |
  |--- [REQ 1] --------------------- >|
  |--- [REQ 2] --------------------- >|  (不用等,连续发)
  |--- [REQ 3] --------------------- >|
  |                                   |
  |<-- [RES 1] ---------------------- |  (必须按序返回)
  |<-- [RES 2] ---------------------- |  (若RES1慢,RES2/3做好了也得等)
  |<-- [RES 3] ---------------------- |
  |                                   |
  |=== TCP 四次挥手 ==================>|
  |                                   |
  (存在响应队头阻塞:浏览器默认禁用)

--------------------------------------------------------------------------------
4. HTTP/2 多路复用 (基于 TCP)
   特点: 二进制分帧,多流交错,应用层无阻塞
   RTT : 2 (但受限于TCP底层丢包阻塞)
--------------------------------------------------------------------------------
客户端                              服务器
  |                                   |
  |=== TCP 三次握手 + TLS 握手 =======>|
  |                                   |
  |--- [STR 1: HEADERS] ------------ >|  \
  |--- [STR 2: HEADERS] ------------ >|   } 请求乱序发送
  |--- [STR 3: DATA    ] ------------>|  /
  |                                   |
  |<-- [STR 2: DATA    ] -------------|  \
  |<-- [STR 1: DATA    ] -------------|   } 响应乱序返回 (靠流ID重组为一个完整消息)
  |<-- [STR 3: DATA    ] -------------|  /
  |     (帧交错传输,互不等待)          |
  |                                   |
  |=== TCP 四次挥手 ==================>|
  |                                   |
  (应用层无阻塞。但若TCP包丢失,所有流都会因TCP重传而阻塞)

--------------------------------------------------------------------------------
5. HTTP/3 (基于 QUIC/UDP)
   特点: UDP传输,0-RTT握手,彻底解决传输层阻塞
   RTT : 0-1 (最快)
--------------------------------------------------------------------------------
客户端                              服务器
  |                                  |
  |--- [ClientHello + REQ 1] ------->|  (0-RTT: 握手带数据一起发)
  |<-- [ServerHello + RES 1] --------|
  |                                  |
  |--- [STR 1: DATA ] -------------->|  
  |--- [STR 2: DATA ] -------------->|  真正的独立并行
  |                                  |
  |<-- [STR 2: DATA ] ---------------|  
  |<-- [STR 1: DATA ] ---------------|  某流丢包不影响其他流
  |     (QUIC协议层独立重传)           |
  |                                  |
  | (连接迁移: IP变了也不用重新握手)    |
  |                                  |
  (彻底解决应用层 + 传输层队头阻塞)
属性 1. 非持续连接 (HTTP/1.0) 2. 持续连接- 非流水线 (HTTP/1.1 默认) 3. 持续连接- 流水线 (HTTP/1.1 可选) 4. HTTP/2 多路复用 (基于 TCP) 5. HTTP/3 (QUIC) (基于 UDP)
核心机制 一请求一连接,用完即毁 一连接多请求 串行处理 一连接多请求 并行 发,串行回 一连接多流 帧级交错并发 一连接多流 独立流控制
传输层协议 TCP TCP TCP TCP QUIC (UDP)
数据格式 纯文本 纯文本 纯文本 二进制分帧 二进制分帧
TCP连接数 (N个资源) N 条 (频繁创建销毁) 1 条 (复用) 1 条 (复用) 1 条 (复用) 1 条 (复用,基于UDP)
逻辑流数量 1 流/连接 1 流/连接 1 流/连接 多流/连接 (Stream ID区分) 多流/连接 (Stream ID区分)
队头阻塞 无 **严重:**请求层阻塞,前一个没回,后一个不发 **中等:**响应层阻塞,前一个没回完,后一个不回 部分解决: 应用层无阻塞, 传输层阻塞 ,TCP丢包卡死所有流 **彻底解决:**应用层 + 传输层均无阻塞,丢包只影响当前流
头部压缩 无 无 无 HPACK消除重复头部 QPACK解决HPACK依赖顺序问题
连接迁移 不支持 不支持 不支持 不支持 支持
加密要求 可选 (通常明文) 可选 (通常明文) 可选 (通常明文) 标准未强制 但浏览器强制HTTPS 强制加密,强制HTTPS
浏览器现状 已淘汰 广泛兼容 因队头阻塞默认禁用 主流标准 快速普及

1.3 http2

1.3.1 二进制分帧层

HTTP/2 在应用层与传输层之间引入了一个二进制分帧层。

  • 文本转二进制:HTTP/1.x 的 ASCII 文本报文被转换为二进制格式。
  • 帧 :通信的最小单位。每个帧包含帧头和负载,帧头内包含流 ID。
  • 消息:逻辑上的完整 HTTP 请求或响应,由一个或多个帧组成。

1.3.2 多路复用与流

  • 流 :应用协议自定义的,每个流有唯一的流 ID(奇数为客户端发起,偶数为服务器发起)。
  • 交错传输 :
    • 在同一个 TCP 连接上,不同流的帧可以任意交错发送。
    • 客户端发送多个帧,每个帧的流ID可以不同。
    • 解决应用层队头阻塞 :接收端根据 流 ID 将帧重组为完整的消息。流1 的大数据块传输不会阻塞 流2 的小数据块发送。

1.3.3 头部压缩 (HPACK)

  • 问题 :HTTP/1.x 头部冗余大(如 User-Agent, Cookie 重复传输),且未压缩。
  • 机制 :
    • 静态表 & 动态表:维护索引表,将头部字段映射为整数索引。
    • 哈夫曼编码:对头部值进行无损压缩。
    • 上下文更新:发送端和接收端同步维护动态表状态,仅发送增量变化。

1.3.4 依赖与优先级

  • 客户端可在 HEADERS 帧中指定流的依赖树(Parent Stream)和权重(1-256)。
  • 服务器据此调度发送顺序,优先传输关键资源(如 HTML/CSS),但这只是建议性的,不保证绝对顺序。

1.3.5 局限性:传输层TCP 队头阻塞

尽管应用层解决了阻塞,但底层仍依赖 TCP。

  • TCP 特性 :面向字节流、可靠、严格有序。
  • 阻塞机制:若 TCP 序列号 N 的包丢失,接收端 TCP 栈会缓存 N+1 及之后的所有数据包,直到 N 重传成功。
  • 后果 :即使 HTTP/2 的 Stream 1 和 Stream 2 互不相关,只要底层的 TCP 包丢失,该连接上的所有 Stream 都会暂停交付给应用层 。这就是传输层队头阻塞。

1.4 http3

HTTP/3 将传输层从 TCP 替换为基于 UDP 的 QUIC 协议。它将 TLS 1.3 和可靠传输逻辑直接集成在用户态库中。

1.4.1 协议栈重构

  • HTTP/2: HTTP/2 -> TLS 1.3 -> TCP -> IP
  • HTTP/3 : HTTP/3 ->QUIC (内置 TLS 1.3) -> UDP -> IP
  • 意义 :绕过内核态 TCP 栈的限制,在应用层实现拥塞控制、重传和加密,迭代更灵活。

1.4.2 流级多路复用与独立可靠性

QUIC 用 UDP 在应用层实现了类似 TCP 的可靠传输,但粒度不同:

  • 多流架构 :QUIC 连接包含多个独立的 Streams。
  • 独立序号空间:每个 Stream 有自己独立的字节偏移量和确认机制。
  • 解决传输层队头阻塞 :
    • 若 Stream A 的某个 Packet 丢失,QUIC 仅重传该 Packet。
    • Stream B、C 的数据包即使物理上紧随其后到达,也能立即交付给应用层,无需等待 Stream A 的重传。
    • 结论:丢包影响仅限于当前流,不影响同一连接下的其他流。

1.4.3 0-RTT 握手与连接迁移

  • 快速握手 (0-RTT) :
    • 利用 TLS 1.3 的会话恢复机制。客户端在第一个数据包中直接携带加密的应用数据。
    • 若服务端接受,可直接处理请求并返回响应,实现 0-RTT 延迟。
  • 连接迁移 :
    • 问题:TCP 使用 (SrcIP, SrcPort, DstIP, DstPort) 四元组标识连接。网络切换(WiFi->4G)导致 IP 变化,TCP 连接断开。
    • QUIC 方案 :使用 Connection ID (CID) 标识连接,与 IP/Port 解耦。
    • 过程:客户端 IP 变更后,后续数据包携带相同的 CID,服务端识别后继续传输,无需重新握手。

1.4.4 头部压缩 (QPACK)

  • 问题 :HTTP/2 的 HPACK 依赖严格的帧顺序(动态表更新必须按序),若前一个帧丢失,后续帧无法解码,导致应用层队头阻塞复现。
  • QPACK 改进 :
    • 引入独立的控制流来同步动态表更新。
    • 允许头部块在不阻塞的情况下引用动态表条目。
    • 即使更新指令丢失,仅影响依赖该指令的特定流,不阻塞其他流。

1.4.5 拥塞控制

  • QUIC 在用户态实现了可插拔的拥塞控制算法(默认通常为 CUBIC 或 BBR)。
  • 由于运行在用户态,开发者可以快速部署新的拥塞控制算法,无需等待操作系统内核升级。

2. https

对比维度 HTTP (明文) HTTPS (加密)
端口号 80 443,防火墙通常只开放443给Web
安全性 **低,**明文传输 **高,**加密传输
加密机制 无 SSL/TLS 协议(对称加密+非对称加密+哈希),建立连接前先交换密钥,后续数据全程加密
身份认证 无 数字证书,验证服务器身份
握手过程 TCP 3次握手 TCP 3次握手 + TLS 握手 多了密钥协商和证书验证
HTTP/2支持 浏览器**不支持,**实际标准未强制但浏览器强制 浏览器强制要求,仅对HTTPS开启H2
HTTP/3支持 不支持 **支持,**HTTP/3 本身就是基于加密设计的
相关推荐
2501_915106322 小时前
抓包抓到乱码或压缩字节怎么解析,TraceEagle五种查看模式和一键解码
网络协议·计算机网络·网络安全·ios·adb·https·udp
情 九2 小时前
MCP 实战 06:把 HTTP 接口接成工具,让 AI 帮你查数据
人工智能·网络协议·http·mcp
Da Da 泓3 小时前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目
万联WANFLOW11 小时前
异地组网速度忽快忽慢到底怎么回事?直连与中继的判断方法和处理步骤
运维·网络·网络协议·p2p
步行cgn13 小时前
HTTP 请求报文结构详解:请求行、请求头、请求体各自的作用
网络·网络协议·http
OpenLoong 开源社区16 小时前
打破 NAT 限制,零侵入跨网络通信:基于 WebRTC 的透明 TCP 隧道跨网络通信方案
网络协议·tcp/ip·开源·webrtc·openloong开源社区
从琳开始98916 小时前
从Socket到UDP回显服务器:Java网络编程完整指南
java·网络·网络协议·udp·java-ee
明天也要努力学习1 天前
HTTP 协议的基本格式和 fiddler 的用法
网络协议·http·fiddler
cpolar技术支持1 天前
网关加 gzip,同时开启 chunked,下载回来的包解不开:把两层编码的解压顺序与长度核对做成只读页
python·http·网络编程·socket·内网穿透
Tel199253080041 天前
温度湿度信号转WiFi/MQTT/Modbus TCP采集模块 无线传输
网络·网络协议·tcp/ip·工业自动化·工控设备