# 一个数据包丢失后TCP怎样继续

By DUSK

Topic: Physics &amp; Chemistry

[Open the interactive Jig](https://ask.jig.com/j/CVquNezt5opN)

## Guide

### 1. 两座塔，一串字节

发送端 A 要把 500 个字节交给接收端 B。TCP 把字节流切成 5 个数据段，每段 100 字节。每段都贴上序号：它第一个字节在整串里的位置。

示意模型：塔、距离和颜色都是示意，时间已放慢。

### 2. 序号与确认号

数据段沿上方链路飞向 B。B 每收到一段，就沿下方链路回一个确认（ACK）。确认号是 B 下一个想要的字节：收到 1–100 后，它回“确认号 101”。

发送端会一直保留副本，直到确认号覆盖了这一段。

### 3. 一个数据段丢了

这一次，序号 201 的数据段在链路上丢失。后面的 301 和 401 照样先到，B 把它们放进接收缓存。可它还缺 201，所以只能一再回“确认号 201”。

数据可以乱序到达。现实中连续收到三个重复确认还会触发快速重传，这里只看超时这条路。

### 4. 计时器到点，重发

A 发出数据后就启动重传计时器。确认号 201 迟迟不前进，计时器走满就算超时。A 用原来的序号 201 再发同样的字节。

真实计时器会根据往返时间自动调整，每次再超时等待加倍；重传会补齐数据，但不保证多快送到。

### 5. 按顺序交给应用

补发的 201 一到，缺口填上了。B 把 201 到 500 依次交给应用，并回“确认号 501”。应用看到的始终是按顺序、不缺字节的数据。

### 6. 自己试试

用上方的按钮：“丢下一个段”让下一次发送丢失，“单步”一次走到下一个事件，“暂停”和“重置”随时可用。拖动可转动场景，滚轮或双指可缩放。

一句话：TCP 用序号、确认和重传补齐丢失的数据并按序交付，但不保证送达的快慢。
