Day 093 — 网络编程深入 · 图解
1. TCP/IP 协议栈
┌─────────────────────────────────────────────────────┐
│ 应用层 │
│ HTTP / HTTPS / FTP / SMTP / DNS / 自定义协议 │
├─────────────────────────────────────────────────────┤
│ 传输层 │
│ TCP (可靠) │ UDP (快速) │
├────────────────────────────┴─────────────────────────┤
│ 网络层 │
│ IP (IPv4 / IPv6) │
├─────────────────────────────────────────────────────┤
│ 链路层 │
│ Ethernet / Wi-Fi / PPP │
└─────────────────────────────────────────────────────┘
2. Socket 通信流程
TCP 服务器 TCP 客户端
│ │
│ socket() │ socket()
│ bind() │
│ listen() │
│ │ connect()
│ accept() ◄─────────────────│
│ │
┌────▼────┐ ┌────▼────┐
│ conn1 │ │ client │
└────┬────┘ └────┬────┘
│ │
│ recv() ◄───────────────────│ send()
│ send() ──────────────────►│ recv()
│ │
│ close() │ close()
3. asyncio 事件循环
┌──────────────┐
│ 事件循环 │
│ (Event Loop) │
└──────┬───────┘
│
┌───────────────┼───────────────┐
│ │ │
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ 协程 1 │ │ 协程 2 │ │ 协程 3 │
│ (HTTP) │ │ (DB查询) │ │ (文件I/O) │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
│ │ │
└───────┬───────┴───────┬───────┘
│ │
┌──────▼──────┐ ┌──────▼──────┐
│ 网络 I/O │ │ 磁盘 I/O │
│ (epoll/ │ │ (线程池) │
│ kqueue) │ │ │
└─────────────┘ └─────────────┘
4. HTTP 协议演进
时间线: ──────────────────────────────────────────────────────────────►
HTTP/1.0 (1996)
├── 每次请求新建 TCP 连接
└── 无状态
HTTP/1.1 (1997)
├── 持久连接 (Connection: keep-alive)
├── 管线化 (Pipeline) ← 有队头阻塞问题
└── Host 头 (虚拟主机)
HTTP/2 (2015)
├── 多路复用 (一个连接并发多个流)
├── 头部压缩 (HPACK)
├── 服务器推送 (Server Push)
└── 二进制分帧
HTTP/3 (2022)
├── 基于 QUIC (UDP)
├── 0-RTT 建立连接
├── 无队头阻塞 (独立流)
└── 连接迁移 (IP 变化不断开)
5. 自定义协议消息格式
┌────────────────────────────────────────────────────────┐
│ 消息结构 │
├──────────┬──────────┬──────────┬───────────────────────┤
│ Magic │ Version │ MsgType │ Payload Length │
│ (2字节) │ (1字节) │ (1字节) │ (4字节) │
├──────────┼──────────┼──────────┼───────────────────────┤
│ 0x4854 │ 0x01 │ 0x01-04 │ N (大端序) │
├──────────┴──────────┴──────────┴───────────────────────┤
│ Payload (N字节) │
│ JSON 格式的消息体 │
└────────────────────────────────────────────────────────┘
Magic: "HT" (Hello Transport 的缩写)
Version: 协议版本号,用于向后兼容
MsgType: 0x01=请求, 0x02=响应, 0x03=心跳, 0x04=错误
Payload Length: 大端序 4 字节无符号整数
6. 异步 vs 同步服务器对比
同步模型 (100个连接,每个处理1秒):
线程1: [conn1 处理 1s] [conn2 处理 1s] [conn3 处理 1s] ...
线程2: [conn4 处理 1s] [conn5 处理 1s] ...
...
总时间: ~100 秒 (或需要 100 个线程)
异步模型 (同样100个连接):
事件循环: [conn1就绪→处理]→[conn2就绪→处理]→[conn1就绪→处理]→...
总时间: ~1 秒 (取决于 I/O 等待时间)
关键: 当一个协程在等待 I/O 时,事件循环切换到其他就绪的协程