← 返回 Day 93 正文

Day 93 · 图解

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 时,事件循环切换到其他就绪的协程