先理解ACK的基本工作原理,当发送端发送第N-1个包后,接收端答复的ACK序列号实际上跟发送端发送下一个包,也就是第N个包的序列号一致。

假设有个主机ISN是5000,发送500字节报文至接收方。一旦报文接收之后,接收端回复一个ACK号为5500的TCP ACK报文,基于以下公式:Sequence Number In + Bytes of Data Received = Acknowledgment Number Out。按照上述计算结果,返回发送端的确认编号实际上是接收端希望收到的序列号。

假设报文长度都为1,则示例如下:

seq是序列号,这是为了连接以后传送数据用的,ack是对收到的数据包的确认,值是等待接收的数据包的序列号。
在第一次消息发送中,A随机选取一个序列号作为自己的初始序号发送给B;第二次消息B使用ack对A的数据包进行确认,因为已经收到了序列号为x的数据包,准备接收序列号为x+1(1可以修改为数据包的长度)的包,所以ack=x+1,同时B告诉A自己的初始序列号,就是seq=y;第三条消息A告诉B收到了B的确认消息并准备建立连接,A自己此条消息的序列号是x+1,所以seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。seq是数据包本身的序列号;ack是期望对方继续发送的那个数据包的序列号。上述过程如下图所示。

重复ACK

是指在接收方收到乱序报文时,所发出的一类TCP报文。TCP使用报文头的序列号和确认号以有效保证数据按照发送的顺序接收和重组。当TCP连接建立以后,握手过程中交换的一个最重要的信息是初始序列号(ISN)。一旦连接双方设定了ISN之后,接下来发送的报文所包含的序列号增加一个数据载荷值。

以A方发送,B方接收报文为例。观察其中第N-1个报文到达B方后,B方的答复。B收到第N-1报文后,就会答复1个ACK号为N的ACK报文,此时如果收不到序列号为N的报文,则会继续发送第2个ACK号为N的答复报文,此为重复ACK。如果一直收不到对方序列号为N的报文,则会出现三次冗余的ACK,则意味着很大可能出现丢包了。

下面看为何快速重传是选择3次ACK?

主要的考虑还是要区分包的丢失是由于链路故障还是乱序等其他因素引发。两次duplicated ACK时很可能是乱序造成的!三次duplicated ACK时很可能是丢包造成的!四次duplicated ACK更更更可能是丢包造成的!但是这样的响应策略太慢。丢包肯定会造成三次duplicated ACK!综上是选择收到三个重复确认时窗口减半效果最好,这是实践经验。

在没有fast retransmit / recovery 算法之前,重传依靠发送方的retransmit timeout,就是在timeout内如果没有接收到对方的ACK,默认包丢了,发送方就重传,包的丢失原因1)包checksum 出错 2)网络拥塞 3)网络断,包括路由重收敛,但是发送方无法判断是哪一种情况,于是采用最笨的办法,就是将自己的发送速率减半,即CWND 减为1/2,这样的方法对2是有效的,可以缓解网络拥塞,3则无所谓,反正网络断了,无论发快发慢都会被丢;但对于1来说,丢包是因为偶尔的出错引起,一丢包就对半减速不合理。于是有了fast retransmit 算法,基于在反向还可以接收到ACK,可以认为网络并没有断,否则也接收不到ACK,如果在timeout 时间内没有接收到> 2 的duplicated ACK,则概率大事件为乱序,乱序无需重传,接收方会进行排序工作;而如果接收到三个或三个以上的duplicated ACK,则大概率是丢包,可以逻辑推理,发送方可以接收ACK,则网络是通的,可能是1、2造成的,先不降速,重传一次,如果接收到正确的ACK,则一切OK,流速依然(包出错被丢)。而如果依然接收到duplicated ACK,则认为是网络拥塞造成的,此时降速则比较合理。

TCP快速重传为什么是三次冗余ack,这个三次是怎么定下来的?相关推荐

  1. 关于TCP快速重传的细节-重传优先级与重传触发条件

    这篇文章写的有点过于细节,因此考虑到可读性和日后的可查阅性,我以两个问题作为引子.作为TCP相关项目的招聘,也可以作为面试题,不过,我敢肯定,大多数人都不能回答第一个问题,第二个问题可能会模棱两可. ...

  2. 通过packetdrill构造的包序列理解TCP快速重传机制

    TCP的逻辑是极其复杂的,其学习曲线虽然很平缓但其每一步都是异常艰难,好在这些都是体力活,只要肯花时间也就不在话下了.想彻底理解一个TCP的机制,有个四部曲: 1.读与其相关的RFC: 2.看Linu ...

  3. TCP快速重传为什么是三次冗余ack

    先理解ACK的基本工作原理,当发送端发送第N-1个包后,接收端答复的ACK序列号实际上跟发送端发送下一个包,也就是第N个包的序列号一致. 重复ACK是指在接收方收到乱序报文时,所发出的一类TCP报文. ...

  4. 计算机网络之(2):TCP 相关知识——累积确认,三次握手,四次挥手,滑动窗口,超时重传、快速重传

    文章目录 TCP 概述 socket 的作用和存在意义 如何保证传输的可靠性 累积确认机制 TCP 三次握手建立连接 总结三次握手 四次挥手 总结四次挥手 TCP 连接突然终止 滑动窗口机制 总结滑动 ...

  5. 【计算机网络】传输层 : TCP 可靠传输 ( 可靠传输机制 | 快速重传机制 )

    文章目录 一.TCP 可靠传输 二.TCP 可靠传输机制 三.TCP 快速重传 机制 一.TCP 可靠传输 可靠性 : 保证 接收方进程 从 TCP 缓冲区 中读取的数据 与 发送方进程 发送的数据 ...

  6. 传输层 TCP 拥塞控制(3):快速重传与快速恢复

    当出现丢包的时候,我们将重新执行慢启动,此时意味着拥塞窗口大幅度下降发送速率也会大幅度下降,当丢包场景并不是很严重的时候,我们还可以采用快速重传,与快速恢复这样一个阶段. 为何会接收到一个失序数据段? ...

  7. TCP-超时重传和快速重传

    文章目录 超时重传 超时重传时间RTO 重传二义性 如果多次超时呢?--超时时间间隔加倍 快速重传 超时重传和快速重传的对比 超时重传 重传机制会设定一个定时器,当超过指定的时间后,没有收到对方的 A ...

  8. TCP-F(orward)ACK:植入快速重传灵魂的强制快速重传

    纸上学来终学浅,绝知此事要躬行. 今日和友人争辩快速重传,只拿着书本上的东西和人对飙近20分钟,还自认为略有取胜,真是汗颜加羞愧. 中文版计算机网络,书上还写着接收到3次重复ACK启用快速重传.TCP ...

  9. 网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)

    TCP协议 TCP协议概念 TCP全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议 ...

最新文章

  1. 如何将三万行代码从Flow移植到TypeScript?
  2. Unable to instantiate Action, MenuAction, defined for 'QueryMenuAll' in namespace '/'MenuAction
  3. libpcap 源代码分析(二)
  4. 科大星云诗社动态20210506
  5. No transaction aspect-managed TransactionStatus in scope
  6. Java黑皮书课后题第7章:7.4(分析成绩)编写一个程序,读入个数不确定的考试分数,并且判断有多少个分数是大于或等于平均分,多少个分数是低于平均分的。输入一个负数表示输入结束。假设最高分是100
  7. CXF学习(4) 处理无法自动转换的复合数据类型
  8. anaconda下载jupyter写python_如何安装Anaconda3和使用Jupyter
  9. Session过期,如何跳出iframe框架页的问题
  10. php的SAPI,CLI SAPI,CGI SAPI
  11. Kendo Web UI Grid里时间格式转换
  12. 吐血整理!内部包含3980大数据、机器学习、推荐系统实战课程,仅分享一次
  13. 一个发人深省的经典理财故事
  14. 学计算机不管干哪行,语言是必备的基本素质(认真学习C++)
  15. Cent 6.5中安装NFS、Rpcbind 实现共享主机文档。
  16. 深入理解JVM虚拟机1:JVM内存的结构与消失的永久代
  17. 如何使用xshell4连接自己搭建的服务器
  18. 数据库系统概念 第三章 习题答案
  19. Echarts地图深入+散点
  20. 1124 Raffle for Weibo Followers (20 分)

热门文章

  1. #软件更新#Visual Studio更新到16.3.8
  2. Xamarin Essentials教程发送邮件Email
  3. Nessus漏洞扫描教程之使用Nmap工具扫描识别指纹
  4. matlab字母随机排列,matlab_一组数据元素随机排列
  5. 每隔k次反转一次 链表_leetcode 25 K个一组翻转链表(c++)
  6. android的数据存储方式有哪几种方式,Android存储数据的5种方式
  7. java短横线转驼峰_第二讲:Java的运作原理
  8. “无路之门”,一款VR恐怖冒险游戏
  9. 看不见的Unicode码让敏感词轻松逃过审核,谷歌IBM都中招
  10. 搞事情?!2020云·创季来啦,量子位带你领略云产业的耳目一新!