TCP可靠性机制

news2025/1/15 6:27:55

确认号/序列号/ACK

TCP帮助确保数据的准确传递。为了做到这一点,其使用了一些特殊的标记和信息,其中包括序号、确认号和ACK字段。
其中,它将每个字节的数据都进行了编号. 即为序列号.在这里插入图片描述

  • 序列号:就像给书中的每一页都编了号码一样,TCP也给要发送的数据包编上号码,这个号码叫做序号。这个序号表示该数据包在整个数据包的位置(tcp是面向字节流的,当数据包过大时会被拆分成多个数据包进行发送)。这样,接收方就知道哪些数据包已经接收,哪些还没有。

  • 确认号:当接收方收到一个数据包后,它会回应一个特殊的包,其中包含一个确认号。这个确认号告诉发送方:“我已经收到了你发给我的序号为1-1000的数据包,下一个我期待收到的序号的起始是1001。”这样,发送方就知道接收方已经收到了哪些数据。每一个ACK都带有对应的确认序列号。

  • ACK字段:ACK 是 “Acknowledgment”(确认)的缩写。当接收方发送回应时,它会在包里设置一个特殊的标记,表示这个包是一个确认回应,意思是它收到了之前的数据包。这个标记就是 ACK 字段。发送方通过检查这个字段,可以知道接收方已经确认了之前发送的数据。

确认应答机制

这个机制是通过使用序列号、确认号和确认标志来实现的。

  1. 发送方发送数据段
    当发送方要向接收方发送数据时,它会将数据分成合适大小的数据段,并附上一个序列号。序列号表示数据段的起始字节在整个数据流中的位置。发送方同时还设置确认标志为0,表示这个数据段不需要确认应答。

  2. 接收方接收数据段并发送确认
    接收方收到数据段后,会根据序列号和数据长度来确定数据段的范围,并提取数据进行处理。接收方会生成一个确认号,该确认号设置为收到的数据段的序列号加上数据长度,再加1。这是因为确认号表示期望收到的下一个字节的序号。接收方会发送一个确认数据包,其中确认号表示期望收到的下一个字节的序号,同时确认标志被设置为1,表示这个数据段已被确认。

  3. 发送方接收到确认
    发送方收到确认后,会根据确认号来确定哪些数据段已经被成功接收并确认。一旦发送方收到了确认,它就知道接收方已经收到了数据,可以安全地移除这些已经被确认的数据段的副本。这样,发送方就能保证数据的可靠传输,因为只有在收到确认后才会认为数据已经成功传输。
    在这里插入图片描述

超时重传机制

该机制依赖于确认应答机制

触发条件

以下两种都对应着一种情况:发送方无法接受到确认应答(ACK)

第一种情况:数据包丢失

数据包丢失,发送方一定时间内没有收到ACK,则会重新发送数据包

第二种情况:ACK丢失

接收端已经收到数据包,只是ACK丢失,但发送方不知道,仍然会重新发送数据包,导致接收端有着大量重复数据。

那如何解决呢?

  • 使用上面所说的序列号,通过识别序列号来确认是否是重复数据,达到去重的目的

超时到底超多少才算呢

这个我查了,感觉知道也没啥用,这里给放上来好了。

  • 最理想的情况下, 找到一个最小的时间, 保证 “确认应答一定能在这个时间内返回”.
  • 但是这个时间的长短, 随着网络环境的不同, 是有差异的.
  • 如果超时时间设的太长, 会影响整体的重传效率;
  • 如果超时时间设的太短, 有可能会频繁发送重复的包;
  • TCP为了保证无论在任何环境下都能比较高性能的通信, 因此会动态计算这个最大超时时间.
  • Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时时间都是500ms的整数倍.
  • 如果重发一次之后, 仍然得不到应答, 等待 2*500ms 后再进行重传.
  • 如果仍然得不到应答, 等待 4*500ms 进行重传. 依次类推, 以指数形式递增.
  • 累计到一定的重传次数, TCP认为网络或者对端主机出现异常, 强制关闭连接.

连接管理

即三次握手、四次挥手,在这里了解【插入链接】

流量控制

接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送,
就会造成丢包, 继而引起丢包重传等等一系列连锁反应.因此TCP支持根据接收端的处理能力, 来决定发送端的发送速度. 这个机制就叫做流量控制(Flow Control);

  • 接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段, 通过ACK端通知发送端;
  • 窗口大小字段越大, 说明网络的吞吐量越高;
  • 接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端;
  • 发送端接受到这个窗口之后, 就会减慢自己的发送速度;
  • 如果接收端缓冲区满了, 就会将窗口置为0; 这时发送方不再发送数据, 但是需要定期发送一个窗口探测数据段, 使接收端把窗口大小告诉发送端。
    在这里插入图片描述

拥塞控制

拥塞窗口是什么

虽然滑动窗口机制根据接收方发来的接收缓冲区大小来进行判断可以显著提高效率,但如果网络中数据太多堵住了(类似于WiFi很多人一起用你就会发现网络变慢了),出现大量丢包,那么哪里来的效率呢?所以就有了拥塞窗口。

拥塞窗口的作用

网络中可能出现阻塞,如果此时接收端接收窗口是100mb,发送端发出数据,没有收到应答,触发超时重传机制,而此时网络中因为已经很堵了,此时发送端的滑动窗口再依据接收端的窗口大小去确定大小以发送数据,就会加剧网络拥堵,导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大。
而此时,拥塞窗口会不断探测,寻找一个在当前网络中能承载的最大的量来作为数据的大小,这个大小叫做MTU:最大传输单元,通过MTU与接收窗口,两者一起构成了滑动窗口协议中的流量控制机制(即取2者中小的那个作为滑动窗口的大小)。

拥塞窗口的工作原理

于是,TCP引入慢启动机制, 先发少量的数据, 探探路, 摸清当前的网络拥堵状态, 再决定按照多大的速度传输数据;

为了在发送方调节所要发送数据的量,定义了一个叫做拥塞窗口的概念。

  • 发送开始的时候, 定义拥塞窗口大小为1;
  • 每次收到一个ACK应答, 拥塞窗口加1;
  • 每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的接收缓冲区窗口大小做比较, 取较小的值作为实际发送的窗口(即滑动窗口);
    在这里插入图片描述

像上面这样的拥塞窗口增长速度, 是指数级别的.慢启动只是指初使时慢, 其另一个机制是快恢复
为了不增长的那么快, 因此不能使拥塞窗口单纯的加倍.此处引入一个叫做慢启动的阈值
当拥塞窗口超过这个阈值(ssthresh)的时候, 不再按照指数方式增长, 而是按照线性方式增长。
发生超时后,重新回到原点进行慢启动,使用算法设定阈值,以进入拥塞避免,以此反复探测适合发送的数据包大小。

延迟应答

  • 如果发送方长时间没有收到应答会超时重传,但我们如果接收数据的主机立刻返回ACK应答, 这时候返回的窗口可能比较小。
  • 假设接收端缓冲区为1M. 一次收到了500K的数据; 如果立刻应答, 返回的窗口就是500K;
    但实际上可能处理端处理的速度很快, 10ms之内就把500K数据从缓冲区消费掉了;
    在这种情况下, 接收端处理还远没有达到自己的极限, 即使窗口再放大一些, 也能处理过来;
    如果接收端稍微等一会再应答, 比如等待200ms再应答, 那么这个时候返回的窗口大小就是1M;
  • 那么所有的包都可以延迟应答么? No
    数量限制: 每隔N个包就应答一次;
    时间限制: 超过最大延迟时间就应答一次;
    具体的数量和超时时间, 依操作系统不同也有差异; 一般N取2, 超时时间取200ms;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/915020.html

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

相关文章

【核磁共振成像】傅里叶重建

目录 一、傅里叶重建二、填零三、移相四、数据窗函数五、矩形视野六、多线圈数据重建七、图像变形校正八、缩放比例九、基线校准 长TR,长TE,是T2加权像; 短TR,短TE,是T1加权像; 长TR,短TE&#…

关于vlan的三层架构实验

实验要求及拓扑 一、思路 1. 先配置接入层的接口类型及划分 2.配置汇聚层的接口类型及划分 3.配置汇聚层的IP地址及编写缺省、NAT--IP地址转换 4. 给vlan分组,定义组 的主根,组的备份根 5.汇聚层之间使用通道技术(华为:以太网中继Eth-Tru…

在线设计APP ui的网站,分享这7款

在数字时代,用户界面(UI)设计变得非常重要,因为良好的UI设计可以改善用户体验,增强产品吸引力。随着科学技术的发展,越来越多的应用在线设计网站出现,为设计师和团队提供了一种新的创作方式。本…

浅谈泛在电力物联网在电力设备状态在线监测中的应用

安科瑞 华楠 摘要:随着信息化水平的不断发展,泛在电力物联网的建设提上日程,这对提升变电站电力设备在线监测水平,推动智能电网发展具有重要的指导意义。对基于物联网的电力设备状态监测系统进行了研究,概括了泛在电力…

⏰⏰⏰⏰⏰⏰⏰⏰K8s常用指令集锦

1、常用基础命令 kubectl top pod -n wsmp kubectl get pod # 获取namespace下的所有podkubectl get pods -o wide # 获取 pod 详细信息 kubectl describe po ${podName} # 获得pod的状态kubectl get po ${podName} -o yaml # yaml 看不惯的话,也可以…

NPM 管理组织成员

目录 1、向组织添加成员 1.1 邀请成员加入您的组织 1.2 撤销组织邀请 2、接收或拒接组织邀请 2.1 接收组织邀请 2.2 拒绝组织邀请 3、组织角色和权限 4、管理组织权限 5、从组织中删除成员 1、向组织添加成员 作为组织所有者,您可以将其他npm用户添加到…

gRpc的四种通信方式详细介绍

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

python+selenium的web自动化之针对上传操作的实现方案

一、关于上传操作 ​ 上传有两种情况: 如果是input可以直接输入路径的,那么直接使用send_keys(文件路径)输入路径即可; 非input标签的上传,则需要借助第三方工具:第三方库 pywin32、第三方工具pyautogui等等。 ​ 那…

揭开路由协议隐藏的风险

路由协议在互联网和基于其的服务的运行中发挥着至关重要的作用。然而,许多这些协议的开发都没有考虑到安全问题。 例如,边界网关协议 (BGP) 最初并未考虑对等点之间发生攻击的可能性。过去几十年来,BGP 中的起源和路径验证已投入了大量工作。…

JUC--阻塞队列

目录 问题引出 一.单端阻塞队列(BlockingQueue) 二.双端阻塞队列(BlockingDeque) 三.延迟队列(DelayQueue) 问题引出 由于实现消费者-生产者模型,每一次实现都比较麻烦,比如sych…

2023河南萌新联赛第(六)场:河南理工大学 B - 这是dp题吗

2023河南萌新联赛第(六)场:河南理工大学 B - 这是dp题吗 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 小l同学非常喜欢三角形&#x…

淘宝商品优惠券详情item_get_app-获得淘宝app商品详情原数据

item_get_app-获得淘宝app商品详情原数据 taobao.item_get_app 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)调用API接口入口secretString是调用密钥api_nameString是API接口名称(包括在请求地址中&#xff09…

等级发布/查询平台

在传统的教学模式下,老师们需要手动把成绩挨个私发给学生家长,这不仅费时费力,还容易出现错误。然而,随着科技的不断发展,易查分系统的出现为教师提供了一个高效准确的成绩发布工具。 系统优势 1. 高效便捷&#xff1a…

【数据结构与算法】弗洛伊德算法

弗洛伊德算法 介绍 和 Dijkstra 算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。弗洛伊德算法计算图中各个顶点之间的最短路径。迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。弗洛伊德算…

贪吃蛇大作战技术报告(JAVA)

完整作品见链接:JAVA贪吃蛇大作战大作业_Java贪吃蛇如何实现向左不能向右资源-CSDN文库 猫猫大作战技术报告 1、项目概述 本项目的编译环境为jdk-19,用到的编译器为Eclipse,采用图形化编程,基于JAVA的Swing库进行界面的绘制&…

解决Pandas KeyError: “None of [Index([...])] are in the [columns]“问题

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

使用ctcloss训练矩阵生成目标字符串

首先我们需要明确 c t c l o s s ctcloss ctcloss是用来做什么的。比如说我们要生成的目标字符串长度为 l l l,而这个字符串包含 k k k个字符,字符串允许的最大长度为 L L L,这里我们认为一个位置是一个时间步,就是一拍&#xff0…

PyTorch三种主流模型构建方式:nn.Sequential、nn.Module子类、nn.Module容器开发实践,以真实烟雾识别场景数据为例

Keras和PyTorch是两个常用的深度学习框架,它们都提供了用于构建和训练神经网络的高级API。 Keras: Keras是一个高级神经网络API,可以在多个底层深度学习框架上运行,如TensorFlow和CNTK。以下是Keras的特点和优点: 优点&#xff…

解决git上传远程仓库时的最大文件大小限制

git默认限制最大的单文件100M,当某个文件到达50M时会给你提示。解决办法如下 首先,打开终端,进入项目所在的文件夹; 输入命令:git config http.postBuffer 524288000 执行完上面的语句后输入:git config…

Stable Diffusion 系列教程 | 图生图基础

前段时间有一个风靡全网的真人转漫画风格,受到了大家的喜欢 而在SD里,就可以通过图生图来实现类似的效果 当然图生图还有更好玩的应用,我们一点一点来探索 首先我们来简单进行一下图生图的这一个实践---真人转动漫 1. 图生图基本界面 和…