TCP可靠性机制

确认号/序列号/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.rhkb.cn/news/103287.html

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

相关文章

服务器Linux系统配置mysql数据库主从自动备份

服务器Linux系统配置mysql数据库主从自动备份 当数据内容越来越多的时候,数据库也变得越来越大了。如果不小心误删了,或者被黑主机了,那就什么都没有了。所以数据库的数据怎么能让它不丢失做到万无一失变得尤为重要! 我是艾西&a…

全流程R语言Meta分析核心技术应用

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…

单片机(二)使用位移 让灯亮

一:硬件电路 P2 口: P2.0~ P2.7 是这些 I0 口 LED 阳极接 电源 , P20 口 为低电平 可以让 LED灯 亮 二:软件实现部分 两种 ① 通过循环 来展示从左 到右 #include "reg52.h"#define LED_PORT P2 // 定义单片机的P2端…

把握医学营养趋势 健启星加速突围

随着“健康中国”战略的提出,大健康产业上升到国家战略高度,进入高速发展期。市场数据显示,医学营养市场发展势头迅猛,年平均增速超过30%,中国医学营养市场也迎来高速发展。但目前品牌处于高度分散的状态,市…

解决 go mod tidy 加载模块超时

如果go mod tidy 加载模块超时 解决方法 修改GOPROXY: 查看go环境相关信息: go envgo env -w GOPROXYhttps://goproxy.cn

数据结构(4)

树 无论是符号表还是线性表,随着元素的增多,增删查操作耗时增加,为了提高运算效率,需要树。 树是由N(N>1)个有限结点组成一个具有层次关系的集合。 特征: 1.每个结点有零个或多个结点 2.…

在Linux系统中配置代理服务器来加速软件包管理

作为一名专业程序员,我今天要和大家分享一个在Linux系统中配置代理服务器来加速软件包管理的解决方案。如果你经常在Linux上使用软件包管理器(如apt、yum等),但下载速度缓慢,那么本文将给你带来一些操作方法&#xff0…

ChatGPT帮助提升工作效率和质量:完成时间下降40%,质量评分上升 18%

自ChatGPT去年11月发布以来,人们就开始使用它来协助工作,热心的用户利用它帮助撰写各种内容,从宣传材料到沟通话术再到调研报告。 两名MIT经济学研究生近日在《科学》杂志上发表的一项新研究表明,ChatGPT可能有助于减少员工之…

专题-【十字链表】

有向图的十字链表表示法:

CSS实现一个交互感不错的卡片列表

0、需求分析 横向滚动鼠标悬停时突出显示 默认堆叠展示鼠标悬停时,完整展示当前块适当旋出效果 移动端样式优化、磁吸效果美化滚动条 1、涉及的主要知识块 flex 布局css 简单变换过渡 transform、transition 渐变色函数 linear-gradient… 伪类、伪元素 滚动条、…

CSS 实现页面底部加载中与加载完毕效果

效果图 实现代码 <view class"bottom-load-tip"><view class"line-tip"></view><view class"loading-animation" v-if"!lastPage"></view><view>{{ lastPage ? "没有更多了" : "…

Java不用加减乘除做加法(图文详解)

目录 1.题目描述 2.题解 分析 具体实现 1.题目描述 写一个函数&#xff0c;求两个整数之和&#xff0c;要求在函数体内不得使用、-、*、/四则运算符号。 示例 输入&#xff1a;1 2 输出&#xff1a;3 2.题解 分析 不能使用加减乘除四则运算符&#xff0c;那我们只能考虑…

Rancher-RKE-install 部署k8s集群

一、为什么用Rancher-RKE-install 1.CNCF认证的k8s安装程序。 2.有中文文档。 二、安装步骤 1.下载Rancher-Rke的二进制包-下面是项目的地址 GitHub - rancher/rke: Rancher Kubernetes Engine (RKE), an extremely simple, lightning fast Kubernetes distrib…

opencv 案例实战02-停车场车牌识别SVM模型训练及验证

1. 整个识别的流程图&#xff1a; 2. 车牌定位中分割流程图&#xff1a; 三、车牌识别中字符分割流程图&#xff1a; 1.准备数据集 下载车牌相关字符样本用于训练和测试&#xff0c;本文使用14个汉字样本和34个数字跟字母样本&#xff0c;每个字符样本数为40&#xff0c;样本尺…

新能源汽车技术的最新进展和未来趋势

文章目录 电池技术的进步智能驾驶与自动驾驶技术充电基础设施建设新能源汽车共享和智能交通未来趋势展望结论 &#x1f389;欢迎来到AIGC人工智能专栏~探索新能源汽车技术的最新进展和未来趋势 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客…

Window Server 与 Windows 系统开关机日志查看方法

目录 Windows/Windows Server 查看日志Windows 系统常用的事件 ID 环境&#xff1a;Windows Server 2019 &#xff08;也适用于 Windows 其他系统&#xff09;。 不同版本的 Windows 图标可能有所不同&#xff0c;但是服务器级 Windows Server 与普通桌面级 Windows 还会有些操…

stm32之12.如何使用printf打印输出

主函数增加这些代码即可实现printf打印输出 需要添加头文件 #include "stdio.h" --------------- 源码 struct __FILE { int handle; /* Add whatever you need here */ }; FILE __stdout; FILE __stdin; int fputc(int c, FILE *f) { /* 发送一个字节 */ …

go rpc

运用go标准库写一个rpc例子 服务端 package mainimport ("fmt""net""net/rpc" )//对象 type Hello struct { } //对象方法 func (h *Hello) HelloWorld(name string, resp *string) error {*resp name "你好"return nil }func mai…

现货白银投资什么的?

也许很多投资者听说过现货白银&#xff0c;但并不知道它投资的是什么&#xff0c;过程中是如何进行买卖的&#xff0c;也不知道如果参与其中&#xff0c;自己需要承担什么风险&#xff0c;最终的收益会如何。对于上述的这些问题本文&#xff0c;将为大家简单地介绍一下。 虽然现…

前端进阶Html+css09----BFC模型

1.什么是BFC模型 全称是&#xff1a;Block formatting context&#xff08;块级格式化上下文&#xff09;&#xff0c;是一个独立的布局环境&#xff0c;不受外界的影响。 2.FC,BFC,IFC 元素在标准流里都属于一个FC&#xff08;Formatting Context&#xff09;。 块级元素的布…