文章目录
- TCP重传机制详解——01概述
- 什么是TCP重传?
- TCP为什么要重传?
- TCP如何做到重传?
- TCP重传方式有哪些
- 超时重传(timeout or timer-based retransmission)
- 快速重传(fast retransmission或者fast retransmit)
- 改进的重传机制,早期重传(ER,Early Retransmit)
- REF
TCP重传机制详解——01概述
什么是TCP重传?
重传,表示的重复传输。在生活中,就是书信的重复传输;在用户使用的网络世界里,就是数据和信息的重复传输;在TCP/IP协议中,就是报文的重复传输。
TCP重传就像寄信一样,如果你没收到回执,就说明信可能没送到,于是你就再寄一次,直到对方告诉你信收到了为止。在网络里,TCP就是帮你这样安全送“信”的,如果电脑A发给电脑B的信息没被确认收到,TCP就会重新发送这个信息,确保信息一定能到达B电脑。
TCP为什么要重传?
我们都知道TCP的三个特点,分别是面向连接、可靠、字节流式。
重传的目的就是尽可能的保证TCP的可靠。
TCP如何做到重传?
TCP重传的最基本的元素就是seq和ack字段,也就是在数据分段的前提下,如何知道哪一个数据丢失了,哪一个数据接收到了。所以seq和ack的值就是让我们可以知道我们需要重传哪些数据的依据。
- 序号(Sequence Numbers): 每个TCP数据段都携带一个序号字段,表示数据段中数据的起始字节在整个数据流中的位置。发送端在发送数据时,会给每个数据段分配一个唯一的序列号,以便接收端可以按照正确的顺序重新组装数据流。
- 确认应答(ACKnowledgments): 接收端在接收到数据段后,会通过ACK应答告诉发送端已成功接收的数据段的序列号。ACK字段中携带的值是期望接收的下一个数据段的序列号,即上次已成功接收数据段的序列号加上传送的数据字节数。
所以,需要知道这个前提,不用想的太复杂,之后的很多机制都是基于此。TCP重传的本质设计思路,便是基于序号(Sequence Numbers)和确认应答(ACKnowledgments)
TCP重传方式有哪些
超时重传(timeout or timer-based retransmission)
这种重传方式是发出去的数据在RTO超时后还没有收到对应的ACK就会进行超时重传。
- RTO(Retransmission Time Out),传输超时时间
- RTT(Round Trip Time),往返时间,数据发送至收到ACK的时间。
RTO值是根据RTT进行公式计算的,而网咯是动态变化的,所以往返时间也并非确定,所以RTO也是动态变化的
RTO倍增,指数回避,RTT-2RTO-4RTO-8RTO-16RTO.......
如果得不到回应,超时重传会一直重传下去吗?
不会!会有次数限制吗?
内核参数 | 场景 |
---|---|
/proc/sys/net/ipv4/tcp_syn_retries | 初始SYN握手重试次数 |
/proc/sys/net/ipv4/tcp_syn_retries | 第二次SYN+ACK握手重试次数 |
/proc/sys/net/ipv4/tcp_syn_retries | 第二次SYN+ACK握手重试次数 |
/proc/sys/net/ipv4/tcp_retries1 | 在超时后第一次尝试多少次重传(针对数据段) |
/proc/sys/net/ipv4/tcp_retries2 | 在超时后最多尝试多少次重传(针对数据段) |
关于tcp_retries1和tcp_retries2的深入理解:tcp_retries1和tcp_retries2
快速重传(fast retransmission或者fast retransmit)
当TCP注意到累计ack(即TCP头中的ack number)不再推进或者接收端通过SACK信息指示发送端接收端存在洞(hole)时候就会触发发送端的重传,通常来说快速重传比超时重传更高效。
触发机制:
类型 | 触发条件 |
---|---|
dup ACK | dup ACK重复三次 |
SACK | 三个SACK选项块 |
FACK | 一次ACK+SACK(ACK-SACK之间有三个包未确认) |
partial ACK | 一个ACK连续丢包情况下只确认部分收到了 |
dup ACK | thin stram下dup ACK重复一次 |
注:
1. 当ACK报文中的ack值和SACK块之间存在空洞时,可以判定为partial ACK;
2. 在乱序接收数据包后只发送了一个重复的ACK,并且没有收到后续数据包,可以判定为thin stream
改进的重传机制,早期重传(ER,Early Retransmit)
谷歌还对快速重传提出了一种改进的重传机制,即早期重传(ER,Early Retransmit),主要解决某些特定场景下,没有足够的dupack出发的快速重传造成的问题。
REF
TCP重传概述
Linux超时重传引入示例
基础快速重传