查看重传次数:

  1. $ cat /proc/sys/net/ipv4/tcp_retries2
  2. 15

重传时间间隔是指数级退避,直到达到 120s 为止

image.png

永远记住 ACK 是表示这之前的包都已经全部收到

image.png

快速重传机制与 SACK

「快速重传」 快速重传的含义是:当发送端收到 3 个或以上重复 ACK,就意识到之前发的包可能丢了,于是马上进行重传,不用傻傻的等到超时再重传。

发送端应该不能根据返回的 ACK 个数推断哪个包丢失, 因为即使3, 4, 5在接收端收到, 但是包中的数据可能会错误, 所以不能单纯认为发送3, 4, 5后接收三个 ack 就认为3, 4, 5包正确接收来推断只重传2, 这时需要接收端配合, 说明其接收包的范围.

这个有一个问题,发送 3、4、5 包收到的全部是 ACK=1001,快速重传解决了一个问题: 需要重传。因为除了 2 号包,3、4、5 包也有可能丢失,那到底是只重传数据包 2 还是重传 2、3、4、5 所有包呢?

聪明的网络协议设计者,想到了一个好办法:

  1. 收到 3 号包的时候在 ACK 包中告诉发送端:喂,小老弟,我目前收到的最大连续的包序号是 1000(ACK=1001),[1:1001]、[2001:3001] 区间的包我也收到了
  2. 收到 4 号包的时候在 ACK 包中告诉发送端:喂,小老弟,我目前收到的最大连续的包序号是 1000(ACK=1001),[1:1001]、[2001:4001] 区间的包我也收到了
  3. 收到 5 号包的时候在 ACK 包中告诉发送端:喂,小老弟,我目前收到的最大连续的包序号是 1000(ACK=1001),[1:1001]、[2001:5001] 区间的包我也收到了

这样发送端就清楚知道只用重传 2 号数据包就可以了,数据包 3、4、5已经确认无误被对端收到。这种方式被称为 SACK(Selective Acknowledgment)

image.png