目的
保证 TCP 协议可靠的机制
示例
背景:我给老板发微信
- 场景一:
我:老板,我想删库!
…
等了 15 分钟,老板没回复我。
于是我又发了一条消息给老板。
我:老板,我想删库!
老板:滚!
这就是超时重传,我等了一段时间老板没有回复我,我也不能贸然删库对吧!
- 场景二:
我:老板,我想删库!
老板:滚!
但是我并没有收到老板的回复。
于是又过了 15 分钟,我再次给老板发消息。
我:老板,我想删库!
老板:滚!
我第一次没有收到了老板的回复,其实老板回复了,于是有发送了一条信息给老板,老板回复我,我知道自己不能删库。这也是超时重传!(我觉得老板可能准备把我删了)
实际上第二种情况只是老板的 ACK 丢了,但是我重复发送一条消息,老板觉得我指定有毛病,但是在 TCP 协议中,已经处理了这种重复发送数据的情况。
TCP 有一个接收缓冲区,也就是一块内存。TCP 会自己检查接收缓冲区中有没有重复的数据。
而之前说过 TCP 报文中有一个 32 位序号 对数据进行编号,根据这个序号就能去重。
连续丢包
丢包会出发超时重传,而连续丢包后,超时重传的时间间隔会越来越长。
而重传到一定的次数会尝试断开连接。