18.网络协议原理总结
# 网络协议原理 · 全系列总结
17 篇网络协议文章的核心提炼。每篇一张速通卡、一段展开、一句话带走。
# 0.阅读导航
# 0.1 按场景读
| 你遇到了什么 | 先读哪篇 |
|---|---|
| 浏览器输入URL后发生了什么 | → §01 新闻看网络(HTTP全链路)→ §04 请求流程 |
| 网站如何保证数据安全不被窃听 | → §02 购物加密(HTTPS/TLS)→ §12 HTTPS策略 |
| 新手如何从零部署一个网站 | → §03 部署电商网站(全栈部署) |
| TCP和UDP到底该选哪个 | → §06 TCP/UDP → §08 传输数据 |
| 服务QPS上不去,怀疑网络瓶颈 | → §10 HTTP服务 → §13 连接和跳转 → §15 排查故障 |
| 想实现实时推送/聊天/通知 | → §16 WebSocket → §17 HTTP3/QUIC |
| DNS解析慢/被劫持 | → §09 域名解析 |
| 前端调接口跨域报错 | → §11 HTTP协议(CORS/头)→ §14 代理缓存 |
| 接口响应慢,想上CDN | → §14 代理缓存 → §10 HTTP服务 |
| 想从HTTP升级到HTTPS | → §02 加密 → §12 HTTPS策略 |
| Socket编程卡住 | → §07 Socket → §05 编程模型 |
| 网络分层搞不清 | → §04 请求流程(OSI七层) |
# 0.2 按层次读
第 1 层·全景入门 → §01 新闻 → §04 通用流程
第 2 层·网络基础 → §05 编程模型(IP/端口/DNS)
第 3 层·传输层 → §06 TCP/UDP → §17 QUIC
第 4 层·应用协议 → §10 HTTP服务 → §11 HTTP协议 → §12 HTTPS → §13 连接 → §14 缓存代理
第 5 层·数据 → §08 序列化 → §07 Socket
第 6 层·域名 → §09 DNS
第 7 层·实战 → §02 加密全链路 → §03 电商部署 → §15 排障 → §16 WebSocket
# 1.第 01 篇·通过看新闻熟悉网络
# 1.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 手机上点一条新闻链接一直转圈打不开 |
| 暴露问题 | 大多数开发者只知道"调接口",不知道从输入URL到页面渲染中间过了十道关卡 |
| 核心知识 | URL解析 → DNS → TCP三次握手 → TLS → HTTP请求 → 服务器处理 → 响应 → 资源加载 → 页面渲染 |
| 架构主线 | 一个HTTP请求的9步生命周期——每一步背后都是一整套协议栈在协作 |
| 加深理解 | 你能说出curl -v https://example.com输出里每一行的含义吗?——答不出来说明你没理解HTTP的完整链路 |
# 1.2 展开:HTTP请求的九个环节
九步全链路:① 输入URL解析 ② DNS查询域名→IP ③ TCP三次握手(SYN-SYN/ACK-ACK)④ TLS握手(ClientHello→ServerHello→密钥交换)⑤ 构建HTTP请求(请求行+请求头+请求体)⑥ 发送请求 ⑦ 服务器处理并构建响应 ⑧ 接收响应(状态码+响应头+响应体)⑨ 浏览器解析HTML→加载CSS/JS→渲染页面。
关键性能数字:DNS≈50ms,TCP握手≈30ms(1个RTT),TLS握手≈100ms(2个RTT),HTTP响应≈50ms,页面渲染≈200ms。一次完整的页面加载≈400ms+。
核心原理:HTTP是无状态协议——每次请求独立,服务器不记住你。Cookie/Session是应用层补的状态机制,不是协议能力。这个设计让HTTP可以无限水平扩展。
# 1.3 诊断信号灯
| 信号 | 行动 |
|---|---|
| 页面白屏转圈 | DNS或TCP连接失败 → nslookup + telnet |
| 页面出来了但没样式 | 静态资源CDN挂了或CSS 404 |
| HTTPS页面提示"不安全" | 证书过期或域名不匹配 |
# 1.4 一句话拎走
从URL到页面,每一步都是协议栈的一次接力。你看到的"一个网页",底层是九层协议协作的结果。
# 2.第 02 篇·通过购物熟悉加密
# 2.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 在外卖App里下单输入密码——你的支付密码会不会在半路被截走? |
| 暴露问题 | 很多人以为HTTPS = "安全的HTTP",但不知道它是六层防护叠加的结果 |
| 核心知识 | 对称加密(AES)→ 非对称加密(RSA/ECDHE)→ 数字证书(X.509)→ 证书链(Root→Intermediate→Server)→ 证书吊销(CRL/OCSP)→ 重放与篡改防护 |
| 加深理解 | 如果你的App只用了AES加密没有证书,攻击者可以做什么?——中间人攻击:伪造服务器,替换公钥 |
# 2.2 展开:HTTPS的六层防护
对称加密的数学根基:AES基于替换(Substitution)与扩散(Permutation),10轮AES-128后一个比特的改变让整个密文完全不同。
非对称加密的陷门函数:RSA基于"大整数分解"——两个大素数相乘容易,反推极难。256位ECC等同于3072位RSA的安全强度。
证书链的信任传递:Root CA(自签名,预装OS)→ Intermediate CA(根签发)→ Server证书。任何一环断裂,整个信任链崩塌。
证书吊销:CRL(证书吊销列表,定期下载)vs OCSP(在线实时查询)→ OCSP Stapling(服务器代查,附在TLS握手中)。
# 2.3 诊断信号灯
| 信号 | 行动 |
|---|---|
| App提示"不受信任的证书" | 检查证书链完整性 + 证书是否过期 |
| 浏览器地址栏🔒图标灰色/红色 | 混合内容(HTTP资源在HTTPS页面中) |
# 2.4 一句话拎走
地址栏那把🔒的背后不是一道锁,是六层防护链——任何一环断裂,整条链作废。
# 3.第 03 篇·从0到1部署电商网站
# 3.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 从零搭建一个正经的生产级电商网站——不是npm run dev就能上线那种 |
| 暴露问题 | 本地能跑≠生产能跑——部署涉及DNS、Nginx、应用服务器、数据库、缓存、CDN、HTTPS七个环节 |
| 核心知识 | Nginx反向代理 + SSL终止 → Tomcat/Node应用服务器 → MySQL主从 → Redis缓存 → CDN分发 → HTTPS全站加密 |
| 加深理解 | 你的个人项目"上线"后,经历过几次别人打不开的情况?——如果超过0次,读这篇 |
# 3.2 展开:Web部署的三层模型
接入层(Nginx):反向代理 + SSL终止 + 静态文件。核心指标:并发连接数。
应用层(Tomcat/Node/Go):业务逻辑。核心指标:P50/P99延迟。
数据层(MySQL/Redis/MQ):持久化 + 缓存 + 异步。核心指标:QPS + 复制延迟。
三层解耦的意义:任何一层独立扩容,不影响其他层。
# 3.3 一句话拎走
部署的本质是三层模型:接入层扛流量、应用层算业务、数据层存状态——三层解耦,天下无敌。
# 4.第 04 篇·请求网络的通用流程
# 4.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 你写的fetch('/api/user')在底层究竟变成了什么 |
| 暴露问题 | 大多数前端只知道调接口,后端只知道起服务——中间隔了四层协议谁都没搞清 |
| 核心知识 | TCP/IP四层模型(应用层→传输层→网络层→链路层)+ 封装/解封装沙漏模型 |
| 加深理解 | 一个1KB的HTTP Body经过四层封装后在线路上传输约1.6KB——封装开销约60% |
# 4.2 展开:沙漏模型
| 层 | 数据单元 | 添加头部 | 大小增量 |
|---|---|---|---|
| 应用层 | Message | HTTP头(~500B) | 原始 |
| 传输层 | Segment | TCP头(20B) | +20B |
| 网络层 | Packet | IP头(20B) | +40B |
| 链路层 | Frame | MAC头(14B)+FCS(4B) | +58B |
核心原理:封装/解封装——上层数据被下层包装,下层透明传输给上层。这个设计让IPv4升级到IPv6时HTTP完全不用改。
# 4.3 一句话拎走
网络通信就像俄罗斯套娃——你发的数据被逐层包了四层皮,对端再逐层拆开。
# 5.第 05 篇·网络编程模型的概念
# 5.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 万人聊天室项目——10000人在线,服务器该怎么设计? |
| 暴露问题 | "我写个ServerSocket.accept()就以为是服务器了"——IP、端口、DNS、I/O模型一个都没想 |
| 核心知识 | IP(机器在哪)→ 端口(找哪个进程)→ DNS(名字→IP映射)→ Socket(编程接口)→ I/O模型(BIO/NIO/AIO) |
| 加深理解 | 127.0.0.1:8080——127.0.0.1是IP,8080是端口,冒号分开——但这行字的底层承载了TCP三次握手+字节流+BIO模型 |
# 5.2 展开:Socket的本质
Socket不是协议,是操作系统的编程抽象。它把TCP/UDP协议栈封装成文件操作接口(socket/bind/listen/accept/read/write)。一旦理解"网络连接=特殊文件描述符",epoll/select就自然了。
C10K问题:当并发连接过万时,传统的"一个连接一个线程"模式崩溃(内存+上下文切换开销),事件驱动模型(单线程epoll)是解。
# 5.3 诊断信号灯
| 信号 | 行动 |
|---|---|
bind()报Address already in use | SO_REUSEADDR + 检查TIME_WAIT |
| 服务起在本机别人连不上 | 检查监听的是127.0.0.1还是0.0.0.0 |
# 5.4 一句话拎走
IP定位机器,端口定位进程,DNS把名字翻译成IP。记住这三句话,你就理解了一半的网络编程。
# 6.第 06 篇·传输协议TCP和UDP
# 6.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 视频卡了0.1秒 vs 转账少了0.1元——哪个更不能忍受? |
| 暴露问题 | TCP和UDP不是"谁更好"的问题,是"你更怕丢还是更怕慢" |
| 核心知识 | TCP四支柱:ACK+RTO(不丢)、滑动窗口(吞吐)、拥塞控制(不堵)、流量控制(不撑) |
| 加深理解 | iperf3 -u测一下UDP吞吐,看看丢包率——你会发现UDP不丢包的QPS是有上限的 |
# 6.2 展开:选择决策树
| 场景 | 选谁 | 为什么 |
|---|---|---|
| 支付/订单 | TCP | 丢一包=丢一笔钱 |
| 视频/语音 | UDP | 延迟>200ms就卡顿,丢几帧无感 |
| DNS查询 | UDP | 单包请求,超时重试即可 |
| 文件下载 | TCP | 少一个字节文件就损坏 |
| 游戏 | UDP | 100ms前的位置数据已经没用了 |
| HTTP/3 | QUIC(UDP) | 取TCP之长补其短 |
# 6.3 一句话拎走
要可靠选TCP,要速度选UDP,两个都要就用QUIC。
# 7.第 07 篇·Socket的发展和设计
# 7.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 聊天服务——BIO单线程最多服务1个人,多线程撑到1000人,NIO+epoll突破10000人 |
| 暴露问题 | Socket API看似简单——accept/read/write四个函数,但选错I/O模型性能差100倍 |
| 核心知识 | Socket状态机(CLOSED→LISTEN→SYN_RCVD→ESTABLISHED→FIN_WAIT→TIME_WAIT)→ BIO vs NIO vs AIO |
| 加深理解 | netstat -an | grep TIME_WAIT 数一下——超过1000个就该上连接池了 |
# 7.2 展开:Socket状态机
TCP Socket从CLOSED开始,connect()进入SYN_SENT,对方回应后ESTABLISHED。关闭时经历FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT(2MSL≈60s) → CLOSED。
TIME_WAIT持续60-120秒,确保最后的ACK被对方收到。短连接频繁创建/销毁的服务器会累积大量TIME_WAIT——连接池复用是根本解决方案。
聊天服务四次进化:BIO单线程(1连接)→ 多线程(1000连接)→ 线程池+NIO(10000连接)→ epoll+事件驱动(100000连接)。
# 7.3 一句话拎走
Socket不是协议,是操作系统的文件抽象。理解
TIME_WAIT,你就理解了为什么需要连接池。
# 8.第 08 篇·传输数据的设计思想
# 8.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 文件传输工具——发送方是C写的,接收方是Java写的,数据结构要怎么传? |
| 暴露问题 | 内存里的对象不能直接写进Socket——必须先变成字节流(序列化),对端再变回对象(反序列化) |
| 核心知识 | 序列化矛盾:灵活性(JSON可读但慢)vs 效率(Protobuf快但需schema)→ 选型三标准:数据量/演化需求/跨语言 |
| 加深理解 | sizeof(int)在32位和64位机器上一样吗?——结构体对齐导致大小端差异 |
# 8.2 展开:序列化选型
| 格式 | 速度 | 大小 | 可读 | 跨语言 | 适用 |
|---|---|---|---|---|---|
| JSON | 慢 | 大 | ✅ | ✅ | API、配置 |
| Protobuf | 极快 | 极小 | ❌ | ✅ | 微服务、大流量 |
| MessagePack | 中 | 中 | ❌ | ✅ | JSON替代 |
| Java序列化 | 中 | 大 | ❌ | ❌ | Java生态内 |
文件传输四次进化:裸字节传输(无边界)→ 文本序列化(可读但慢)→ 二进制序列化(高效但有门槛)→ 零拷贝(sendfile逼近极限)。
# 8.3 一句话拎走
序列化的本质是约定——发送方和接收方对"这串字节怎么解释"达成一致。约定越紧,效率越高;约定越松,灵活性越好。
# 9.第 09 篇·网络域名解析的流程
# 9.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | "为什么我改了DNS记录,48小时后才生效?" |
| 暴露问题 | DNS不是"一个数据库",是全球最大的分布式系统——缓存层级决定了生效延迟 |
| 核心知识 | 递归查询 vs 迭代查询 → DNS缓存层级(本地→路由器→ISP→权威DNS)→ 根服务器13组 → 顶级域(.com/.cn)→ 权威DNS |
| 加深理解 | dig +trace example.com 能看到从根开始的完整解析路径——试一次,胜过看十页文档 |
# 9.2 展开:DNS的分布式设计
三级层级缓存:浏览器缓存(~1分钟)→ OS缓存(hosts文件)→ 路由器缓存 → ISP递归DNS缓存 → 权威DNS。每一级都有TTL,层级越高生效越快。
根服务器:全球13组(A-M),不是13台——每组有几百台镜像。根不存域名记录,只告诉你".com该问谁"。
DNS优化:HTTPDNS(绕过运营商劫持)、EDNS Client Subnet(CDN精准调度)、Anycast(就近接入)。
# 9.3 一句话拎走
DNS是全球最大的分布式数据库。它不存所有答案,但知道每条问题该找谁。
# 10.第 10 篇·HTTP服务设计流程
# 10.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 服务从100 QPS起步,一路优化到10000 QPS——每次瓶颈在哪? |
| 暴露问题 | "加机器"不是万能药——先看看瓶颈在连接层、应用层还是数据层 |
| 核心知识 | HTTP服务三大并发模型:多进程(Apache)→ 多线程(Tomcat)→ 事件驱动(Nginx/Node) |
| 加深理解 | 你的服务是CPU密集型还是I/O密集型?——前者用多线程,后者用事件驱动 |
# 10.2 展开:HTTP服务性能四次进化
| 代 | 架构 | 瓶颈 | QPS上限 |
|---|---|---|---|
| V1 单线程原型 | 一个请求阻塞全局 | 串行处理 | ~100 |
| V2 多线程 | 线程池复用 | 线程切换+内存 | ~3000 |
| V3 Nginx反向代理 | 架构分层+负载均衡 | 后端成为瓶颈 | ~10000 |
| V4 全链路优化 | 零拷贝+HTTP/2+CDN | 物理极限 | ~50000+ |
# 10.3 一句话拎走
HTTP服务的进化史就是**从"能跑就行"到"榨干每一毫秒"**的优化史。
# 11.第 11 篇·HTTP协议设计思想
# 11.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 前端调接口跨域报错、POST和PUT到底怎么选、状态码太多记不住 |
| 暴露问题 | HTTP不是"GET+POST就够了"——动词语义、状态码、Header设计都有规范 |
| 核心知识 | REST成熟度四级(Level 0单端点→Level 4 HATEOAS)→ HTTP动词语义(GET安全幂等/POST非幂等/PUT幂等/DELETE幂等)→ 状态码分类(2xx成功/3xx重定向/4xx客户端错/5xx服务端错) |
| 加深理解 | 你的API里POST /getUser和GET /deleteOrder占多少比例?——这说明REST Level 0 |
# 11.2 展开:REST成熟度
| 级别 | 特征 | 例子 |
|---|---|---|
| Level 0 | 单一端点,POST区分操作 | SOAP |
| Level 1 | 有资源URL | /users/123 |
| Level 2 | 使用HTTP动词 | GET/POST/PUT/DELETE |
| Level 3 | HATEOAS | 响应包含下一步可用的链接 |
核心原理:REST不是协议,是架构风格。它的核心约束:资源URL标识、统一接口、无状态、超媒体驱动。
# 11.3 一句话拎走
HTTP不是管道工,是语义层。
GET是读、POST是创建、PUT是全量更新、DELETE是删除——动词用对了,接口就自解释了一半。
# 12.第 12 篇·HTTPS协议设计策略
# 12.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 小程序上线被拒——"必须使用HTTPS"。配了证书结果握手要400ms |
| 暴露问题 | 免费证书(Let's Encrypt)和收费证书(OV/EV)差在哪?TLS握手为什么这么慢? |
| 核心知识 | TLS 1.2握手2-RTT → TLS 1.3握手1-RTT → 0-RTT(PSK复用)→ ECDHE密钥交换(前向安全) |
| 加深理解 | 你的Nginx配置里ssl_ciphers列了一串——你确定每一组都理解吗? |
# 12.2 展开:TLS握手的高昂代价
TLS 1.2:ClientHello → ServerHello+证书 → ClientKeyExchange → Finished(2-RTT,~200ms@100ms RTT)
TLS 1.3:将ClientKeyExchange提前到第一轮,合并为1-RTT。
0-RTT:利用上次会话PSK,第一个包就携带加密数据。代价:重放攻击风险。
安全与性能的永恒博弈:OCSP Stapling(服务器代查证书状态)、False Start(不等Finished先发数据)、Session Ticket(复用会话密钥)。
# 12.3 一句话拎走
TLS握手的每100ms,都是用户体验的流失。TLS 1.3做对了一件事:把安全协商压缩成一场最快对话。
# 13.第 13 篇·HTTP连接和跳转
# 13.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 从HTTP/1.0到HTTP/3,连接方式的四次革命——每次都在压缩RTT |
| 暴露问题 | 为什么HTTP/1.1比1.0快?为什么HTTP/2比1.1快?为什么HTTP/3要换UDP? |
| 核心知识 | 短连接→长连接(Keep-Alive)→多路复用(HTTP/2 Stream)→0-RTT(QUIC) |
| 加深理解 | 在Chrome DevTools Network面板看Protocol列——你的网站还在用HTTP/1.1吗? |
# 13.2 展开:连接的代价
HTTP/1.0:每请求一个TCP连接(3次握手+2次TLS=5个RTT)。HTTP/1.1:Keep-Alive复用连接,省重复握手。HTTP/2:同一连接多路复用(多个Stream并发,互不阻塞)。HTTP/3(QUIC):基于UDP,Connection ID替代四元组,换WiFi不断连。
301 vs 302:301永久重定向(浏览器缓存,不再问原地址),302临时重定向(每次还问原地址)。SEO关键差异。
# 13.3 一句话拎走
从HTTP/1.0到HTTP/3的进化主线只有一条:把RTT数压缩到极限。
# 14.第 14 篇·HTTP代理和缓存设计
# 14.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 大促时首页压力暴增——加了缓存反而返回旧数据 |
| 暴露问题 | 缓存一致性是分布式系统最头疼的问题——"什么时候删缓存"比"怎么加缓存"难十倍 |
| 核心知识 | 正向代理(替客户端)vs 反向代理(替服务器)vs 透明代理 → CDN本质=全球反向代理网络 → Cache-Control/ETag/Expires |
| 加深理解 | curl -I https://example.com 看响应头——Cache-Control告诉你缓存策略,ETag是协商缓存的钥匙 |
# 14.2 展开:代理的三重身份
| 类型 | 谁部署 | 受益方 | 例子 |
|---|---|---|---|
| 正向代理 | 客户端 | 客户端 | 公司内网代理、VPN |
| 反向代理 | 服务端 | 服务端 | Nginx、CDN节点 |
| 透明代理 | 网络运营商 | 双方 | 运营商缓存 |
CDN本质:全球分布的反向代理网络——把静态内容推到离用户最近的节点。
缓存失效三大策略:Cache-Aside(先查缓存→miss查DB→写缓存)、Read-Through(缓存层代查DB)、Write-Through(同步写)。
# 14.3 一句话拎走
代理改变的是"谁替你收发数据",缓存改变的是"数据离请求者有多近"。两者结合=CDN,是互联网的加速骨架。
# 15.第 15 篇·如何去排查网络故障
# 15.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 凌晨告警"服务挂了"——你第一反应是翻代码还是看网络? |
| 暴露问题 | 90%的"服务挂了"是网络问题——但大多数人从应用层开始查,浪费半小时 |
| 核心知识 | 自底向上逐层排查:物理层(灯亮吗)→ 链路层(ARP)→ 网络层(ping)→ 传输层(telnet端口)→ 应用层(curl) |
| 加深理解 | 你上次排查故障有没有跳过ping直接curl?——这就是为什么半小时还没定位到问题 |
# 15.2 展开:排障铁律
先ping后telnet最后curl:
| 步骤 | 命令 | 检查什么 | 通了说明 |
|---|---|---|---|
| ① | ping IP | 网络层可达 | IP层以下OK |
| ② | telnet IP port | 传输层端口 | TCP连接可建立 |
| ③ | curl -v URL | 应用层HTTP | 整条链路OK |
tcpdump实战:tcpdump -i eth0 port 80 -w dump.pcap 抓包后用Wireshark分析三次握手+HTTP头。
mtr:ping+traceroute的结合,实时显示每一跳的丢包率和延迟。
# 15.3 一句话拎走
网络排障的最高效方法:先ping、再telnet、最后curl——自底向上逐层排除,10分钟定位90%的问题。
# 16.第 16 篇·WebSocket实时通信
# 16.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | "消息已读"功能——轮询CPU炸了,长轮询延迟感明显,最终选了WebSocket |
| 暴露问题 | HTTP是请求-响应模型——服务器不能主动推送。实时通信需要全双工 |
| 核心知识 | 轮询→长轮询→WebSocket→SSE→WebRTC DataChannel——每种都在前一代的瓶颈上突破 |
| 加深理解 | wscat -c wss://echo.websocket.org 连上去发一条消息——看到全双工的实际效果 |
# 16.2 展开:WebSocket的本质
WebSocket不是普通Socket——TCP Socket在传输层,WebSocket在应用层。连接建立:① HTTP Upgrade握手(Upgrade: websocket+101 Switching Protocols)② 复用80/443端口穿透防火墙 ③ 帧协议通信(opcode标识文本/二进制/关闭/心跳)④ 全双工。
心跳机制:WebSocket没有内置心跳,需要应用层实现Ping/Pong帧,防止代理和负载均衡器因空闲超时断开。
SSE vs WebSocket:SSE(Server-Sent Events)单向服务端→客户端,更轻量;WebSocket双向,更灵活。
# 16.3 一句话拎走
WebSocket的魔法在于复用HTTP端口做了一件HTTP做不到的事:让服务器主动说话。
# 17.第 17 篇·HTTP3与QUIC协议
# 17.1 速通卡
| 维度 | 内容 |
|---|---|
| 遇到场景 | 移动端从WiFi切到4G——TCP连接断了,HTTP请求全部重来。QUIC解决了这个 |
| 暴露问题 | TCP的四元组(源IP+源Port+目标IP+目标Port)决定了换网必断——这是TCP的基因缺陷 |
| 核心知识 | QUIC四大革新:0-RTT握手、Connection ID(连接迁移)、独立流(无队头阻塞)、用户态实现 |
| 加深理解 | 打开Chrome chrome://net-internals/#quic 看当前QUIC连接——你的网站已经在用了吗? |
# 17.2 展开:QUIC为什么换掉TCP
TCP的四个致命问题:
- 队头阻塞:TCP丢一包阻塞所有HTTP/2流,QUIC每条流独立重传
- 连接迁移:TCP用四元组标识,换网断连;QUIC用Connection ID,无缝切换
- 握手延迟:TCP+TLS 1.2需2-3 RTT,QUIC默认1 RTT
- 内核态瓶颈:TCP在内核中,升级需改OS;QUIC在用户态,随应用更新
QUIC的核心设计:基于UDP重新实现TCP的核心功能(可靠传输+拥塞控制+流量控制),但修复了TCP的根本缺陷。
HTTP/3 = HTTP over QUIC:HTTP语义不变(动词、状态码、头),下层从TCP换成QUIC。
# 17.3 一句话拎走
QUIC做的事情只有一件:把传输层从"改不了的TCP"换成"可以快速迭代的UDP之上"。
# 18.全系列·贯通四句话
# 18.1 协议栈——所有网络问题的坐标系
应用层 HTTP/WebSocket/DNS ← 你最熟悉的这层
传输层 TCP/UDP/QUIC ← 可靠 vs 速度的选择
网络层 IP/路由 ← 数据包怎么找到目的地
链路层 MAC/以太网 ← 局域网内怎么传
物理层 网线/光纤/WiFi ← 比特流的物理载体
排障第一问:这个问题发生在哪一层?
# 18.2 RTT——所有性能优化的公分母
| 操作 | RTT数 | 100ms网络耗时 |
|---|---|---|
| DNS查询 | 1 | 100ms |
| TCP握手 | 1 | 100ms |
| TLS 1.2握手 | 2 | 200ms |
| TLS 1.3握手 | 1 | 100ms |
| HTTP请求/响应 | 1 | 100ms |
| QUIC 0-RTT | 0 | 0ms |
优化主线:压缩RTT次数。从HTTP/1.0到HTTP/3,所有改进都在做这件事。
# 18.3 加密——不是一道锁,是一条链
对称加密(快)→ 非对称加密(安全交换密钥)→ 证书(验证身份)→ 证书链(信任传递)→ 吊销(失效管理)。任何一环断裂,整条链崩塌。
# 18.4 分层抽象——计算机科学的终极方法论
| 层 | 向上隐藏的复杂性 |
|---|---|
| HTTP | TCP的可靠传输、拥塞控制 |
| TCP | IP的路由、分片、重组 |
| IP | 链路层的MAC寻址、帧封装 |
| DNS | 全球分布式系统的缓存一致性 |
每一层独立演化——IPv4换IPv6时HTTP完全不用改。
# 19.全系列数据一页纸
| 篇 | 核心数字 | 含义 |
|---|---|---|
| 01 | 9步 | URL→页面的HTTP全链路 |
| 02 | 6层 | 加密防护链(对称+非对称+证书+链+吊销+防重放) |
| 03 | 3层 | Web部署模型(接入层→应用层→数据层) |
| 04 | 4层+60% | TCP/IP四层封装开销 |
| 05 | C10K | 单机万级并发的门槛 |
| 06 | 2选1 | TCP可靠 vs UDP快速 |
| 07 | 60s | TIME_WAIT持续2MSL |
| 08 | 4代 | 序列化进化:裸字节→文本→二进制→零拷贝 |
| 09 | 13组 | 全球根服务器(A-M) |
| 10 | 100→50000 QPS | HTTP服务性能四次进化 |
| 11 | 4级 | REST成熟度(Level 0→3) |
| 12 | 2→1→0 RTT | TLS握手进化 |
| 13 | 5→2→1→0 RTT | HTTP连接进化 |
| 14 | 3种代理+3种策略 | CDN本质=全球反向代理网络 |
| 15 | 3步铁律 | ping→telnet→curl |
| 16 | HTTP→WS | WebSocket复用80/443端口做全双工 |
| 17 | QUIC换TCP | 0-RTT+连接迁移+无队头阻塞 |
# 20.全系列症状诊断表
对照症状,直接跳到对应篇章。
| 症状 | 第一反应 | 第二篇 |
|---|---|---|
| 浏览器输入URL后白屏转圈 | §01 HTTP全链路 | §04 OSI分层 → §09 DNS |
| 网站提示"不安全" | §02 加密 → §12 HTTPS部署 | |
| 接口响应慢但CPU不高 | §10 HTTP服务 → §15 排查故障 → §13 连接 | |
| 不知道TCP/UDP怎么选 | §06 TCP/UDP | §17 QUIC |
| Socket编程卡住 | §07 Socket | §05 编程模型 |
| DNS解析问题 | §09 域名解析 | §15 排查 |
| 跨域报错/API设计混乱 | §11 HTTP协议 | §14 代理 |
| 想升级HTTPS | §12 HTTPS策略 | §02 加密原理 |
| 需要实时推送/聊天 | §16 WebSocket | §17 QUIC |
| 网站需要加速 | §14 代理缓存 | §10 HTTP服务 |
| 前端调后端报错看不懂 | §01 新闻 → §04 通用流程 → §15 排障 | |
| 想了解HTTP/3 | §17 QUIC | §13 连接进化 |
# 21.学习路径建议
# 21.1 两天速通
读 §0 导航 → 每篇只看 速通卡 + 一句话拎走(每篇2分钟,17篇共34分钟)。遇到具体场景再展开。
# 21.2 系统建立网络直觉(推荐)
§01 新闻(全链路入门) → §04 通用流程(分层模型)
→ §05 编程模型(IP/端口/DNS) → §09 DNS(域名)
→ §06 TCP/UDP(传输层) → §17 QUIC(未来传输层)
→ §10 HTTP服务 → §11 HTTP协议 → §12 HTTPS → §13 连接 → §14 缓存代理
→ §07 Socket → §08 序列化
→ §02 加密全链路 → §03 电商部署 → §15 排障 → §16 WebSocket
# 21.3 排查问题时
看 §20 诊断表 定位篇章 → 看速通卡确认方向 → 看信号灯验证假设 → 看展开加深理解。
# 21.4 自测清单
读完17篇后能回答以下问题即算掌握:
- 从浏览器输入URL到页面显示,经过了哪些步骤?每步涉及什么协议?
- TCP为什么可靠?UDP为什么快?什么时候选哪个?
curl -v https://example.com输出里每一行什么意思?- 你的服务从100 QPS到10000 QPS——优化路径是什么?
- HTTPS那一把🔒背后有几层防护?
- ping→telnet→curl 三步排查的顺序为什么不能颠倒?