前置知识: 计算机基础

计算机网络

5 minIntermediate

计算机网络核心原理:协议栈、TCP/IP、路由、应用层协议、网络安全。

1. 网络体系结构

1.1 OSI七层模型 vs TCP/IP四层模型

OSI七层模型              TCP/IP四层模型          协议示例
+------------------+    +------------------+    +-----------+
| 7 Application    |    |                  |    | HTTP, DNS |
+------------------+    |  Application     |    | FTP, SMTP |
| 6 Presentation   |    |                  |    | TLS, JPEG |
+------------------+    +------------------+    +-----------+
| 5 Session        |    |                  |    | RPC, NFS  |
+------------------+    +------------------+    +-----------+
| 4 Transport      |    |  Transport       |    | TCP, UDP  |
+------------------+    +------------------+    +-----------+
| 3 Network        |    |  Internet        |    | IP, ICMP  |
+------------------+    +------------------+    +-----------+
| 2 Data Link      |    |  Network Access  |    | Ethernet  |
+------------------+    |                  |    | WiFi, PPP |
| 1 Physical       |    |                  |    | 光纤, 双绞线|
+------------------+    +------------------+    +-----------+

封装过程 (协议栈主线, 参见 [概述](overview) 4.2节):

  Application Data
       |
       v
  +---+---+---+---+---+---+
  | HTTP |   Data         |    应用层
  +---+---+---+---+---+---+
       |
       v
  +---+---+---+---+---+---+---+---+
  | TCP | HTTP |   Data           |    传输层
  +---+---+---+---+---+---+---+---+
       |
       v
  +---+---+---+---+---+---+---+---+---+---+
  | IP  | TCP | HTTP |   Data              |    网络层
  +---+---+---+---+---+---+---+---+---+---+
       |
       v
  +---+---+---+---+---+---+---+---+---+---+---+---+
  | ETH | IP  | TCP | HTTP |   Data          | FCS |    链路层
  +---+---+---+---+---+---+---+---+---+---+---+---+

1.2 协议栈的设计原则

协议栈设计的核心原则:

1. 分层抽象: 每层只关心本层的功能,通过接口与相邻层交互
2. 封装/解封: 发送方逐层封装头部,接收方逐层解封
3. 对等通信: 同一层的两个实体通过协议逻辑通信
4. 透明传输: 每层对上层隐藏本层的实现细节

端到端原则 (End-to-End Argument):
  功能应在最高可能层实现
  低层只提供最基本的传输服务
  例: 可靠性由TCP(传输层)保证,而非每个路由器重传

2. 物理层与数据链路层

2.1 以太网帧格式

Ethernet II 帧格式:

| Preamble | SFD | Dst MAC | Src MAC | Type | Payload      | FCS |
| 7B       | 1B  | 6B      | 6B      | 2B   | 46-1500B     | 4B  |

Preamble: 7字节前导码 (时钟同步)
SFD:      1字节帧起始定界符 (0xAB)
Type:     上层协议类型 (0x0800=IP, 0x0806=ARP, 0x86DD=IPv6)
FCS:      4字节CRC-32校验

最小帧长: 64B (防止冲突检测失败)
最大帧长: 1518B (标准) / 9022B (Jumbo Frame)

2.2 CSMA/CD协议

CSMA/CD (载波侦听多路访问/冲突检测):

  1. 先听后发: 检测信道空闲才发送
  2. 边发边听: 发送时持续检测冲突
  3. 冲突停止: 检测到冲突立即停止
  4. 随机重发: 等待随机时间后重试

  二进制指数退避:
    第k次冲突后, 从 [0, 2^k - 1] 中随机选择一个数r
    等待 r * 2t (t = 传播延迟)
    k 最大为16, 超过则放弃

  冲突域:
    共享同一信道的所有设备构成冲突域
    交换机隔离冲突域, 集线器不隔离

2.3 ARP协议

ARP (Address Resolution Protocol): IP地址 -> MAC地址映射

ARP请求/响应流程:

  Host A (192.168.1.1) 想与 Host B (192.168.1.2) 通信
  A不知道B的MAC地址

  1. A发送ARP请求 (广播):
     Dst MAC: FF:FF:FF:FF:FF:FF
     "谁有 192.168.1.2? 请告诉 192.168.1.1"

  2. B收到ARP请求, 发送ARP响应 (单播):
     Dst MAC: A的MAC地址
     "192.168.1.2 的MAC地址是 xx:xx:xx:xx:xx:xx"

  3. A将映射缓存到ARP表 (TTL通常20分钟)

ARP缓存表:
  IP Address        MAC Address         TTL
  192.168.1.2       00:11:22:33:44:55   1200s

2.4 交换机工作原理

交换机自学习算法:

  交换机维护: MAC地址表 (MAC -> Port映射)

  收到帧时:
    1. 学习: 记录源MAC -> 入端口
    2. 转发: 查找目的MAC
       - 找到: 转发到对应端口
       - 未找到: 泛洪到所有端口(除入端口)
       - 广播地址: 泛洪

  MAC地址表示例:
    MAC Address       Port   VLAN
    00:11:22:33:44:55  1     10
    AA:BB:CC:DD:EE:FF  3     10
    11:22:33:44:55:66  5     20

  生成树协议 (STP):
    防止环路, 通过阻塞冗余链路构建无环拓扑
    根桥选举 -> 最短路径计算 -> 阻塞非最短路径端口

3. 网络层

3.1 IP协议

IPv4头部格式:

| Version | IHL | DSCP/ECN | Total Length |
| Identification | Flags | Fragment Offset |
| TTL | Protocol | Header Checksum |
| Source IP Address (32b)          |
| Destination IP Address (32b)     |
| Options (variable)               |

关键字段:
  Version: 4 (IPv4)
  IHL: 头部长度 (以4字节为单位, 最小5=20B)
  TTL: 生存时间 (每经过一个路由器-1, 为0时丢弃)
  Protocol: 上层协议 (6=TCP, 17=UDP, 1=ICMP)

IPv6头部格式 (简化):

| Version | Traffic Class | Flow Label |
| Payload Length | Next Header | Hop Limit |
| Source Address (128b)                        |
| Destination Address (128b)                   |

IPv4 vs IPv6:
  地址长度: 32b vs 128b
  头部: 可变(20-60B) vs 固定(40B)
  分片: 路由器可分片 vs 仅源端分片
  校验和: 有 vs 无(交给链路层和传输层)
  配置: 手动/DHCP vs 自动(SLAAC)

3.2 子网划分与CIDR

IPv4地址分类:

  A类: 1.0.0.0 - 126.0.0.0     /8   (网络位8, 主机位24)
  B类: 128.0.0.0 - 191.255.0.0 /16  (网络位16, 主机位16)
  C类: 192.0.0.0 - 223.255.255.0 /24 (网络位24, 主机位8)

CIDR (无类域间路由):
  打破类别边界, 自由划分网络位和主机位

  例: 192.168.1.0/24
    网络位: 24位
    主机位: 8位 (可容纳254台主机)
    子网掩码: 255.255.255.0

  子网划分:
    192.168.1.0/24 划分为4个子网:
    192.168.1.0/26    (主机位6, 62台主机)
    192.168.1.64/26
    192.168.1.128/26
    192.168.1.192/26

  超网聚合:
    192.168.0.0/24 + 192.168.1.0/24 = 192.168.0.0/23

3.3 路由算法

路由算法分类:

1. 距离向量算法 (RIP):
   每个路由器维护到所有目的地的距离向量
   定期与邻居交换距离向量
   Bellman-Ford方程: D(x,y) = min{ c(x,v) + D(v,y) }

   RIP协议:
     度量: 跳数 (最大15, 16=不可达)
     更新: 每30秒
     问题: 慢收敛、计数到无穷
     解决: 水平分裂、毒性逆转

2. 链路状态算法 (OSPF):
   每个路由器维护完整的网络拓扑图
   使用Dijkstra算法计算最短路径

   OSPF协议:
     度量: 代价 (通常与带宽成反比)
     更新: 链路状态变化时立即泛洪
     区域: 骨干区域(Area 0) + 非骨干区域
     优点: 快速收敛、无环路

3. 路径向量算法 (BGP):
   用于自治系统(AS)间路由
   交换到达目的地的路径信息

   BGP协议:
     eBGP: AS间交换路由
     iBGP: AS内传播路由
     路径属性: AS-PATH, NEXT-HOP, LOCAL-PREF
     策略路由: 可基于商业策略选择路径

Dijkstra算法伪代码

def dijkstra(graph, source):
    dist = {v: float('inf') for v in graph}
    dist[source] = 0
    visited = set()
    while len(visited) < len(graph):
        u = min((v for v in graph if v not in visited), key=lambda v: dist[v])
        visited.add(u)
        for v, cost in graph[u]:
            if dist[u] + cost < dist[v]:
                dist[v] = dist[u] + cost
    return dist

3.4 ICMP协议

ICMP (Internet Control Message Protocol): 网络层差错报告

ICMP消息类型:
  Type 0  Echo Reply          (ping响应)
  Type 3  Destination Unreachable (目的不可达)
  Type 5  Redirect            (重定向)
  Type 8  Echo Request        (ping请求)
  Type 11 Time Exceeded       (TTL超时, traceroute利用此)

traceroute原理:
  发送TTL=1的UDP包 -> 第1跳返回ICMP Time Exceeded
  发送TTL=2的UDP包 -> 第2跳返回ICMP Time Exceeded
  ...
  直到到达目的地返回ICMP Port Unreachable

4. 传输层

4.1 TCP协议

TCP段格式:

| Source Port | Destination Port |
| Sequence Number (32b)              |
| Acknowledgment Number (32b)        |
| Data | Reserved | Flags | Window   |
| Checksum | Urgent Pointer          |
| Options (variable)                 |

关键字段:
  Sequence Number: 数据的字节流编号
  Ack Number:      期望收到的下一个字节编号
  Flags: URG|ACK|PSH|RST|SYN|FIN
  Window: 接收窗口大小 (流量控制)

4.2 TCP状态机

TCP连接状态机 (参见 [概述](overview) 4.3节):

                              +---------+
                      CLOSED  |         |
                              +---------+
                     passive  |    |   active
                      open    |    |   open
                              v    v
                       +----------+     SYN_SEND
                       |  LISTEN  |        |
                       +----------+        |
                  SYN    |     |   SYN     |
                 rcvd    |     |   sent    |
                         v     |           |
                   +----------+            |
                   | SYN_RCVD |            |
                   +----------+            |
                         |                 |
                         |   SYN+ACK       |
                         v                 v
                       +----------------------+
                       |     ESTABLISHED      |
                       +----------------------+
                         |     |     |
                    FIN  |     | FIN |  close
                   sent  |     | rcvd|
                         v     v     v
                   +---------+  +----------+
                   | FIN_WAIT|  | CLOSE_WAIT|
                   | 1       |  +----------+
                   +---------+        |
                         |       FIN  |
                    FIN  |      sent  |
                   rcvd  |            v
                         v     +----------+
                   +---------+ | LAST_ACK |
                   |FIN_WAIT2| +----------+
                   +---------+        |
                         |       FIN  |
                    FIN  |      rcvd  |
                   sent  |            |
                         v            v
                       +-----------+
                       | TIME_WAIT |
                       +-----------+
                             | 2MSL
                             v
                       +---------+
                       |  CLOSED |
                       +---------+

4.3 TCP三次握手

TCP三次握手:

  Client                          Server
  (CLOSED)                        (LISTEN)
     |                               |
     |  SYN, seq=x                   |
     |------------------------------->|  SYN_RCVD
     |                               |
     |  SYN+ACK, seq=y, ack=x+1      |
     |<-------------------------------|
     |                               |
     |  ACK, seq=x+1, ack=y+1        |
     |------------------------------->|  ESTABLISHED
     |                               |
  ESTABLISHED                     ESTABLISHED

为什么需要三次握手?
  1. 确认双方的发送和接收能力正常
  2. 同步双方的初始序列号(ISN)
  3. 防止旧连接的SYN导致误建连

ISN生成:
  ISN = 基于时钟的计数器 + 随机偏移
  防止序列号预测攻击

4.4 TCP四次挥手

TCP四次挥手:

  Client                          Server
  (ESTABLISHED)                   (ESTABLISHED)
     |                               |
     |  FIN, seq=u                   |
     |------------------------------->|  CLOSE_WAIT
     |                               |
     |  ACK, ack=u+1                  |
     |<-------------------------------|
     |                               |
     |          (Server发送剩余数据)    |
     |                               |
     |  FIN, seq=w                   |
     |<-------------------------------|  LAST_ACK
     |                               |
     |  ACK, ack=w+1                 |
     |------------------------------->|
     |                               |
  TIME_WAIT                       CLOSED
  (等待2MSL)                         |
     |                               |
  CLOSED

为什么需要TIME_WAIT?
  1. 确保最后一个ACK能到达对方 (若丢失, 对方重发FIN)
  2. 等待本连接的延迟报文消亡 (2MSL后旧报文必然被丢弃)

MSL (Maximum Segment Lifetime): 报文最大生存时间, 通常2分钟

4.5 TCP可靠传输

TCP可靠传输机制:

1. 序列号与确认:
   每个字节有序列号
   累积确认: ACK=n 表示n之前的所有数据已收到

2. 超时重传:
   RTO (Retransmission Timeout) 动态计算
   RTO = SRTT + 4 * RTTVAR
   SRTT = (1-a) * SRTT + a * RTT_sample  (a=1/8)
   RTTVAR = (1-b) * RTTVAR + b * |SRTT - RTT_sample|  (b=1/4)

3. 快速重传:
   收到3个重复ACK -> 立即重传 (不等超时)
   比超时重传更快检测丢包

4. 选择确认 (SACK):
   TCP选项, 允许接收方告知已收到的非连续块
   避免不必要的重传

滑动窗口:

  发送窗口:
  |---------- 已发送已确认 ----------|---- 已发送未确认 ----|---- 可发送 ----|---- 不可发送 ----|
                                    |<--- 发送窗口 --->|

  接收窗口:
  |---------- 已接收确认 ----------|---- 可接收 ----|---- 不可接收 ----|
                                   |<-- 接收窗口 -->|

4.6 TCP流量控制与拥塞控制

流量控制 (Flow Control): 防止发送方淹没接收方

  接收方通过Window字段告知可用缓冲区
  零窗口探测: 收到Window=0时, 发送方定期发1字节探测

拥塞控制 (Congestion Control): 防止网络过载

  四个算法:

  1. 慢启动 (Slow Start):
     cwnd从1 MSS开始, 每RTT翻倍 (指数增长)
     直到cwnd达到ssthresh -> 切换到拥塞避免

  2. 拥塞避免 (Congestion Avoidance):
     每RTT cwnd增加1 MSS (线性增长)
     直到检测到丢包

  3. 快速重传 (Fast Retransmit):
     3个重复ACK -> 立即重传丢失段
     ssthresh = cwnd / 2
     cwnd = ssthresh + 3 (TCP Reno)

  4. 快速恢复 (Fast Recovery):
     每收到一个重复ACK, cwnd增加1 MSS
     收到新ACK -> cwnd = ssthresh, 进入拥塞避免

  拥塞窗口变化图:
  cwnd
    ^
    |         /\    /\
    |        /  \  /  \
    |       /    \/    \
    |      /             \
    |     /               \
    |    /                 \
    |   /                   \
    +--+---+---+---+---+---+---> time
     SS  CA  SS  CA  SS  CA
         3dupACK  timeout

4.7 UDP协议

UDP数据报格式:

| Source Port | Destination Port |
| Length      | Checksum         |
| Data                          |

UDP vs TCP:

| 特性     | TCP              | UDP           |
|----------|------------------|---------------|
| 连接     | 面向连接          | 无连接        |
| 可靠性   | 可靠              | 不可靠        |
| 顺序     | 有序              | 无序          |
| 流量控制 | 有               | 无            |
| 拥塞控制 | 有               | 无            |
| 头部大小 | 20-60B           | 8B            |
| 传输效率 | 低               | 高            |
| 适用场景 | 文件/网页/邮件    | 视频/DNS/游戏 |

QUIC协议 (HTTP/3):
  基于UDP实现的可靠传输
  集成TLS 1.3, 0-RTT握手
  连接迁移 (基于Connection ID而非四元组)
  解决TCP的队头阻塞问题

模块引用操作系统的Socket接口是传输层的编程抽象。Java的NIO/Netty框架封装了TCP/UDP的异步IO操作。C语言的Berkeley Socket API是最底层的网络编程接口


5. 应用层

5.1 DNS协议

DNS (Domain Name System): 域名 -> IP地址

DNS层次结构:
  根域 (.)
  +-- 顶级域 (.com, .org, .net, .cn)
      +-- 二级域 (google.com, baidu.com)
          +-- 子域 (mail.google.com, www.baidu.com)

DNS解析流程 (递归+迭代):

  Client -> Local DNS -> Root DNS -> .com TLD DNS -> google.com权威DNS
  Client <- Local DNS <- (缓存结果)

DNS记录类型:
  A     : 域名 -> IPv4地址
  AAAA  : 域名 -> IPv6地址
  CNAME : 域名别名
  MX    : 邮件服务器
  NS    : 权威DNS服务器
  TXT   : 文本记录 (SPF, DKIM)
  SOA   : 区域起始授权

DNS报文格式:
  | Header | Question | Answer | Authority | Additional |
  Header: ID | Flags | QDCOUNT | ANCOUNT | NSCOUNT | ARCOUNT

5.2 HTTP协议

HTTP请求/响应模型:

  Client                              Server
     |  Request (GET /index.html)       |
     |---------------------------------->|
     |                                  |
     |  Response (200 OK + Body)        |
     |<----------------------------------|

HTTP/1.1 请求格式:
  GET /index.html HTTP/1.1
  Host: www.example.com
  Connection: keep-alive
  Accept: text/html

HTTP/1.1 响应格式:
  HTTP/1.1 200 OK
  Content-Type: text/html
  Content-Length: 1234
  Connection: keep-alive

  <html>...</html>

HTTP方法:
  GET:    获取资源
  POST:   提交数据
  PUT:    替换资源
  DELETE: 删除资源
  HEAD:   获取头部
  OPTIONS: 查询支持的方法

HTTP状态码:
  1xx: 信息 (100 Continue)
  2xx: 成功 (200 OK, 201 Created, 204 No Content)
  3xx: 重定向 (301 永久, 302 临时, 304 未修改)
  4xx: 客户端错误 (400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found)
  5xx: 服务器错误 (500 Internal, 502 Bad Gateway, 503 Unavailable)

5.3 HTTP演进

HTTP版本演进:

HTTP/1.0:
  短连接, 每个请求需要新建TCP连接
  问题: 连接建立开销大

HTTP/1.1:
  长连接 (Connection: keep-alive)
  管道化 (pipelining, 但存在队头阻塞)
  分块传输 (Transfer-Encoding: chunked)
  缓存机制 (Cache-Control, ETag)

HTTP/2:
  二进制帧 (替代文本格式)
  多路复用 (一个连接上并行多个流)
  头部压缩 (HPACK)
  服务器推送
  解决: 应用层队头阻塞
  未解决: TCP层队头阻塞 (一个包丢失阻塞所有流)

HTTP/3 (QUIC):
  基于UDP, 解决TCP队头阻塞
  0-RTT连接建立
  连接迁移 (移动网络切换不断连)
  内置TLS 1.3

5.4 TLS协议

TLS 1.3握手流程:

  Client                              Server
     |  ClientHello                     |
     |  (supported_versions, key_share) |
     |---------------------------------->|
     |                                  |
     |  ServerHello                     |
     |  (key_share, certificate,        |
     |   certificate_verify, finished)  |
     |<----------------------------------|
     |                                  |
     |  Finished                        |
     |---------------------------------->|
     |                                  |
     |  Application Data (encrypted)    |
     |<---------------------------------->|

TLS 1.3 vs 1.2:
  握手: 2-RTT -> 1-RTT
  恢复: 1-RTT -> 0-RTT
  密码套件: 精简为AEAD (AES-GCM, ChaCha20-Poly1305)
  密钥交换: 仅支持ECDHE (前向保密)
  移除: RSA密钥交换, CBC模式, SHA-1, 压缩

6. 网络安全

6.1 加密基础

对称加密:
  加密解密使用同一密钥
  AES (128/192/256位)
  速度快, 密钥分发困难

非对称加密:
  公钥加密, 私钥解密 (或反过来)
  RSA, ECC
  速度慢, 解决密钥分发问题

数字签名:
  发送方用私钥签名, 接收方用公钥验证
  保证: 完整性 + 不可否认性

数字证书:
  CA (证书颁发机构) 签名绑定公钥和身份
  证书链: Root CA -> Intermediate CA -> End Entity

6.2 防火墙与NAT

NAT (Network Address Translation):

  私有地址范围:
    10.0.0.0/8
    172.16.0.0/12
    192.168.0.0/16

  NAT转换表:
    内部地址:端口        外部地址:端口
    192.168.1.5:1234  ->  203.0.113.1:5678

  NAT类型:
    SNAT (源NAT): 内网访问外网时转换源地址
    DNAT (目的NAT): 外网访问内网时转换目的地址
    PAT (端口地址转换): 多个内网地址共享一个公网IP

  NAT穿越问题:
    NAT破坏了端到端通信
    解决: STUN, TURN, ICE

模块引用操作系统的iptables/nftables实现了NAT和防火墙功能。离散数学的数论基础是RSA/ECC加密算法的理论支撑。编译原理的TLS实现涉及证书解析和协议状态机。


7. 速查表

7.1 协议栈速查

层次协议端口功能
应用HTTP80网页
应用HTTPS443安全网页
应用DNS53域名解析
应用SMTP25邮件发送
应用SSH22远程登录
传输TCP-可靠传输
传输UDP-快速传输
网络IP-寻址路由
网络ICMP-差错报告
网络ARP-地址解析
链路Ethernet-局域网
链路WiFi-无线局域网

7.2 TCP状态速查

状态含义转移
LISTEN等待连接收到SYN -> SYN_RCVD
SYN_SENT已发SYN收到SYN+ACK -> ESTABLISHED
SYN_RCVD已收SYN并发SYN+ACK收到ACK -> ESTABLISHED
ESTABLISHED连接建立发FIN -> FIN_WAIT_1
FIN_WAIT_1已发FIN收ACK -> FIN_WAIT_2
FIN_WAIT_2等待对方FIN收FIN -> TIME_WAIT
CLOSE_WAIT收到FIN发FIN -> LAST_ACK
TIME_WAIT等待2MSL超时 -> CLOSED

7.3 拥塞控制速查

阶段触发条件cwnd变化
慢启动cwnd < ssthresh指数增长
拥塞避免cwnd >= ssthresh线性增长
快速重传3个重复ACKssthresh=cwnd/2
快速恢复快速重传后cwnd=ssthresh+3
超时重传RTO超时ssthresh=cwnd/2, cwnd=1

7.4 HTTP状态码速查

码段含义常见码
2xx成功200 OK, 201 Created, 204 No Content
3xx重定向301 永久, 302 临时, 304 未修改
4xx客户端错误400 Bad Request, 401/403/404
5xx服务端错误500/502/503/504

延伸阅读

  • Computer Networking: A Top-Down Approach — Kurose & Ross
  • TCP/IP Illustrated, Volume 1 — W. Richard Stevens
  • Unix Network Programming — W. Richard Stevens
  • High Performance Browser Networking — Ilya Grigorik