编程进阶网 编程进阶网
首页
  • 在线工具
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 加解密
  • 时间日期
  • 网络工具
  • 颜色设计
  • 二维码
  • 开发实用
  • 计算机的原理
  • 操作系统原理
  • 网络协议原理
  • 数据库的原理
  • 序卷导读
  • 数据本质
  • 运行模型
  • 并发设计
  • 内存真相
  • 交互系统
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 技能之旅
  • 体系建设
  • 代码品质
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 性能优化
  • 数据结构导论
  • 线性结构详解
  • 树哈希结构论
  • 容器设计实战
  • 经典算法思想
  • 工程案例剖析
  • 算法题库精练
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++编程技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript案例
  • JavaScript高级
  • Kotlin精通
  • Android库解读
  • Android专栏
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • 毛选解读
  • 自我精进
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 在线工具
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 加解密
  • 时间日期
  • 网络工具
  • 颜色设计
  • 二维码
  • 开发实用
  • 计算机的原理
  • 操作系统原理
  • 网络协议原理
  • 数据库的原理
  • 序卷导读
  • 数据本质
  • 运行模型
  • 并发设计
  • 内存真相
  • 交互系统
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 技能之旅
  • 体系建设
  • 代码品质
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 性能优化
  • 数据结构导论
  • 线性结构详解
  • 树哈希结构论
  • 容器设计实战
  • 经典算法思想
  • 工程案例剖析
  • 算法题库精练
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++编程技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript案例
  • JavaScript高级
  • Kotlin精通
  • Android库解读
  • Android专栏
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • 毛选解读
  • 自我精进
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • 计算机基础
  • 计算机的原理

  • 网络协议原理

    • README
    • 01.通过看新闻熟悉网络
    • 02.通过购物熟悉加密
    • 03.从0到1部署电商网站
    • 04.请求网络的通用流程
    • 05.网络编程模型的概念
    • 06.传输协议TCP和UDP
    • 07.Socket的发展和设计
    • 08.传输数据的设计思想
    • 09.网络域名解析的流程
    • 10.HTTP服务设计流程
    • 11.HTTP协议设计思想
    • 12.HTTPS协议设计策略
    • 13.HTTP连接和跳转
    • 14.HTTP代理和缓存设计
    • 15.如何去排查网络故障
    • 16.WebSocket实时通信
    • 17.HTTP3与QUIC协议
    • 18.网络协议原理总结
      • 0.阅读导航
        • 0.1 按场景读
        • 0.2 按层次读
      • 1.第 01 篇·通过看新闻熟悉网络
        • 1.1 速通卡
        • 1.2 展开:HTTP请求的九个环节
        • 1.3 诊断信号灯
        • 1.4 一句话拎走
      • 2.第 02 篇·通过购物熟悉加密
        • 2.1 速通卡
        • 2.2 展开:HTTPS的六层防护
        • 2.3 诊断信号灯
        • 2.4 一句话拎走
      • 3.第 03 篇·从0到1部署电商网站
        • 3.1 速通卡
        • 3.2 展开:Web部署的三层模型
        • 3.3 一句话拎走
      • 4.第 04 篇·请求网络的通用流程
        • 4.1 速通卡
        • 4.2 展开:沙漏模型
        • 4.3 一句话拎走
      • 5.第 05 篇·网络编程模型的概念
        • 5.1 速通卡
        • 5.2 展开:Socket的本质
        • 5.3 诊断信号灯
        • 5.4 一句话拎走
      • 6.第 06 篇·传输协议TCP和UDP
        • 6.1 速通卡
        • 6.2 展开:选择决策树
        • 6.3 一句话拎走
      • 7.第 07 篇·Socket的发展和设计
        • 7.1 速通卡
        • 7.2 展开:Socket状态机
        • 7.3 一句话拎走
      • 8.第 08 篇·传输数据的设计思想
        • 8.1 速通卡
        • 8.2 展开:序列化选型
        • 8.3 一句话拎走
      • 9.第 09 篇·网络域名解析的流程
        • 9.1 速通卡
        • 9.2 展开:DNS的分布式设计
        • 9.3 一句话拎走
      • 10.第 10 篇·HTTP服务设计流程
        • 10.1 速通卡
        • 10.2 展开:HTTP服务性能四次进化
        • 10.3 一句话拎走
      • 11.第 11 篇·HTTP协议设计思想
        • 11.1 速通卡
        • 11.2 展开:REST成熟度
        • 11.3 一句话拎走
      • 12.第 12 篇·HTTPS协议设计策略
        • 12.1 速通卡
        • 12.2 展开:TLS握手的高昂代价
        • 12.3 一句话拎走
      • 13.第 13 篇·HTTP连接和跳转
        • 13.1 速通卡
        • 13.2 展开:连接的代价
        • 13.3 一句话拎走
      • 14.第 14 篇·HTTP代理和缓存设计
        • 14.1 速通卡
        • 14.2 展开:代理的三重身份
        • 14.3 一句话拎走
      • 15.第 15 篇·如何去排查网络故障
        • 15.1 速通卡
        • 15.2 展开:排障铁律
        • 15.3 一句话拎走
      • 16.第 16 篇·WebSocket实时通信
        • 16.1 速通卡
        • 16.2 展开:WebSocket的本质
        • 16.3 一句话拎走
      • 17.第 17 篇·HTTP3与QUIC协议
        • 17.1 速通卡
        • 17.2 展开:QUIC为什么换掉TCP
        • 17.3 一句话拎走
      • 18.全系列·贯通四句话
        • 18.1 协议栈——所有网络问题的坐标系
        • 18.2 RTT——所有性能优化的公分母
        • 18.3 加密——不是一道锁,是一条链
        • 18.4 分层抽象——计算机科学的终极方法论
      • 19.全系列数据一页纸
      • 20.全系列症状诊断表
      • 21.学习路径建议
        • 21.1 两天速通
        • 21.2 系统建立网络直觉(推荐)
        • 21.3 排查问题时
        • 21.4 自测清单
    • 19.网络协议思考题答案
  • 操作系统原理

  • 数据库的原理

  • 计算机
  • 网络协议原理
杨充
2016-07-08
目录

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的四个致命问题:

  1. 队头阻塞:TCP丢一包阻塞所有HTTP/2流,QUIC每条流独立重传
  2. 连接迁移:TCP用四元组标识,换网断连;QUIC用Connection ID,无缝切换
  3. 握手延迟:TCP+TLS 1.2需2-3 RTT,QUIC默认1 RTT
  4. 内核态瓶颈: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篇后能回答以下问题即算掌握:

  1. 从浏览器输入URL到页面显示,经过了哪些步骤?每步涉及什么协议?
  2. TCP为什么可靠?UDP为什么快?什么时候选哪个?
  3. curl -v https://example.com 输出里每一行什么意思?
  4. 你的服务从100 QPS到10000 QPS——优化路径是什么?
  5. HTTPS那一把🔒背后有几层防护?
  6. ping→telnet→curl 三步排查的顺序为什么不能颠倒?
上次更新: 2026/07/10, 14:05:03
17.HTTP3与QUIC协议
19.网络协议思考题答案

← 17.HTTP3与QUIC协议 19.网络协议思考题答案→

最近更新
01
11.数据库的原理总结
07-12
02
11.操作系统原理总结
07-10
03
7.资深程序员软能力
07-10
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 鄂ICP备2024073355号-1 | 鄂ICP备2024073355号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式