本文目录导读:
我将通过一个具体的文件传输案例来展示TCP的可靠性机制。
案例:传输一个10MB的文本文件
假设我们要从主机A发送一个10MB的文本文件report.txt到主机B。
建立可靠连接(三次握手)
sequenceDiagram
participant A as 主机A
participant B as 主机B
A->>B: SYN (seq=1000)
Note right of A: 我想建立连接
B->>A: SYN+ACK (seq=2000, ack=1001)
Note left of B: 同意连接
A->>B: ACK (seq=1001, ack=2001)
Note right of A: 连接已建立
数据分片与序号标记
TCP会将10MB的文件切分成多个数据段,每个段分配唯一序号:
原始文件: 10,000,000 字节
MTU限制: 1460 字节/段
总数据段数: 约6850个
数据段1: seq=1001, data[0-1459]
数据段2: seq=2461, data[1460-2919]
数据段3: seq=3921, data[2920-4379]
...依次类推...
数据发送与确认机制
sequenceDiagram
participant A as 主机A(发送方)
participant B as 主机B(接收方)
A->>B: 数据段1 (seq=1001)
Note over A,B: ACK=1461
B->>A: ACK 1461
A->>B: 数据段2 (seq=2461)
A->>B: 数据段3 (seq=3921)
Note over A,B: 数据段2丢失!
B->>A: ACK 2921 (期望收到seq=2921)
Note over A: 检测到超时重传
A->>B: 数据段2重传 (seq=2461)
B->>A: ACK 5381 (确认收到到数据段3)
数据校验与错误恢复
场景:数据段5发生比特错误
接收方校验过程:
1. 收到数据段5 (seq=5381)
2. 计算校验和:0xABCD
3. 对比原始校验和:0xABCE
4. 发现不匹配 → 丢弃数据段
5. 等待重传
流量控制机制
# 接收窗口大小动态调整 初始窗口: 65535 字节 (约45个数据段) 下载过程中,接收方处理能力下降: # 接收方缓冲区状态 缓冲空闲: 30000 字节 接收窗口: 30000 (约20个数据段) # 发送方调整策略 发送窗口 = min(拥塞窗口, 接收窗口) 发送窗口 = min(65535, 30000) = 30000
拥塞控制演示
graph LR
A[慢启动阶段] -->|指数增长| B[拥塞避免]
B -->|线性增长| C{检测到丢包}
C -->|超时| D[重传并降低阈值]
C -->|快速重传| E[快速恢复]
D --> A
E --> B
实际传输日志
# Wireshark捕获的TCP传输片段 # 正常传输 01:23:45.123 TCP 数据段 seq=1001, ack=2001, len=1460 01:23:45.124 TCP ACK seq=2001, ack=2461, win=65535 # 数据段丢失 01:23:45.456 TCP 数据段 seq=3921, ack=2001, len=1460 ← 丢失 01:23:45.457 TCP ACK seq=2001, ack=2461, win=65535 ← 重复确认 # 超时重传 01:23:46.234 TCP 数据段 seq=3921, ack=2001, len=1460 ← 重传 01:23:46.235 TCP ACK seq=2001, ack=5381, win=65535 ← 成功确认
传输完成验证
# 文件完整性校验 接收方计算: MD5(接收到的文件) = "a1b2c3d4e5f6..." 发送方提供: MD5(原始文件) = "a1b2c3d4e5f6..." 结果匹配 ✓ # 数据段确认 已确认数据段: 6850/6850 (100%) 丢失重传次数: 2次 校验错误次数: 1次
关键可靠性机制总结
| 机制 | 作用 | 本案例中的体现 |
|---|---|---|
| 序号机制 | 数据排序和去重 | 从seq=1001开始编号 |
| 确认应答 | 保证送达 | 每个数据段都需要ACK |
| 超时重传 | 处理丢失 | 数据段2的RTO重传 |
| 校验和 | 检测错误 | 数据段5的比特错误检测 |
| 流量控制 | 防止发送过快 | 窗口从65535动态调整 |
| 拥塞控制 | 网络过载保护 | 慢启动→拥塞避免 |
通过这个案例可以看出,TCP通过这些机制确保了数据完整、顺序正确、无重复、无丢失的可靠传输,这正是为什么文件传输、网页访问等应用都依赖TCP的原因。
标签: 文件传输案例