5.7、TCP 可靠传输的实现

news2024/10/7 14:22:43

1、TCP基于以字节为单位的滑动窗口来实现可靠传输

TCP 基于 以字节为单位的滑动窗口 \color{red}以字节为单位的滑动窗口 以字节为单位的滑动窗口来实现可靠传输

如下所示,假定数据传输只在一个方向进行

image-20230106220420171

这是发送方待发送字节的序号

image-20230106220517286

假设发送方收到了来自一个接收方的确认报文段

  • 在报文段首部中的窗口字段的值为 20 20 20,也就是接收方表明自己的接收窗口的尺寸为 20 20 20 字节

  • 确认号的值为 31 31 31 ,这表明接收方希望收到下一个数据的序号为 31 31 31,而序号 30 30 30 为止的数据已经全部正确接受了

image-20230106220829413

因此发送方根据这两个字段的值构造出自己的发送窗口

image-20230106220916817

为了简单起见:假定网络不存在拥塞问题

  • 也就是发送方在构造自己的发送窗口时,仅考虑接收方的接收窗口,而不考虑拥塞窗口

发送方在没有接收到接收方确认的情况下,可以把发送窗口内的数据一次全部发送出去

  • 凡是已经发送过的数据,在未收到确认之前,都必须暂时保留,以便在超时重传时使用

image-20230106221248491

发送窗口后沿的后面部分时已发送并收到确认的数据字节的序号

  • 这些数据字节显然不需要保存在发送缓存中了,可以删除

发送窗口前沿的前面部分时不允许发送的数据字节的序号

image-20230106221534442


2、发送窗口后沿 & 前沿移动情况

发送窗口后沿的移动情况有两种情况

  • 不动(没有收到新的确认)
  • 前移(收到了新的确认)

不可能向后移动,因为不能撤销已收到的确认


发送窗口前沿的移动情况有三种情况

  • 通常是不断向前移动

  • 不动

    ①没有收到新的确认。对方通知的窗口大小也不变

    ②收到新确认,但对方通知的窗口缩小,是发送窗口前沿正好不动

  • 向后收缩(对方通知的窗口缩小了)

    • TCP 标准强烈不赞成这样做,因为很可能发送方在收到这个通知之前,就已经发送了窗口中的许多数据,现在又要收缩窗口,不让发送这些数据,显然就会产生错误

3、滑动窗口基本过程

假定发送方将发送窗口内序号 31 31 31 ~ 41 41 41 的数据封装在几个不同的数据报文段发送出去

  • 此时发送窗口的为止并没有变

发送窗口内序号 31 31 31 ~ 41 41 41 的数据已经发送但未收到确认,而序号 42 42 42 ~ 50 50 50 的数据是允许发送但还未发送的

image-20230106235608044

编程实现:使用三个指针 P1P2P3 分别指向相应的字节序号

  • 小于 P1 的是已发送并已收到确认的部分;

  • 大于等于 P3 的是不允许发送的部分;

  • P3-P1 \texttt{P3-P1} P3-P1 = 发送窗口的尺寸;

  • P2-P1 \texttt{P2-P1} P2-P1 =已发送但尚未收到确认的字节数;

  • P3-   P2 \texttt{P3- P2} P3- P2 = 允许发送但当前尚未发送的字节数(又称为可用窗口或有效窗口);

image-20230106235829518


在接收窗口外面到 30 30 30 号为止的数据,是已经发送给过相应确认并已交付给应用进程的数据,

  • 因此,无需在保留这些数据,可将他们从接收缓存中删除了

接收窗口内 31 31 31 ~ 50 50 50 号数据是允许接收的数据

接收窗口外 51 51 51 号及其后续数据,目前不允许接收

image-20230107001537901


假设发送方之前发送的封装有 32 32 32 ~ 33 33 33 号数据的报文段到达了接收方

由于数据序号落在接收窗口内,所以接收方接收它们,并将它们存入接收缓存。

但是它们是未按序到达的数据,因为 31 31 31 号数据还没有到达

  • 这有可能是丢了,也有可能是滞留在网络中的某处

注意: 接收方只能对按序收到的数据中的最高序号给出确认 \color{red}接收方只能对按序收到的数据中的最高序号给出确认 接收方只能对按序收到的数据中的最高序号给出确认

  • 类似于选择重传协议 SR 与 回退 N 帧协议的结合版本: (可靠传输)

因此,接收方发出的确认报文段中的确认序号仍然是 31 31 31

也就是希望收到 31 31 31 号数据

该确认报文窗口字段的值仍然是 20 20 20 :表明接收方没有改变自己接收窗口的大小

image-20230107002018042


发送方收到该确认报文段后,发现这是一个针对 31 31 31 号数据的重复确认

  • 就知道接收方收到了未按序到达的数据

由于这是接收方收到的第一个重复确认,因此这并不会引起发送方针对该数据的快重传

另外,接收方通知窗口的尺寸仍是 20 20 20,因此发送方保持自己的发送窗口尺为 20 20 20


现在,假设封装有 31 31 31 号数据的报文段到达了接收方

接收方接收该报文段,将其封装的 31 31 31 号数据存入接收缓存

接收方现在可将 31 31 31 ~ 33 33 33 号数据交付给应用进程

image-20230107002620655

然后接收窗口向前移动 3 3 3 个序号,并给发送方发送确认报文段

该确认报文窗口字段的值仍然是 20 20 20 :表明接收方没有改变自己接收窗口的大小

确认号字段的值为 34 34 34 :表明接收方已经收到了序号 33 33 33 为止的全部数据

image-20230107002635836


现在假设又有几个数据报文段到达了接收方,它们封装有 37 37 37 48 48 48,以及 40 40 40 号数据

这些数据的序号虽然落在接收窗口内,但它们都是为按序到达的数据,只能先暂存在接收缓存中

tcpzancun.gif


假设接收方先前发送的确认报文段到达了发送方

发送方接收后,将发送窗口滑动 3 3 3 个序号,发送窗口的尺寸保存不变

这样就有序号 51 51 51 ~ 53 53 53 移动到窗口内,而序号 31 31 31 ~ 33 33 33 移出了发送窗口

tcphuadong2.gif

现在可以将 31 31 31 ~ 33 33 33 号数据从发送缓存中删除了,因为现在已经收到了接收方针对他们的确认


发送方继续将发送窗口内序号 42 42 42 ~ 53 53 53 的数据封装在几个不同的报文段中发送出去

image-20230107004116210

现在发送窗口内的序号已经用完了,发送方在未收到接收方发来确认的情况下,不能再发送新的数据

序号落在接收窗口内的已发送数据,若迟迟收不到接收方的确认,则会产生超时重传

image-20230107004643303


4、补充说明

虽然发送方的发送窗口是根据接收方的接收窗口设置的

  • 但在同一时刻, 发送方的发送窗口并不总是和接 ! 方的接收窗口一样大 \color{red}发送方的发送窗口并不总是和接!方的接收窗口一样大 发送方的发送窗口并不总是和接!方的接收窗口一样大

  • 网络传送窗口值需要经历一定的时间滞后,并且这个时间还是不确定的。

  • 发送方还可能根据网络当时的拥塞情况适当减小自己的发送窗口尺寸。

对于 不按序到达的数据应如何处理 \color{red}不按序到达的数据应如何处理 不按序到达的数据应如何处理TCP 并无明确规定。

  • 如果接收方把不按序到达的数据一律丢弃,那么接收窗口的管理将会比较简单,但这样做对网络资源的利用不利,因为发送方会重复传送较多的数据。

  • TCP 通常对不按序到达的数据是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再 按序交付上层的应用进程 \color{red}按序交付上层的应用进程 按序交付上层的应用进程

TCP 要求接收方必须有 累积确认和捎带确认机制 \color{red}累积确认和捎带确认机制 累积确认和捎带确认机制,这样可以减小传输开销。接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带上。

  • 接收方不应过分推迟发送确认 \color{red}接收方不应过分推迟发送确认 接收方不应过分推迟发送确认,否则会导致发送方不必要的超时重传,这反而浪费了网络的资源。

  • TCP 标准规定,确认推迟的时间不应超过 0.5 0.5 0.5 秒。若收到一连串具有最大长度的报文段,则必须每隔一个报文段就发送一个确认 [RFC   1122] \texttt{[RFC 1122]} [RFC 1122]

  • 捎带确认实际上并不经常发生,因为大多数应用程序很少同时在两个方向上发送数据。

TCP 的通信是全双工通信 \color{red}\texttt{TCP} 的通信是全双工通信 TCP的通信是全双工通信。通信中的每一方都在发送和接收报文段。因此,每一方都有自己的发送窗口和接收窗口。在谈到这些窗口时,一定要弄清楚是哪一方的窗口。

5、习题

image-20230107010518892

image-20230107010835723

由于第一个段的序号为 200 200 200,所以我希望收到下一个序号是 200 200 200,说明前面 199 199 199 已经成功接受了

同理:最后发给主机甲的确认序号是 1000 1000 1000,而不是 1001 1001 1001

答案 D


image-20230107010954235

由于 TCP 规定只能对按序到达的最高序号进行确认 \color{red}\texttt{TCP} 规定只能对按序到达的最高序号进行确认 TCP规定只能对按序到达的最高序号进行确认

  • 类似于选择重传协议 SR 与 回退 N 帧协议的结合版本 (可靠传输)

image-20230107011458357

答案 B

6、小结

image-20230107011529516

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

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

相关文章

RHCE第六天之DNS域名解析服务器详解

文章目录一、 域名解析服务器介绍二、DNS域名解析的过程三、搭建DNS服务器的详细配置四、实验练习一、 域名解析服务器介绍 DNS(Domain Name System) 是互联网上的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够…

Node转换Excel成JSON

目前想使用Cocos Creator做一个文字游戏,类似于我的人生重开模拟器。 那么其中最重要的一点就是关于数据的存储了。在我的人生重开模拟器中大部分事件和天赋的数据是存储在excel表格当中的,当然如果要使用Cocos Creator,因为我不准备布置服务…

JDBC核心技术_第8章:数据库连接池

目录8.1 JDBC数据库连接池的必要性8.2 数据库连接池技术8.3 多种开源的数据库连接池8.3.1 C3P0数据库连接池8.3.2 DBCP数据库连接池8.3.3 Druid(德鲁伊)数据库连接池8.1 JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模…

【蓝桥杯系列】2020省赛真题之回文日期

⭐️前面的话⭐️ 本篇文章介绍来蓝桥杯真题之回文日期的题解,展示语言java。 📒博客主页:未见花闻的博客主页 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📌本文由未见花闻原创&#xff0c…

ArcGIS基础实验操作100例--实验81创建点群最小边界几何

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验81 创建点群最小边界几何 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

MySQL是怎么保证高可用的?

在上一篇文章中,我和你介绍了 binlog 的基本内容,在一个主备关系中,每个备库接收主库的 binlog 并执行。 正常情况下,只要主库执行更新生成的所有 binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。 但是,MySQL 要提供高可用能力…

Python中zipfile压缩包模块的使用

本文主要介绍了Python中zipfile压缩包模块的使用,zipfile 模块提供了创建、读取、写入、添加及列出 ZIP 文件的工具,本文做一个简单的总结。 简介 ZIP 文件格式是一个常用的归档与压缩标准,zipfile 模块提供了创建、读取、写入、添加及列出 …

如何通过QA质量管理提高软件质量?

1、构建了质量检查系统 为了保证软件开发质量,一般来说QA检查单按照检查阶段划分为:需求分析、系统设计、系统实现、系统测试、交付验收、系统运维。 QA质量管理:CoCode项目管理 QA质量管理——QA检查单​ 为了进一步提高检查效果&…

【笔记:第4课】学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春

文章目录前言来源正文小结前言 创作开始时间:2023年1月10日22:41:26 如题,学习一下RISC-V。 来源 https://www.bilibili.com/video/BV1Q5411w7z5?p4&vd_source73a25632b4f745be6bbcfe3c82bb7ec0 正文 操作系统:POSIX 标准。 LLVM有…

ArcGIS基础实验操作100例--实验80随机采样统计

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验80 随机采样统计 目录 一、实验背景 二、实验数据 三、实验步骤 (1&…

2022年度总结——一切都在慢慢变好

人生天地之间,若白驹过隙,忽然而已,每个人都希望留下自己的足迹。——题记日月两盏灯,春秋一场梦。回想一年前的现在我在干什么呢?去年的寒假我刚步入大学一个学期,迷茫彷徨,怅然若失&#xff0…

Promise处理异步的并行和串行

一、异步的“并行” 同时处理,相互之间没啥依赖 // 执行FN1返回一个promise实例,实例中管理了一个异步编程的代码,当定时器到时间后,才会把实例的状态改为成功 const fn1 () > {return new Promise(resolve > {setTimeou…

nginx使用!

一:概述 Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 Nginx 网站用户有:百度、京…

NTN(二) Timing Advance

微信同步更新欢迎关注同名modem协议笔记 地面移动系统的传播延迟通常小于 1 毫秒。 相比之下,NTN 中的传播延迟要长得多,延迟从几毫秒到数百毫秒不等,具体取决于星载或机载平台的高度以及 NTN 中的payload类型。 因此对NTN系统,处…

Java 脚本引擎的使用

1. 前言 Java 6 版本就已经引入了 Rhino 引擎用以支持脚本代码运行,而从 Java 8 开始 Nashorn 取代 Rhino 成为 Java 内嵌的 JavaScript 引擎。Nashorn 引擎允许开发人员将 JavaScript 代码嵌入到 Java 中执行,这个特性在复杂的配置系统中有比较大的应用…

javascript reduce()方法

相信挺多人对这个方法还是那么的陌生,其实也能理解,毕竟它能做到的事情还有其他的方法能做到。下面就说一下我个人的理解吧!!!reduce()方法:用法:array.reduce(function(total,currentData,curr…

管理bug的工具

一、国内的bug管理软件: 1、禅道 禅道是第一款国产开源项目管理软件。它的核心管理思想基于敏捷方法scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能。在一个软件中就…

nodejs+vue+element+eachers构建开源项目大型连续剧(5)前端请求封装,完成用户注册。

在前端项目开发中,一个好的请求封装可以给我们带来诸多便利,减少了代码重复,优化了问题处理等。那接下来我们一起学习一下怎么做到对一个请求的简单封装吧。主要通过对axios请求的二次封装,实现页面的请求以及必要的优化。 一、引…

Word处理控件Aspose.Words功能演示:在 C# 中将 Word DOC DOCX 转换为 Markdown

Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外, Aspose API支持流行文件格式处…

每个Java程序员都必须知道的四种负载均衡算法

前言 一般来说,我们在设计系统的时候,为了系统的高扩展性,会尽可能的创建无状态的系统,这样我们就可以采用集群的方式部署,最终很方便的根据需要动态增减服务器数量。但是,要使系统具有更好的可扩展性&…