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

传输层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干了个什么?

抽象

相关文章:

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

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

基于Python实现web网页内容爬取

文章目录 1. 网页分析2. 获取网页信息2.1 使用默认的urllib.request库2.2 使用requests库1.3 urllib.request 和 requests库区别 2. 更改用户代理3. BeautifulSoup库筛选数据3.1 soup.find()和soup.find_all() 函数 4. 抓取分页链接参考资料 在日常学习和工作中,我们…...

Centos7和9安装mysql5.7和mysql8.0详细教程(超详细)

目录 一、简介 1.1 什么是数据库 1.2 什么是数据库管理系统(DBMS) 1.3 数据库的作用 二、安装MySQL 1.1 国内yum源安装MySQL5.7(centos7) (1)安装4个软件包 (2)找到4个软件包…...

星闪WS63E开发板的OpenHarmony环境构建

目录 引言 关于SDK 安装步骤 1. 更新并安装基本依赖 2. 设置 Python 3.8 为默认版本 3. 安装 Python 依赖 4. 安装有冲突的包 5. 设置工作目录 6. 设置环境变量 7. 下载预构建文件以及安装编译工具 8. 编译工程 nearlink_dk_3863 设置编译产品 编译 制品存放路径…...

MongoDB数据建模小案例

MongoDB数据建模小案例 朋友圈评论内容管理 需求 社交类的APP需求,一般都会引入“朋友圈”功能,这个产品特性有一个非常重要的功能就是评论体系。 先整理下需求: 这个APP希望点赞和评论信息都要包含头像信息: 点赞列表,点赞用户的昵称,头像;评论列表,评论用户的昵称…...

MySQL(库的操作)

目录 1. 创建数据库 2. 删除数据库 3. 查看数据库 4. 修改数据库 5. 备份和恢复 6. 查看连接情况 1. 创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] 1. 大写的是关键字 2. [ ]可带可不带 3. db_name 数据…...

【55 Pandas+Pyecharts | 实习僧网Python岗位招聘数据分析可视化】

文章目录 🏳️‍🌈 1. 导入模块🏳️‍🌈 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 去除重复数据2.4 调整部分城市名称 🏳️‍🌈 3. Pyecharts数据可视化3.1 招聘数量前20岗位3.2 各城市招聘数量3…...

java中23种设计模式的优缺点

文兴一言 设计模式分为创建型模式、结构型模式和行为型模式。以下是每种设计模式及其优缺点的详细介绍: 一、创建型模式 简单工厂模式 优点:通过一个共同的工厂类来创建对象,将对象的创建逻辑封装在一个地方,客户端只需要与工厂…...

【JavaEE】多线程(7)

一、JUC的常见类 JUC→java.util.concurrent,放了和多线程相关的组件 1.1 Callable 接口 看以下从计算从1加到1000的代码: public class Demo {public static int sum;public static void main(String[] args) throws InterruptedException {Thread …...

如何高效的向AI大模型提问? - 提示工程Prompt Engineering

大模型的输入,决定了大模型的输出,所以一个符合要求的提问Prompt起到关键作用。 以下是关于提示工程Prompt Engineering主要方法的详细表格,包括每种方法的优点、缺点、应用场景以及具体示例: 主要方法优点缺点应用场景示例明确性…...

4K高清壁纸网站推荐

1. Awesome Wallpapers 官网: https://4kwallpapers.com/ 主题: 创意、摄影、人物、动漫、绘画、视觉 分辨率: 4K Awesome Wallpapers 提供了丰富的高质量图片,分为通用、动漫、人物三大类,可以按屏幕比例和分辨率检索,满足你对壁纸的各种…...

EasyExcel注解使用

上接《Springboot下导入导出excel》,本篇详细介绍 EasyExcel 注解使用。 1. ExcelProperty value:指定写入的列头,如果不指定则使用成员变量的名字作为列头;如果要设置复杂的头,可以为value指定多个值order&#xff…...

Visual Basic 6 关于应用的类库 - 开源研究系列文章

上次整理VB6的原来写的代码,然后遇到了关于应用窗体的显示问题。VB6不比C#,能够直接反射调用里面的方法,判断是否显示关于窗体然后显示。以前写过一个VB6插件的例子,不过那个源码不在,所以就找了度娘,能够象…...

C#泛型

泛型是一种非常强大的特性,它允许程序员编写灵活的代码,同时保持类型安全。泛型的核心思想是允许类或方法在定义时不指定具体的数据类型,而是在实际使用时指定。这意味着你可以创建一个可以与任何数据类型一起工作的类或方法 泛型类通过在类…...

go语言的成神之路-标准库篇-fmt标准库

目录 一、三种类型的输出 print: println: printf: 总结: 代码展示: 二、格式化占位符 %s:用于格式化字符串。 %d:用于格式化整数。 %f:用于格式化浮点数。 %v&#xff1…...

React Native的router解析

写在前面 React Native(简称RN)是一个由Facebook开发的开源框架,用于构建跨平台的移动应用程序。在RN中,路由(router)是非常重要的概念,它允许我们在不同的屏幕之间进行导航和切换。 以下是RN…...

Linux update-alternatives 命令详解

1、查看所有候选项 sudo update-alternatives --list (java筛选​​​​​​​sudo update-alternatives --list java) 2、​​​​​​​更换候选项 sudo update-alternatives --config java 3、自动选择优先级最高的作为默认项 sudo update-alterna…...

【踩坑】修复报错libcurl.so.4、LIBFFI_BASE_7.0、libssl.so.3

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ libcurl.so.4: sudo apt install curl -y LIBFFI_BASE_7.0: conda install libffi3.3 -y libssl.so.3: sudo apt install -y openssl li…...

python网络爬虫基础:html基础概念与遍历文档树

开始之前导入html段落&#xff0c;同时下载好本节将用到的库。下载方式为&#xff1a;pip install beautifulsoup4 一点碎碎念&#xff1a;为什么install后面的不是bs4也不是BeautifulSoup&#xff1f; html_doc """ <html><head><title>The…...

【已解决】MacOS上VMware Fusion虚拟机打不开的解决方法

在使用VMware Fusion时&#xff0c;不少用户可能会遇到虚拟机无法打开的问题。本文将为大家提供一个简单有效的解决方法&#xff0c;只需删除一个文件&#xff0c;即可轻松解决这一问题。 一、问题现象 在MacOS系统上&#xff0c;使用VMware Fusion运行虚拟机时&#xff0c;有…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...