TCP快速重传机制

2023-11-19

一、快速重传机制

上一篇讲到了TCP 的超时重传,但是超时重传往往会带来许多微妙的问题,比如说:

当一个报文段丢失时,会等待一定的超时周期然后才重传分组,增加了端到端的时延。
当一个报文段丢失时,在其等待超时的过程中,可能会出现这种情况:其后的报文段已经被接收端接收但却迟迟得不到确认,发送端会认为也丢失了,从而引起不必要的重传,既浪费资源也浪费时间。
幸运的是,由于TCP采用的是累计确认机制,即当接收端收到比期望序号大的报文段时,便会重复发送最近一次确认的报文段的确认信号,我们称之为冗余ACK(duplicate ACK)。
如图所示,报文段1成功接收并被确认ACK 2,接收端的期待序号为2,当报文段2丢失,报文段3失序到来,与接收端的期望不匹配,接收端重复发送冗余ACK 2。

在这里插入图片描述

这样,如果在超时重传定时器溢出之前,接收到连续的三个重复冗余ACK(其实是收到4个同样的ACK,第一个是正常的,后三个才是冗余的),发送端便知晓哪个报文段在传输过程中丢失了,于是重发该报文段,不需要等待超时重传定时器溢出,大大提高了效率。这便是快速重传机制。

二、为什么是3次冗余ACK

首先要明白一点,即使发送端是按序发送,由于TCP包是封装在IP包内,IP包在传输时乱序,意味着TCP包到达接收端也是乱序的,乱序的话也会造成接收端发送冗余ACK。那发送冗余ACK是由于乱序造成的还是包丢失造成的,这里便需要好好权衡一番,因为把3次冗余ACK作为判定丢失的准则其本身就是估计值。
假定通信双方如下:

A为发送端,B为接收端
A的待发报文段序号为 N-1,N,N+1,N+2
假设报文段N-1成功到达
`
在这里插入图片描述

从以上罗列的情况可以看出,
在没丢失的情况下,有40%的可能出现3次冗余ACK
在乱序的情况下必定是2次冗余ACK
在丢失的情况下,必定出现3次冗余ACK

基于这样的概率,选定3次冗余ACK作为阈值也算是合理的。在实际抓包中,大多数的快速重传都会在大于3次冗余ACK后发生。

三、快速重传应用实例

快速重传机制比较好理解,这里贴上笔者做的两幅图供大家学习参考,若有建议可以提出。第一幅图是在某报文段的超时重传定时器溢出前重传丢失报文段,第二幅图是对应的接收端缓存队列的窗口移动示意。

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP快速重传机制 的相关文章

随机推荐

  • Ionic3开发教程 - 开发(2)

    Ionic3开发系列教程Ionic3开发教程 环境准备 1 Ionic3开发教程 开发 2 Ionic3开发教程 发布Android版本 3 Ionic3开发教程 发布IOS版本 4 Ionic3开发教程 更新 5 本文中介绍的Ionic3
  • mybatis在xml文件中处理大于号小于号的方法

    第一种方法 用了转义字符把 gt 和 lt 替换掉 然后就没有问题了 SELECT FROM test WHERE 1 1 AND start date lt CURRENT DATE AND end date gt CURRENT DAT
  • JAVA依赖冲突解决

    一 问题 启动时报错 二 原因 导入的包中存在依赖冲突 应该是打印日志的 三 解决办法 1 mvn dependency tree 打印项目的依赖树 2 安装MAVEN HELPER 2 1 查看依赖图 2 2 直接查看 四 解决 1 比如
  • SpriteKit框架详细解析(四) —— 创建一个简单的2D游戏(二)

    转自 https www jianshu com p 33f28911db17 版本记录 版本号 时间 V1 0 2017 08 12 前言 SpriteKit框架使用优化的动画系统 物理模拟和事件处理支持创建基于2D精灵的游戏 接下来这几
  • element级联懒加载多选不能回显问题

    1 定位原因 懒加载的级联下拉框无法回显是因为 只绑定了model的值 没有options的数据支撑的话 获取不到节点的内容导致 2 方案 拿到选中的项的时候 用这些值去递归循环获取相应的节点的一些属性 赋值给options 然后注意最后一
  • yolo v3 fatal : Memory allocation failure

    torch版的 yolov3报错 fatal Memory allocation failure parser add argument n cpu type int default 8 help number of cpu threads
  • 蚂蚁笔记私有部署

    说明 其实官方的教程中已经写得很清楚了 我写这个主要是为了记录一下我自己当时安装的过程 方便后续查询 官方文档请查阅 https github com leanote leanote wiki 环境要求 CentOS6 5 Nginx Mo
  • (原理及配置)nginx配置负载均衡

    背景介绍 早期的网站流量和业务功能都比较简单 单台服务器就可以满足基本需求 但是随着互联网的发展 业务流量越来越大并且业务逻辑也越来越复杂 单台服务器的性能及单点故障问题就凸显出来了 因此需要多台服务器组成应用集群 进行性能的水平扩展以及避
  • 一台电脑双 GitHub 账户配置,同时两个 SSH 密钥

    前言 本人搞了两个 GitHub 账号 一个用来正常的和别人合作项目 另一个用来自己写一些代码 希望能做到两个本地账户和远程账号都完全隔离 没有联系 也不会被混淆使用 但是这样就会有一个问题 设置本地用户 user email 时候 如果两
  • 嵌入式物联网协议--MQTT

    本文使用MQTT 3 1 1版本 目录 一 MQTT简介 1 什么是MQTT 2 MQTT本质 3 MQTT报文类型 4 MQTT Qos质量 二 14个报文详解 1 CONNECT报文 1 C gt S 固定报头 可变报头 负载 1 固定
  • 爬朋友圈好友的个性签名,生成云图(上)

    看了大神的http mp weixin qq com s biz MzIxNjA2ODUzNg mid 2651436390 idx 1 sn 0ec8030efc28b36c2924e7f02a4462f2 chksm 8c73adb1b
  • 请求的站点不可用或找不到_100个好用的生活小妙招,不收好,要用时就找不到!...

    阅读本文前 请您先点击上面的蓝色字体 秘密基地 再点击 关注 这样您就可以继续免费收到最新文章了 每天都有好看的图文 视频 秘密基地与你共赏 生活是一门学问 如果你能学着 偷懒 也许会变得更有乐趣 今天 为大家整理了100条实用的生活小妙招
  • 单片机晶振和波特率的关系

    在串行通信中 MCS 51串口可约定四种工作方式 其中 方式0和方式2的波特率是固定的 而方式1和方式3的波特率是可变的 由定时器T1的溢出率决定 波特率是指串行端口每秒内可以传输的波特位数 这里所指的波特率 如标准9600不是每秒种可以传
  • 苹果iPhone一键解锁破解流程(新机篇)

    网上详细流程已经很多了 建议破解之前都看一下 我这边说的就是要注意的几个地方 这几天我都泡在网上 感觉基本都会了 今天拿到机子 还是弄了3个小时 基本流程 1 拿到新机以后 首先要破解才能进入系统 如果不能进入系统 itunne不能更新到1
  • kafka配置内外网访问

    listeners 学名叫监听器 其实就是告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务 advertised listeners 和 listeners 相比多了个 advertised Advertised 的
  • linux的aux命令,Linux中 ps aux 命令

    ps aux USER PID CPU MEM VSZ RSS TT STAT STARTED TIME COMMAND root 11 100 0 0 0 0 16 RL 4Dec09 98403 03 48 idle cpu root
  • 如何将git项目转移给其他人

    为什么80 的码农都做不了架构师 gt gt gt 方法很简单 成员管理里将要转给项目的人设置为master 权限 然后他再登录系统将你移除项目就实现了项目转移 转载于 https my oschina net zhaky blog 907
  • 【Three.js】第十六章 Shadows 阴影

    16 Shadows 阴影 介绍 上节课我们学会了灯光 现在我们需要阴影 物体的背面应该在黑暗中 这就是阴影所谓的核心 我们缺少的是物体对象的投影 也就是根据被投影的对象在其他对象身上创建阴影 阴影渲染一直是实时 3D 渲染的一大挑战 开发
  • go 学习 之 GORM数据插入,查询,修改,删除

    GORM插入数据 gorm新增记录 定义一个用户 并初始化数据 u User Username tizi365 Password 123456 CreateTime time Now Unix 插入一条用户数据 下面代码会自动生成SQL语句
  • TCP快速重传机制

    一 快速重传机制 上一篇讲到了TCP 的超时重传 但是超时重传往往会带来许多微妙的问题 比如说 当一个报文段丢失时 会等待一定的超时周期然后才重传分组 增加了端到端的时延 当一个报文段丢失时 在其等待超时的过程中 可能会出现这种情况 其后的