当前位置: 首页 > news >正文

计算机网络学习笔记:TCP可靠传输实现、超时重传时间选择

文章目录

  • 一、TCP可靠传输实现
  • 二、TCP超时重传时间选择


一、TCP可靠传输实现

  TCP可靠传输的实现,主要基于发送方和接收方的滑动窗口,以及确认机制:

  • 发送方在未收到确认(ACK)前,可以将序号落在发送窗口内的数据段连续发送,但这些数据段必须保留在缓存中,不能释放,以便在超时或接收到重复 ACK 时进行重传。发送方的 滑动窗口表示 “允许发送但未确认” 的数据范围;TCP 不会等待一个 ACK 才发送下一个段,而是可以 “流水线” 式发送多个段;
  • 接收方在接收到发送方发送的报文后,要及时发送确认报文,如果接收到的报文段是不连续的,则会对连续报文段的最大序号及之前的数据进行确认。可以对发送方的滑动窗口大小进行调整(流量控制)。

在这里插入图片描述

  对于发送方和接收方的滑动窗口,都有前沿后沿的概念:

  • 发送方:
    • 后沿:已发送并且接收到确认报文的数据,可以删除。
    • 前沿:在滑动窗口的最大范围之外,不允许发送。
  • 接收方:
    • 后沿:已发送确认报文给发送方,并且这部分内容交付了应用进程,可以删除。
    • 前沿:在滑动窗口的最大范围之外,不允许接收。

在这里插入图片描述

  为了维护发送窗口的状态,可以使用P1,P2,P3三个指针:

  • P1:指向的是发送窗口内已发送,但是还未收到确认的部分的第一个数据的序号。
  • P2:指向的是发送窗口内还未发送的部分的第一个数据的序号。
  • P3:指向的是发送窗口外的部分的第一个数据的序号。

在这里插入图片描述
  假设下图的场景:

  • 发送方已经成功发送了 4、5、6 三个报文段;
  • 接收方只成功收到了 5、6,但没有收到 4;
  • TCP 默认使用 累计确认(ACK) 策略 —— 只能确认连续收到的数据段。

  此时接收方收到的ACK应该为4,同时对5,6进行缓存。这种情况并不会引起发送方的快重传,因为是第一次重复确认
在这里插入图片描述
  此时接收方收到了4的报文段,则反馈给发送方7的ack,表示已经接受到了4~6的报文段,现在要接受7的报文段,同时窗口向前滑动:
在这里插入图片描述
  假设此时发送方向接收方发送了7~10号报文段,但是接收方一直都没有ack,因为窗口内的序号已经用完了,发送方在接收到接收方的确认之前,不能发送新的数据,而如果一直接收不到接收方的确认,就会触发超时重传(慢开始 + 拥塞避免算法)
在这里插入图片描述

二、TCP超时重传时间选择

  RTT = 请求的往返时间 = 请求开始时间 - 接收到请求确认的时间。RTO则是超时重传的时间。RTO不能小于RTT,也不能远大于RTT的值,应设置为略大于RTT的值。
  然而上述只是理想情况下的设置,实际网络通信中,每次消息往返的时间都是不固定的,需要动态进行调整。在这里插入图片描述
  RTT的计算也是非常复杂的,当发送方发生超时重传的时候,无法知道接收方发出的确认报文段是针对原报文段的确认,还是重传报文段的确认。(应是对于重传报文段的确认)如果发送方将该报文段当做是对于原有报文段的确认,那么算出的RTT往返时间就会大于应有的值。
在这里插入图片描述
  同理,接收方在发送确认报文段发生了超时,导致发送方触发了超时重传。发送方无法知道接收方的确认报文段,是针对发送方第一次发送的报文的确认,还是超时重传报文的确认(应该是对于发送方第一次报文的确认。)那么算出的RTT往返时间就会小于应有的值。
在这里插入图片描述
  针对上述的问题,提出了一种karn算法。Karn 算法是用于 计算 TCP 中的往返时间(RTT)和重传超时时间(RTO) 的一个改进方法,专门用来避免因重传而导致的 RTT 估算不准确问题。其核心思想在于不要用重传报文段的 ACK 来更新 RTT 估算值。

  • 当发生重传时,不更新 RTT 估计值。
  • 只用未发生重传的报文段的 ACK 来估计 RTT。
  • 启用指数退避策略,即每次重传失败后,将 RTO 值加倍。

在这里插入图片描述

http://www.xdnf.cn/news/1059913.html

相关文章:

  • leetcode 2294. 划分数组使最大差为 K 中等
  • Kernel K-means:让K-means在非线性空间“大显身手”
  • 机器学习×第十二卷:回归树与剪枝策略——她剪去多余的分支,只保留想靠近你的那一层
  • Arduino Nano 33 BLE Sense Rev 2开发板使用指南之【环境搭建 / 点灯】
  • 基于微信小程序和深度学习的宠物照片拍摄指导平台的设计与实现
  • 【AI编程】第3期,针对AI生成的改枪码列表创建对应的数据库表
  • 主成分分析(PCA)例题——给定协方差矩阵
  • 关于嵌入式编译工具链与游戏移植的学习
  • 【图论 DFS搜索树】P10298 [CCC 2024 S4] Painting Roads|普及+
  • threejs 实现720°全景图,;两种方式:环境贴图、CSS3DRenderer渲染
  • 问题排查之nginx请求日志
  • 火山引擎TTS使用体验
  • FPGA基础 -- Verilog 行为级建模之条件语句
  • 阿里云主机自动 HTTPS 证书部署踩坑实录
  • 自演进多智能体在医疗临床诊疗动态场景中的应用
  • 24.分页查询
  • 学习大模型---需要掌握的数学知识
  • FPGA基础 -- Verilog行为级建模之initial语句
  • 系统思考与核心竞争力
  • FPGA基础 -- Verilog行为建模之循环语句
  • Conda 常用命令大全:从入门到高效使用
  • 【学习笔记】2.2 Encoder-Decoder
  • 基于SVM和dbs的孤岛检测算法
  • 利用Java进行验证码的实现——算数验证码
  • C# 实现 gRPC高级通信框架简单实现
  • 稀疏大模型架构与训练算法研究
  • MongoDB学习记录(快速入门)
  • 7.索引库操作
  • 使用duckduckgo_search python api 进行免费且不限次数的搜索
  • 设计模式精讲 Day 6:适配器模式(Adapter Pattern)