计算机网络学习笔记: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.pswp.cn/bicheng/86017.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Perl 正则表达式

Perl 正则表达式 引言 Perl 正则表达式(Regular Expressions)是Perl编程语言中一个强大且灵活的工具,用于字符串处理和模式匹配。正则表达式在文本处理、数据验证、搜索和替换等任务中发挥着至关重要的作用。本文将深入探讨Perl正则表达式的…

Security: RSA: 1024 bit 长度已经变得不安全了

文章目录 参考推荐限制RHEL相关配置man crypto-policies包含的应用使用方法是配置文件include参考 https://csrc.nist.gov/pubs/sp/800/57/pt1/r2/final https://www.linuxquestions.org/questions/linux-security-4/1024-bit-dsa-vs-2048-bit-rsa-4175439131/ https://csrc.n…

第一课:大白话中的机器学习

各位看官好啊!今天咱们来聊一个听起来高大上但实际上特别接地气的玩意儿——机器学习。别被这名字吓到,它其实就是教电脑像人类一样学习知识的一套方法。想象一下你教你家狗子坐下、握手的过程,机器学习差不多就是这么回事,只不过"学生"换成了电脑。 一、啥是机…

实现 el-table 中键盘方向键导航功能vue2+vue3(类似 Excel)

实现 el-table 中键盘方向键导航功能vue2vue3(类似 Excel) 功能需求 在 Element UI 的 el-table 表格中实现以下功能: 使用键盘上下左右键在可编辑的 el-input/el-select 之间移动焦点焦点移动时自动定位到对应单元格支持光标位置自动调整…

MyBatis:从入门到进阶

📌 摘要 在 Java 后端开发中,MyBatis 是一个非常流行且灵活的持久层框架。它不像 Hibernate 那样完全封装 SQL,而是提供了对 SQL 的精细控制能力,同时又具备 ORM(对象关系映射)的功能。 本文将带你从 MyB…

leetcode51.N皇后:回溯算法与冲突检测的核心逻辑

一、题目深度解析与N皇后问题本质 题目描述 n皇后问题研究的是如何将n个皇后放置在nn的棋盘上,并且使皇后彼此之间不能相互攻击。给定一个整数n,返回所有不同的n皇后问题的解决方案。每一种解法包含一个明确的n皇后问题的棋子放置方案,该方…

算法-每日一题(DAY9)杨辉三角

1.题目链接: 118. 杨辉三角 - 力扣(LeetCode) 2.题目描述: 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRo…

【MATLAB代码】制导方法介绍与例程——追踪法,适用于二维平面,目标是移动的|附完整源代码

追踪法(追踪导引法)是一种常见的导弹导引方式,其基本原理是保持导弹的速度矢量始终指向目标。在追踪法中,导弹的加速度可以表示为指向目标的加速度。 本文给出二维平面下,移动目标的追踪法导引的介绍、公式与matlab例程 订阅专栏后,可以直接查看完整源代码 文章目录 运行…

小白的进阶之路系列之十八----人工智能从初步到精通pytorch综合运用的讲解第十一部分

从零开始的NLP:使用序列到序列网络和注意力机制进行翻译 我们将编写自己的类和函数来预处理数据以完成我们的 NLP 建模任务。 在这个项目中,我们将训练一个神经网络将法语翻译成英语。 [KEY: > input, = target, < output]> il est en train de peindre un table…

SSL安全证书:数字时代的网络安全基石

SSL安全证书&#xff1a;数字时代的网络安全基石 在当今数字化浪潮中&#xff0c;网络通信安全已成为个人、企业和组织不可忽视的核心议题。SSL&#xff08;Secure Sockets Layer&#xff0c;安全套接层&#xff09;安全证书作为保障数据传输安全的关键技术&#xff0c;通过加…

LLM-201: OpenHands与LLM交互链路分析

一、核心交互链路架构 #mermaid-svg-ZBqCSQk1PPDkIXNx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZBqCSQk1PPDkIXNx .error-icon{fill:#552222;}#mermaid-svg-ZBqCSQk1PPDkIXNx .error-text{fill:#552222;strok…

【项目】仿muduo库one thread one loop式并发服务器SERVER模块(下)

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 |&#x1f5c3;️ mysql 项目文章&#xff1a; 仿muduo库one thread one loop式并发服务器…

数据库索引结构 B 树、B + 树与哈希索引在不同数据查询场景下的适用性分析

一、数据库索引结构B树 树概述 树是一种多路平衡查找树&#xff0c;广泛应用于数据库和文件系统中。B树的节点可以存储多个数据元素&#xff0c;并且保持树的平衡&#xff0c;以提高查询效率。 适用性分析 在数据量较大&#xff0c;范围查找较多的场景下&#xff0c;B树的查询效…

Linux进程间通信——信号

1.信号的介绍 信号( Signal )是 Unix, 类Unix以及其他POSIX兼容的操作系统中进程间通信的一种有限制的手段。 1&#xff09;信号是在软件层面上对中断机制的一种模拟&#xff0c;是一种异步通信方式。2&#xff09;信号可以直接进行用户空间进程和内核进程之间的交互&#xff…

Bytemd@Bytemd/react详解(编辑器实现基础AST、插件、跨框架)

ByteMD Markdown编辑器详细解释&修改编辑器默认样式&#xff08;高度300px) AST树详解 [ByteMD 插件系统详解(https://blog.csdn.net/m0_55049655/article/details/148811248?spm1001.2014.3001.5501) Sevelet编写的Bytemd如何适配到React中 ⚡️1️⃣ 背景概述 Byte…

《Redis》事务

文章目录 Redis中的原子性Redis的事物和MySQL事务的区别Redis实现事务什么场景下&#xff0c;会使用事务? Redis事务相关命令watch命令的实现原理 总结 Redis中的原子性 Redis的原子性不同于MySQL的原子性。 Redis的事物和MySQL事务的区别 但是注意体会Redis的事务和MySQL…

Elasticsearch Kibana (一)

一、官方文档 elasticsearch官网&#xff1a;elasticsearch官网 elasticsearch源码&#xff1a;elasticsearch源码 ik分词器&#xff1a; ik分词器 ik分词器下载&#xff1a;ik分词器下载 elasticsearch 版本选择&#xff1a;elasticsearch 版本选择 官方推荐Elasticsearch和j…

[linux] Ubuntu 24软件下载和安装汇总(自用)

经常重装系统&#xff0c;备份下&#xff0c;有用的也可以参考。 安装图形界面 apt install ubuntu-desktop systemctl set-default graphical.target reboot 安装chrome wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt insta…

分布变化的模仿学习算法

与传统监督学习不同,直接模仿学习在不同时刻所面临的数据分布可能不同.试设计一个考虑不同时刻数据分布变化的模仿学习算法 import numpy as np import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset from…

arm-none-eabi-ld: cannot find -lm

arm-none-eabi-ld -Tuser/hc32l13x.lds -o grbl_hc32l13x.elf user/interrupts_hc32l13x.o user/system_hc32l13x.o user/main.o user/startup_hc32l13x.o -lm -Mapgrbl_hc32l13x.map arm-none-eabi-ld: cannot find -lm makefile:33: recipe for target link failed 改为在gcc…