通信:(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 替换为基于 UDPQUIC 协议。它将 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 在用户态实现了可插拔的拥塞控制算法(默认通常为 CUBICBBR)。
  • 由于运行在用户态,开发者可以快速部署新的拥塞控制算法,无需等待操作系统内核升级。

2. https

对比维度 HTTP (明文) HTTPS (加密)
端口号 80 443,防火墙通常只开放443给Web
安全性 **低,**明文传输 **高,**加密传输
加密机制 SSL/TLS 协议(对称加密+非对称加密+哈希),建立连接前先交换密钥,后续数据全程加密
身份认证 数字证书,验证服务器身份
握手过程 TCP 3次握手 TCP 3次握手 + TLS 握手 多了密钥协商和证书验证
HTTP/2支持 浏览器**不支持,**实际标准未强制但浏览器强制 浏览器强制要求,仅对HTTPS开启H2
HTTP/3支持 不支持 **支持,**HTTP/3 本身就是基于加密设计的
相关推荐
liulilittle2 小时前
OPENPPP2静态隧道UDP中断问题排查与解决
网络·网络协议·ubuntu·udp·debian·信息与通信·通信
会员果汁3 小时前
TCP/IP网络-网络接口层标准
网络·网络协议·tcp/ip
有浔则灵3 小时前
Go 语言 net/http 包详解:从入门到实战
http·golang·xcode
吠品3 小时前
告别异步等待!UniApp uni.getSystemInfoSync:即时获取设备信息的效率利器
https·ssl
铭哥的编程日记4 小时前
DNS解析 HTTP TCP/IP ICMP/NAT/NAPT相关知识点
网络协议·tcp/ip·http
小江的记录本4 小时前
【AOP】AOP-面向切面编程 (系统性知识体系全解)
java·前端·后端·python·网络协议·青少年编程·代理模式
安逸sgr4 小时前
MCP 协议深度解析(一):MCP 协议概览与架构设计
服务器·网络·人工智能·网络协议·agent·mcp
cheems952715 小时前
[网络原理]http协议理论基础以及wireshark抓包分析(二)
网络·http·wireshark
北京耐用通信17 小时前
耐达讯自动化CC-Link IE转DeviceNet网关:破解三菱与欧姆龙PLC协同壁垒的工业实践
人工智能·科技·物联网·网络协议·自动化