TCP重传机制详解——01概述

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超时重传
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 ACKdup ACK重复三次
SACK三个SACK选项块
FACK一次ACK+SACK(ACK-SACK之间有三个包未确认)
partial ACK一个ACK连续丢包情况下只确认部分收到了
dup ACKthin stram下dup ACK重复一次
注:
1. 当ACK报文中的ack值和SACK块之间存在空洞时,可以判定为partial ACK;
2. 在乱序接收数据包后只发送了一个重复的ACK,并且没有收到后续数据包,可以判定为thin stream

改进的重传机制,早期重传(ER,Early Retransmit)

谷歌还对快速重传提出了一种改进的重传机制,即早期重传(ER,Early Retransmit),主要解决某些特定场景下,没有足够的dupack出发的快速重传造成的问题。

REF

TCP重传概述
Linux超时重传引入示例
基础快速重传

  • 39
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值