运输层(计算机网络谢希仁第八版)——学习笔记五

  • 课件:课程包列表 (51zhy.cn)

  • 目录

    运输层协议概述

    用户报协议UDP

    传输控制协议TCP概述

    可靠传输的工作原理

    TCP可靠传输的实现

    TCP的流量控制

    TCP的拥塞控制

    TCP的运输连接管理


    运输层协议概述

    • 进程之间的通信

      • 运输层的位置——只有位于网络边缘部分的主机的协议栈才有运输层,而在网络核心部分中的路由器在转发分组时都只用到下三层的功能。

      • 运输层的作用:之前的协议包括从网络层往下,的工作都是负责完成两台主机之间的通信。但是在计算机实际运行过程中,主机可能会同时运行多个应用程序(比如,你会在打开浏览器的同时,也打开了微信),这就会产生了多个不同的进程。我们说的“主机A与主机B进行通信”实际上是指“运行在主机A上的某个程序和运行在主机B上的另一个程序进行通信”。而运输层负责完成的就是两台主机中应用进程的相互通信。

      • 在举个例子。在过去用写信的年代,一村人写信以后,会统一交给邮递员送信;然后经过一系列匀速,送到另一个村的邮递员里。然后由这个邮递员再把这些信分别送到村里不同人的手里。信在运送的过程,就是网络层及以下协议层在做的事,而邮递员收集信件以及分发信件的工作,就是运输层在做的工作

      • 基于端口的复用和分用功能

        • 通过看图可以知道,复用就是把多个进程的信息合并成一个报文段;分用就是在接收端把一个报文段按照进程分开,送往相对应的进程

    • 运输层的两个主要协议(这里只略微的讲一下基本概念,具体内容在后面讨论)

      • 基本概念:

        • 两个对等的运输实体在通信时传送的数据单位叫做:运输协议数据单元

        • TCP传送的数据单位——TCP报文段

        • UDP传送的数据单位——UDP报文或用户数据报

    • 运输层的端口

      • 问题的提出与解决:由于进程的创建和撤销是动态的,发送发几乎无法识别其他机器上的进程。 解决方案:在发送信息时,我们给每个进程分配一个端口号,用端口号来标识这个进程。需要注意的是,端口号只有本地意义,只是为了表示本计算机应用层中的各进程。在互联网中,不同计算机的相同端口号是没有联系的。

      • 由此可知,两个计算机的进程要相互通信,不仅需要知道对方的IP地址(为了找到对方的计算机),而且还要知道对方的端口号(为了找到对方计算机中的应用进程)

      • 两大类端口

        • 服务器端使用的端口号端口

        • 客户端使用的端口

  • 用户报协议UDP

    • UDP概述

      • UDP只在IP的数据服务工程之上增加了很少的功能:复用和分用功能;差错检测功能

      • UDP的主要特点

          • 发送发UDP对应用程序叫下来的报文,在添加首部后就向下交付IP层。UDP对交下来的报文,既不合并也不拆分,而是保留这些报文的边界。

          • 接收方UDP对IP层交上来的UDP用户数据,在去除首部后就原封不动地交付上层的应用进程,一次交付一个完成的报文。

    • UDP的首部格式

      • 关于检验和的计算

  • 传输控制协议TCP概述

    • TCP最主要的特点

      • TCP面向流的概念:TCP不关心应用程序一次把多长的报文发送到TCP换成,TCP会吧连续的字节流进行分段,形成TCP报文段然后进行发送。

      • 简单来说就是,TCP会把太长的数据块划分短一些再传送,也可等待积累足够多的字节后再构成报文段发送出去

    • TCP的连接

      • 每一条TCP连接都有两个端点。这个端点叫做“套接字(socket)”。

      • 套接字可以这么理解,假设有信要邮寄的你代表应用层,在你门外等待的邮递员就是运输层或者说是TCP连接,那你们这件的这道门,就是套接字。通过套接字,进程把信息送出去给TCP形成报文

  • 可靠传输的工作原理

    • 首先,我们需要知道IP网络并不提供可靠的传输。所谓不可靠的传输,就是指当数据到达接受方是,如果接收方发现数据出错,它就只是丢弃数据,然后什么都不做。而可靠的传输,会要求发送方重传,知道得到无差错的数据。

    • 停止-等待协议

        • 1.停止-等待的基本示意图

        • 2.出现差错的分析(对于出现差错的分析,可以让我们的停等协议更佳完善):

          • 问题一:出现差错

            • 问题:在接收方 B 会出现两种情况: 1.B 接收 M1 时检测出了差错,就丢弃 M1,其他 什么也不做(不通知 A 收到有差错的分组)。 2.M1 在传输过程中丢失了,这时 B 当然什么都不知道,也什么都不做。 在这两种情况下,B 都不会发送任何信息。 但A都必须重发分组,直到B正确接收为止,这样才能实现可靠通信。

            • 解决方法:超时重传 A 为每一个已发送的分组都设置了一个超时计时器。 A 只要在超时计时器到期之前收到了相应的确认,就撤销该超时计时器,继续发送下一个分组 M2 。 若A在超时计时器规定时间内没有收到B的确认,就认为分组错误或丢失,就重发该分组。

            • 还有一点要注意的是,TCP连接的往返时间RTT不是固定不变的,需要使用特点的算法估算较为合理的重传时间。

          • 问题二:确认丢失(1)

            • 若分组正确到达B,但B回送的确认丢失或延迟了,A未收到B的确认,会超时重发。B 可能会收到重复的 M1 。B如何知道收到了重复的分组,需要丢弃呢?

            • 解决方法:编号 A为每一个发送的分组都进行编号。若B收到了编号相同的分组,则认为收到了重复分组,丢弃重复的分组,并回送确认。 B为发送的确认也进行编号,指示该确认是对哪一个分组的确认。 A根据确认及其编号,可以确定它是对哪一个分组的确认,避免重发发送。若为重复的确认,则将其丢弃。

          • 问题三:确认丢失(2)

            • 问题:若 B 所发送的对 M1 的确认丢失了,那么 A 在设定的超时重传时间内不能收到确认,但 A 并无法知道:是自己发送的分组出错、丢失了,或者 是 B 发送的确认丢失了。因此 A 在超时计时器到期后就要重传 M1。

            • 假定 B 又收到了重传的分组 M1。这时 B 应采取两个行动: 第一,丢弃这个重复的分组 M1,不向上层交付。 第二,向 A 发送确认。不能认为已经发送过确认就不再发送,因为 A 之所以重传 M1 就表示 A 没有收到对 M1 的确认。

          • 问题四:确认迟到

            • 传输过程中没有出现差错,但 B 对分组 M1 的确认迟到了。 A 会收到重复的确认。对重复的确认的处理很简单:收下后就丢弃。 B 仍然会收到重复的 M1,并且同样要丢弃重复的 M1,并重传确认分组。

          • 注意:

            • 在发送完一个分组后,必须暂时保留已发送的分组的副本,以备重发。

            • 分组和确认分组都必须进行编号。

            • 超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。

        • 信道利用率低:

          • 计算公式:

          • 当往返时间RTT远大于分组发送时间TD时,信道的利用率就会非常低。若出现重传,这对传送有用的数据信息来说,信道的利用率还要降低。

          • 解决思路——流水线传输(具体的内容在连续ARQ会讨论) 发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。这样可使信道上一直有数据不间断地传送。由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率。

    • 连续ARQ协议

      • 工作原理:发送方一次可以发出多个分组。每次可以发送分组的数量有滑动窗口协议来进行控制。接收方采用累积确认的方式来发送确认信息。发送方每收到一个确认,就把发送窗口向前滑动。如果出现差错,就采用回退N的方式进行重传

        • 滑动窗口协议

          • TCP连接的每一端都设有窗口——一个发送窗口和一个接受窗口。位于发送窗口内的分组都可连续发送出去,而不需要等待对方的确认。 发送发没收到一个确认,就把发送窗口向前滑动一个分组的位置。 发送窗口W的取值:1<W<2^(n-1);n为分配的给分组编号的比特数。

        • 累积确认

          • 接收方不必对收到的分组逐个发送确认信息,而是对按序到达的最后一个分组发送确认,这样就表示到这个分组为止,所有分组都已正确收到了。这就是累积确认

          • 确认丢失的情况下,就会触发超时重传,然后再得到一个确认。

        • 回退N

          • 如果发送发发送了前五个分组,而中间的第三个分组丢失了。这是接收方只能对前两个分组发出确认。发送发无法知道后面三个分组的下落,只好把后面的三个分组都在重传一个。这就叫“回退N”(Go-banck-N),标识需要再退回来重传已发送过的N个分组。

      • 工作流程

  • TCP报文段的首部格式(大概看一眼,用到了再回来查效率更高,记得更牢)

  • TCP可靠传输的实现

    • 以字节为单位的滑动窗口

      • 工作过程

        • 通过下面几张图,我们可以明白滑动窗口的工作过程

        • 通过P1,P2,P3三个指针,我们可以确定窗口的位置。

      • 缓存

        • 发送缓存用来暂时存放: 发送应用程序传送给发送方 TCP 准备发送的数据;TCP 已发送出但尚未收到确认的数据。 注意:已经发送但还没被确认的字节,仍然存放在缓存中;一旦被确认同时活动窗口离开该序号,字节就被缓存清除

        • 接收缓存用来暂时存放: 按序到达的、但尚未被接收应用程序读取的数据;不按序到达的数据。

    • 超时重传时间的选择

      • 问题的由来:由于IP数据报所选择的路由变化很大,所以运输层的往返时间RTT的方差也很大。这就导致超时重传时间确定的困难——太短,容易引起不必要的重传;太长,网络空闲时间增大,降低了传输效率。

      • 自适应算法

        • 需要考虑的问题:TCP 报文段 1 没有收到确认。重传(即报文段 2)后,收到了确认报文段 ACK。如何判定此确认报文段是对原来的报文段 1 的确认,还是对重传的报文段 2 的确认?

    • 选择确认SACK

      • 问题的提出:若收到的报文段无差错,只是为按需到达,例如:1,2,4都收到了,但是没有收到3。能否设法只传送缺少的数据而不选择重传已经正确到达接受方的数据?——解决方案:使用SACK(选择确认)

  • TCP的流量控制

    • 利用滑动窗口实现流量控制

      • 流量控制:让发送发的发送速率不要太快,既要让接收方来得及接收,也不要让网络发生拥塞

      • 流量控制通过接收方给rwnd报文段来限制发送发的发送窗口

      • 死锁

        • 如果B想给发送零窗口的报文段后,A就不能再发送数据了。过了一会,B缓存有空间了,就给A发送rwnd=400的报文段,但是报文段在传送过程中丢失了。那么就会出现这么一种情况: A在等待B发送的非零窗口的通知,B在等待A发送的数据。 这就是死锁的局面。

        • 解决方案:持续计时器 只要TCP连接的一方收到对方的零窗口通知,就启动该持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段,而对方就在确认这个报文段时给出现在的窗口值。 若窗口仍是零,收到报文段的一份就重置计时器; 若窗口不是零,则死锁的局面打破。

  • TCP的拥塞控制

    • 基本概念

      • 拥塞:在某段时间,若对网络中某资源的需求超过该资源所能提供的可用部分,网络的性能就要变坏,这种现象称为拥塞

      • 拥塞控制与流量控制的区别

      • 开环控制与闭环控制

    • TCP拥塞控制方法

      • 基本原理:

      • 原则:只要网络没有出现拥塞,拥塞窗口1就可以再增大一些,以便把更多分组发送出去;但只要网络出现拥塞或可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入网络中的分组数,以便环节网络出现的拥塞

      • 判断准则: 1.重传定时器超时; 2.收到三个重复的ACK(预示网络可能出现拥塞)

      • 拥塞控制算法

        • 慢开始

          • 使用慢开始算法后,每经过一个传输轮次,拥塞窗口cwnd就加倍(“慢”只是指初始的窗口比较小)

          • 慢开始门限 ssthresh 的用法如下: 当 cwnd < ssthresh 时,使用慢开始算法。 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法

        • 拥塞避免算法

          • 每经过一个传输轮子,拥塞窗口就+1。目的是让拥塞窗口缓慢的增大,避免出现拥塞

        • 无论慢开始还是拥塞避免阶段,只要发送发判断网络出现拥塞(重传定时器超时),就把慢开始门限减小为当前窗口的一般,然后缩小窗口为1,最后执行慢开始算法。 这样做的目的是迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的事件把队列中积压的分组处理完毕。

        • 快重传

          • 发送方只要一连收到三个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。

        • 快恢复算法

          • 当发送端收到连续三个重复的确认时,由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是执行快恢复算法 FR (Fast Recovery) 算法: 慢开始门限 ssthresh = 当前拥塞窗口 cwnd / 2 ; 新拥塞窗口 cwnd = 慢开始门限 ssthresh ; 开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。

    • 主动队列管理AQM

      • (简要了解即可)

      • 问题的由来:若路由器对某些分组的处理时间特别长,当队列已满时,以后再到达的所有分组(如果能够继续排队,这些分组都将排在队列的尾部)将都被丢弃。路由器的尾部丢弃往往会导致一连串分组的丢失,这就使发送方出现超时重传,使 TCP 进入拥塞控制的慢开始状态,结果使 TCP 连接的发送方突然把数据的发送速率降低到很小的数值。 更为严重的是,在网络中通常有很多的 TCP 连接,这些连接中的报文段通常是复用在网络层的 IP 数据报中传送的。 在这种情况下,若发生了路由器中的尾部丢弃,就可能会同时影响到很多条 TCP 连接,结果使这许多 TCP 连接在同一时间突然都进入到慢开始状态。这在 TCP 的术语中称为全局同步

        • 解决思路:1998 年提出了主动队列管理 AQM 所谓“主动”就是不要等到路由器的队列长度已经达到最大值时才不得不丢弃后面到达的分组,而是在队列长度达到某个值得警惕的数值时(即当网络拥塞有了某些拥塞征兆时),就主动丢弃到达的分组。 AQM 可以有不同实现方法,其中曾流行多年的就是随机早期检测 RED

      • 随机早期检测RED

  • TCP的运输连接管理

    • TCP连接的建立

      • TCP连接建立过程中要解决的三个问题: 1.要使每一方能够确知对方的存在。 2.要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)。 3.能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。

      • 运输连接的三个过程

        • 连接建立

          • TCP建立连接的过程叫做握手,由于握手需要再客户和服务器之间交换三个TCP报文段,所以称为三报文握手。下面演示连接建立过程

        • 数据传送

        • 连接释放

          • TCP连接释放的过程是四报文握手

          • 在确认报文段中ACK = 1,确认号 ack = w + 1,自己的序号 seq = u + 1

    • TCP的有限状态机

      • 这张图总结了TCP从连接建立到连接释放不同状态的转变合指令,通过阅读上面这样图,再加深一下对TCP连接建立与释放的理解。

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

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

相关文章

Vue3实战笔记(13)—pinia安装笔记

文章目录 前言安装和配置pinia总结 前言 Pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态。 Pinia是一个轻量级的状态管理库&#xff0c;它专注于提供一个简单的API来管理应用程序的状态。相比之下&#xff0c;Vuex是一个更完整的状态管理库&#xf…

【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手

文章目录 一、前言二、绘制效果三、ConstraintLayout 使用方法3.1 创建布局文件3.2 替换配置3.3 设置约束&#xff0c;步骤13.4 设置约束&#xff0c;步骤23.5 其他设置 四、结束 一、前言 在进行Android APP开发过程中&#xff0c;减少layout嵌套即可改善UI的绘制性能&#x…

在阿里云服务器上安装MySQL

目录 一、先卸载不需要的环境 1.关闭MySQL服务 2.查看安装包以及卸载安装包 3.依次卸载所有包 4. 获取mysql官⽅yum源 二、安装&#xff08;密钥过期解决方法&#xff09; 三、启动并进入 关于MySQL MySQL是一个广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&…

嵌入式学习-通用定时器

简介 框图介绍 时钟选择 计数器部分 输入捕获和输出比较框图 嵌入式学习全文参考&#xff08;小向是个der&#xff09;做笔记&#xff1a;https://blog.csdn.net/qq_41954556/article/details/129735708

单区域OSPF实验

实验目的&#xff1a; 理解OSPF的基本概念。掌握单曲于OSPF的配置掌握OSPF邻居状态的解读掌握通过Cost控制OSPF选路的方法掌握OSPF认证的配置方法 一、基础配置&#xff1a; 搭建实验拓扑图&#xff1b; 配置路由器接口的IP地址以及配置环回地址待后续使用 &#xff08;1&a…

Patch-Wise Graph Contrastive Learning for Image Translation

Patch-Wise Graph Contrastive Learning for Image Translation 图像翻译中的逐块图对比学习 Chanyong Jung1, Gihyun Kwon1, Jong Chul Ye1, 2 Chanyong Jung&#xff0c;Gihyun Kwon&#xff0c;Jong Chul Ye 1, 2 Abstract 摘要 Patch-Wise Graph Cont…

[MRCTF2020]PixelShooter

是个安卓游戏题 re手肯定不会去玩游戏&#xff0c;先jadx分析一波 没有什么关键信息&#xff0c;但找到了一个unity类&#xff0c;想到apk也可以解压缩得到 .so 或者 Assembly-CSharp.dll 故又在dnspy分析一下 看了半天没有和flag有关信息&#xff0c;看wp&#xff1a; Asse…

(docker)进入容器后如何使用本机gpu

首次创建容器&#xff0c;不能直接使用本机gpu 在系统终端进行如下配置&#xff1a; 1.安装NVIDIA Container Toolkit 进入Nvidia官网Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.15.0 documentation&#xff0c;安装NVIDIA Container Toolkit …

在idea中使用vue

一、安装node.js 1、在node.js官网&#xff08;下载 | Node.js 中文网&#xff09;上下载适合自己电脑版本的node.js压缩包 2、下载完成后进行解压并安装&#xff0c;一定要记住自己的安装路径 一直点击next即可&#xff0c;这部选第一个 3、安装成功后&#xff0c;按住winR输入…

kafka学习笔记04(小滴课堂)

Kafka的producer生产者发送到Broker分区策略讲解 Kafka核心API模块-producer API讲解实战 代码&#xff1a; ProducerRecord介绍和key的作用 Kafka核心API模块-producerAPI回调函数实战 producer生产者发送指定分区实战 我们设置5个分区。 我们指定分区。 重新指定一个分区&am…

前端动画requestAnimationFrame

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画&#xff0c;并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数&#xff0c;该回调函数会在浏览器下一次重绘之前执行。 备注&#xff1a; 若你想在浏览器下次重绘…

华为涅槃,余承东重生

最近一段时间&#xff0c;余承东甚为低调。最为明显的是&#xff0c;“遥遥领先”已经听不到了&#xff0c;“余大嘴”口中的措辞越来越克制。 今后手机相关的发布会&#xff0c;或许不再看到余承东的身影。 5月10日&#xff0c;余承东的职位正式更新&#xff0c;从终端BG CE…

ICode国际青少年编程竞赛- Python-4级训练场-复杂嵌套for循环

ICode国际青少年编程竞赛- Python-4级训练场-复杂嵌套for循环 1、 for i in range(4):Dev.step(i6)for j in range(3):Dev.turnLeft()Dev.step(2)2、 for i in range(4):Dev.step(i3)for j in range(4):Dev.step(2)Dev.turnRight()Dev.step(-i-3)Dev.turnRight()3、 for i …

LangChain 核心模块学习 模型输入 Prompts

模型输入 Prompts 一个语言模型的提示是用户提供的一组指令或输入&#xff0c;用于引导模型的响应&#xff0c;帮助它理解上下文并生成相关和连贯的基于语言的输出&#xff0c;例如回答问题、完成句子或进行对话。 提示模板&#xff08;Prompt Templates&#xff09;&#xf…

高清SDI串行数字接口采集卡与传输编码器

随着科技的快速发展&#xff0c;我们正处于一个数字化、信息化的时代&#xff0c;各式各样的设备正成为人们工作和生活中必不可少的伙伴。今天&#xff0c;我要向大家介绍的是一款具有革命性意义的视频采集卡——LCC262。这款由灵卡技术团队精心打造的产品&#xff0c;集合了多…

OrangePi Zero2 全志H616开发学习文档、基础IO蜂鸣器、超声波测距、舵机PWM基础开发

一.平台介绍 OrangePi开发板不仅仅是一款消费品&#xff0c;同时也是给任何想用技术来进行创作创新的人设计的。它是一款简单、有趣、实用的工具&#xff0c;你可以用它去打造你身边的世界。 特性 CPU 全志H616四核64位1.5GHz高性能Cortex-A53处理器GPU MaliG31MP2 Supports…

解决Vue devtools插件数据变化不会自动刷新

我们使用devtools插件在监测vuex中表单或自定义组件的数据&#xff0c;发现页面数据发生变化后&#xff0c;但是devtools中还是老数据&#xff0c;必须手动点击devtools刷新才能拿到最新的数据。很烦&#xff01; 解决方案&#xff1a; 打开chrome的设置&#xff0c;向下翻&…

设计模式 六大原则之里氏替换原则

文章目录 概念替换逻辑行为不变 拆解小结 概念 子类对象能够替换程序中父类对象出现的任何地方&#xff0c;并且保证原来程序的逻辑行为不变及正确性不被破坏。 替换 替换的前提是面向对象语言所支持的多态特性&#xff0c;同一个行为具有多个不同表现形式或形态的能力。 逻…

物联网应用开发--STM32与新大陆云平台通信(云平台控制开发板上蜂鸣器、LED)

实现目标 1、掌握云平台执行器的创建 2、熟悉STM32 与ESP8266模块之间的通信 3、具体实现目标&#xff1a;&#xff08;1&#xff09;创建5个执行器&#xff1a;蜂鸣器&#xff0c;LED1&#xff0c;LED2&#xff0c;ED3&#xff0c;LED4;&#xff08;2&#xff09;执行器能对…

SpringCloud2024最新版链路追踪教程micrometer+zipkin

本文基于B站尚硅谷2024版springcloud教学视频&#xff0c;主要用于自己学习记录以及分享技术&#xff0c;侵权私删 自己本机环境信息&#xff1a; jdk&#xff1a;17.0.10springboot&#xff1a;3.2.0springcloud&#xff1a;2023.0.0 micrometer 之前行业内使用的分布式链路…