传输层5——TCP可靠传输的实现(重点!!)

TCP协议如何实现可靠传输?确保接收方收到数据?
需要依靠几个结构:
以字节为单位的滑动窗口
这其中包括发送方的发送窗口和接收方的接收窗口
下面的描述,我们指定A为发送端口,B为接收端口
TCP的可靠传输就是靠着滑动窗口实现的
下面我将对:
什么是滑动窗口
如何实现可靠传输?
传输过程怎样变化?
等待。。。

目录

一、什么是滑动窗口?

二、滑动窗口如何工作?

1、发送窗口

1)发送窗口的特点

2)发送窗口后沿的变化

3)发送窗口前沿的变化

2、接收窗口

二、窗口和TCP缓存

1、发送窗口和发送缓存

2、接收窗口和接收缓存

3、注意事项-TCP规则

三、超时重传时间的选择

1、超时重传时间的困难

2、如何选取超时重传时间?

四、选择确认SACK


一、什么是滑动窗口?

以发送窗口为例:
就是一个数据范围,形象的比喻为窗口
这个窗口内部的所有字节都可以发送
后沿前的数据表示:已经确认发送的数据,因而不需要保留
前沿前的数据表示:不能发送发送的数据,因为接收窗口没有那么多的缓存

如图:(注意,窗口方向,以还没有发送方向为前方)

二、滑动窗口如何工作?

为实现可靠传输
需要在发送方和接收方各自设置一个窗口
发送方的叫做发送窗口
接收方的叫做接收窗口

1、发送窗口

1)发送窗口的特点

1、数据保留
没有确认收到的,但是已经发送的数据需要保留,以便超时重传
发送窗口越大,表明可以发送更多的数据,有更高的传输效率

2、发送窗口根据接收窗口构造
B向A发送的确认报文包括B的接收窗口大小,放在TCP首部的窗口字段
同时包括已经确认接收的确认号n
确认号一般采用累计确认,表示n前面的数据已经全部接收,n和n以后的数据没有接收

确认报文 = B窗口值 + 确认号

发送窗口的可用窗口表示:可以发送但未发送的数据

2)发送窗口后沿的变化

1、不动:没有接收到确认报文
2、前移:收到确认报文
3、不可能后移,因为确认不可撤销

3)发送窗口前沿的变化

1、不动:没有收到新的确认,同时对方通知的窗口大小不变
        或者说到确认,但是窗口缩小,后沿前移,但是前沿不动
2、向前:一对方窗口变大。二收到确认且对方窗口不变或变大
3、后移:对方窗口缩小,A不得不跟着缩小

描述一个发送窗口的状态需要三个指针,如图:
p1分割确认发送和未确认发送
p2分割未确认发送和可发送但未发送
p3分割可发送但未发送和不可发送

2、接收窗口

接收窗口和发送窗口结构一样,但是管理的数据意义不同

窗口内部的数据是可以接收的数据
前沿之前:不可以接收的数据,缓存不够
后沿之后:已经确认提交主机的数据
中间还分两部分:未发送确认的数据 和 可以接收但是没有到的数据

B向A发送的确认号只对目前接收到的有序数据的最大序号,注意,是有序

当A的可用窗口为0时(窗口内的数据全部发送完,可发送但未发生的数据为0)
A只能等待B的确认报文才能进行更新
如果A没有接收到B的确认报文
并且时间超过了超时计时器
A就要重发所有未确认收到的数据

二、窗口和TCP缓存

1、发送窗口和发送缓存

发送窗口一般只是TCP发送缓存的一部分
TCP发送缓存包括:发送窗口的数据 + 被应用程序写入TCP缓存的数据
如图:


2、接收窗口和接收缓存

接收窗口也只是TCP接收缓存的一部分
TCP接收缓存包括:接收窗口的数据 + 按序到达的,但是没有被程序读取的数据;没有
(其中,接收窗口还包括未按序到达的数据)
如图:

对于接收方:
如果接收的数据分组有错,丢弃
接收应用进程不能及时读取数据,接收缓存就会存满,使得接收窗口为0
否则,能够及时读取,接收窗口就可以增大,但是不能超过接收缓存

3、注意事项-TCP规则

1、TCP要求A的发送窗口根据B的接收窗口构造
但是不一定A的发送窗口就和B的接收窗口一样大,可能小
设计拥塞和流量控制

2、TCP对没有按序到达数据没有明确规定
但是会进行缓存,当缺少的序列到达,再上传上层应用程序

3、TCP要求接收方有累计确认的功能
接收方可以在发送数据时顺带确认号,但是双方通信一般不会双向交互
接收方不应该太晚发送确认报文,否则就会触发超时重传

4、TCP是全双工通信
因此通信双方都用有发送和接收两个窗口

三、超时重传时间的选择

1、超时重传时间的困难

如果B发送给A的确认丢失,如果A一直等待,就会出现死锁问题
因此,在A发送数据结束的同时,会设置超时重传时间
一旦超过这个时间没有接收到对方的确认报文
则认为数据没有到达,重新发送数据
但是,什么时候重传?重传的时间取多久?
一般是比往返时间RTT时间大一些
可以往返时间RTT很难确定
因为每一个数据报文的往返时间是不固定的
上一次可能经过1个路由器就到了
这一次可能经过1000个路由器才到
其中每个网络段的传输速度还不一样
例如,虽然经过了1000个路由器,但是速度很快,畅通无阻
有些经过了1个路由器,可是却堵的要死
怎么办?
很难取舍

2、如何选取超时重传时间?

根据新的RTT时间进行自适应更新
共有三个公式,对应三个参数:
第一个公式:每次收到一个新的RTT时间,对其进行重新计算,得到新的RTTs
            (第一次的RTTs 等于当前的RTT,因为没有旧数据,他是第一个)
公式如下:a=1/8

第二个公式:计算RTT的加权平均值——RTTD
            (第一次传输的RTTD取RTT的1/2)
公式如下:β=1/4

第三个公式:计算最终超时重传时间RTO
公式如下:

RTTs -> RTTD -> RTO

上述的公式似乎已经可以解决重传时间了
但是,设想一种场景:
A发送了数据1,可是到了重传时间,依旧没有收到确认1
此时,A就要重发
注意,此时A并没有收到任何的确认报文
但是,A对B发送了两次同样的数据1
于是,这就会产生两个一模一样的确认报文!
因为这两个报文都是对数据1的确认。
好了,现在麻烦来了:
A如何判断现在收到的这个确认报文
是对原来数据的确认,还是对重传数据的确认?
很明显,如果把重传确认认成了对原来数据的确认,计算出的RTO重传时间就会偏小
反之则偏大
同时,如果后期的数据也和上述的一样,
重传时间有越来越大和越来越小的1可能
怎么办?
修正。
怎么修正?
Karn算法规定:只要数据重传,则采用其往返时间
可是,问题又来了?
不采用新的往返时间,如何更新重传时间呢?
大佬就是大佬,
于是Karn再次修正:你不重传吗,好,你了不起,你niu批!
只要重传,就把重传时间增大,一般是2倍
当没有重传,再按照上述公式计算

四、选择确认SACK

这个协议解决如果数据没有按需到达怎么办?
例如:
0 1 3 4 5都到了
就是你2没有
怎么说?

举个例子,如图:
1001-1500没有收到
3001-3500没有收到

怎么办?
1、TCP首部选项增加SACK选项

2、选项中记录不连续块的边界
以通知发送方,我哪到哪没有传,例如1000-1500没有传
注意:
    选项长度最大为40字节
    而一个边界序号是4个字节
    因此,最多只能记录4个不连续块
    4 个不连续块有8个边界序号,每个边界序号4字节,共32字节
    还需要两个字节,一个指明SACK选项,一个指明选项长度
    共34字节
    
注意:SACk文档没有指明发送方要如何相应SACK报文
也就是说,发送方收到SACK报文后,他都不知道该怎么办
因此,大多数的实现依旧是从确认号开始全部重传

我:啊???那你SACK干了个什么?

抽象

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java Random随机数

Randoms是什么 在Java中,Random类是用于生成伪随机数的工具。它位于java.util包中。以下是一些使用Random类生成不同类型的随机数的方法: 1 创建 Random 类的实例 2 生成一个随机的int值(范围从Integer.MIN_VALUE到Integer.MAX_VALUE&#…

React的复制粘贴组件——React Copy to Clipboard

React Copy to Clipboard是一个用于在React应用程序中复制文本到剪贴板的库。它提供了一个简单的方式来实现复制到剪贴板的功能,支持多种浏览器和设备。 安装 你可以使用npm或yarn来安装React Copy to Clipboard: npm install react-copy-to-clipboa…

【Android Studio】学习——网络连接

实验:Android网络连接 文章目录 实验:Android网络连接[toc]实验目标和实验内容:1、掌握Android联网的基本概念;2、能够使用URL connection实现网络连接;3、掌握第三方库的基本概念4、需实现的具体功能 实验结果功能说明…

泷羽Sec-星河飞雪-bp验证码爆破

免责声明 学习视频来自 B 站up主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 泷羽sec官网:http…

基础算法——搜索与图论

搜索与图论 图的存储方式2、最短路问题2.1、Dijkstra算法(朴素版)2.2、Dijkstra算法(堆优化版)2.3、Bellman-Ford算法2.4、SPFA求最短路2.5、SPFA判负环2.6、Floyd算法 图的存储方式 2、最短路问题 最短路问题可以分为单源最短路…

C#构造函数 析构函数 静态成员(类) 密封类 字段以及属性

每当创建类或结构的实例时,将会调用其构造函数。 类或结构可能具有采用不同参数的多个构造函数。 使用构造函数,程序员能够设置默认值、限制实例化,并编写灵活易读的代码 如果静态构造函数尚未运行,静态构造函数会在任何实例构造…

公立医院高质量发展——急慢性气道疾病药学服务科普宣传培训成功开展

2023年,为积极响应国家关于推动公立医院高质量发展的号召,中国健康促进基金会开展了公立医院高质量发展——急慢性气道疾病药学服务科普宣传培训。该项目旨在通过科普宣传和培训,提升咳喘药学规范化服务水平,促进临床专业知识与咳…

product/admin/list?page=0size=10field=jancodevalue=4562249292272

文章目录 1、ProductController2、AdminCommonService3、ProductApiService4、ProductCommonService5、ProductSqlService https://api.crossbiog.com/product/admin/list?page0&size10&fieldjancode&value45622492922721、ProductController GetMapping("ad…

linux介绍------VMWare的卸载,下载,安装------及基础命令使用

文章目录 Linux第一天1、为什么要学习linux?2、怎么去学linux?(什么是大数据)3、VMWare的卸载,下载,安装4、检查网卡5、创建新的虚拟机(安装步骤:看视频)6、几个名字的理…

游戏引擎学习第38天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾上次的内容。 我们之前讨论了将精灵放在屏幕上,但颜色错误的问题。问题最终查明是因为使用了一个调整工具,导致文件的字节顺序发生了变化。重新运行“image magic”工具对一些大图像进行重新处理后&am…

leetcode 二进制数转字符串

1.题目要求: 2.题目代码: class Solution { public:string printBin(double num) {string result;double compare_value 1.0;//先给把0和.赋值给result;result.push_back(0);result.push_back(.);while(result.size() < 33){//利用十进制转换成二进制的方法//1.先给num …

JS进阶DAY3|页面加载事件和页面滚动事件

目录 一、页面加载事件 1.1 DOMContentLoaded 事件 1.1.1 触发时机 1.1.2 用途 1.1.3 代码示例document.addEventListener(DOMContentLoaded, (event) > { 1.2 load 事件 1.2.1 触发时机 1.2.2 用途 1.2.3 代码示例 二、页面滚动事件 1.1 scroll事件 1.1.1 触…

overleaf 写论文 语法笔记

1.找参考的期刊/论文模板 注册账户后并登录后进入这个界面&#xff0c;创建的所有历史项目会在这个界面显示&#xff0c;后期可以继续修改。 创建新项目&#xff1a;点击绿色按钮“创建新项目”后&#xff0c;可以新建空白项目&#xff0c;可以选择模板直接往模板里添加内容,…

OpenCV-平滑图像

二维卷积(图像滤波) 与一维信号一样&#xff0c;图像也可以通过各种低通滤波器&#xff08;LPF&#xff09;、高通滤波器&#xff08;HPF&#xff09;等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…

Pandas | skill | 将groupby分组后的数据使用堆叠图像展示

groupby堆叠图 计算商品名称和销售数量计算商品名称和销售总额在每个颜色段上标注商品名称和平均销售金额 计算商品名称和销售数量 # 筛选出四个类别下的商品数据 categories_of_interest [Clothing, Accessories, Footwear, Outerwear] # data[Category]列中的元素是否在cat…

selenium常见接口函数使用

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;测试_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 1. 查找 查找方式 css_s…

vue-router查漏补缺

一、动态路由匹配 1.带参数的动态路由匹配 import User from ./User.vue// 这些都会传递给 createRouter const routes [// 动态字段以冒号开始{ path: /users/:efg, component: User }, ]这种方式的路由会匹配到/users/abc或者/users/123,路径参数用冒号:表示&#xff0c;并…

深度和法线纹理

屏幕后期处理效果的基本原理就是当游戏画面渲染完毕后通过获取到该画面的信息进行额外的效果处理 之前的边缘检测、高斯模糊、Bloom、运动模糊等效果都是基于获取当前屏幕图像中的像素信息进行后期处理的 如果仅仅根据像素信息来进行一些效果处理&#xff0c;存在以下问题&…

Vue3小兔鲜电商项目

创建项目 npm install 装包 创建文件夹 git工具管理项目 基于create-vue创建出来的项目默认没有初始化git仓库&#xff0c;需要我们手动初始化 执行命令并完成首次提交&#xff1a; git init git add . git commit -m "init"

短视频矩阵系统SEO优化排名技术的源码搭建与实施:

在开发短视频SEO优化排名技术时&#xff0c;虽然初步观察可能让人认为仅通过get和set这两个代理&#xff08;trap&#xff09;就能实现&#xff0c;但实际操作中远不止如此。为了更全面地控制私有属性的访问权限&#xff0c;还需要实现has、ownKeys以及getOwnPropertyDescripto…