【计算机网络黑皮书】传输层

news2024/11/23 2:10:14

【事先声明】
这是对于中科大的计算机网络的网课的学习笔记,感谢郑烇老师的无偿分享 书籍是《计算机网络(自顶向下方法 第6版)》
需要的可以私信我,无偿分享,课程简介下也有
课程链接

目录

  • 传输服务与协议
    • 网络层与传输层
  • 多路复用与解复用
    • TCP
    • UDP
  • 无连接传输UDP
    • 用户数据报
  • 可靠数据传输(rdt)原理
    • 问题逻辑
    • 当底层信道是完全可靠的
      • 接收方与发送方
    • 具有比特错位的底层信道
      • FSM描述
      • 自动重传协议(ARQ)
      • 缺陷
      • 版本2
        • 对于发送方而言
        • 对于接收方而言
    • 具有比特错位与分组丢失的底层信道
  • 流水线
    • 通用:滑动窗口协议
      • 发送缓冲区
      • 发送缓冲区的大小
      • 发送窗口
      • 接收缓冲区
      • 接收窗口
        • 接收窗口尺寸等于1(GBN回退N步)
          • 发送方
          • 接收方
        • 接收窗口尺寸大于1(选择重发SR)
          • 发送方
          • 接收方
          • 滑动
          • 发送确认
        • 对比
  • 面向连接的传输TCP
    • 三次握手
    • MSS(最大报文段长度)
    • TCP报文段格式
      • 序号(32比特)
      • 确认号(32比特)
      • 接收窗口
    • TCP的往返延时(RTT)和超时
      • 如何估计RTT
        • 指数移动加权平均
        • RTT的波动影响
    • TCP可靠数据传递
      • TCP基于IP建立了RDT协议
      • 超时重传
        • 情况一
        • 情况二
      • 快速重传
        • 伪代码
    • 流量控制
      • 目的
      • 捎带技术
    • 连接管理
      • 三次握手
      • 四次挥手
  • 拥塞控制原理
    • 拥塞的代价与原因
      • 两个发送方和一个无穷大缓存的路由器
      • 两个发送方和一个有限缓存的路由器
      • 多个发送方多台路由器
    • 控制方法
      • 端到端的拥塞控制
      • 网络辅助的拥塞控制
      • ATM
      • ABR服务
  • TCP拥塞控制
    • 端到端的控制机制
    • 如何检测拥塞
      • 某个段超时(丢失):拥塞
      • 3个冗余ACK:轻微拥塞
    • 如何控制端的发送速率
      • 超时
      • 三次冗余ACK
      • 正常情况
    • TCP拥塞控制与流量控制的联合处理
    • 控制策略
      • 慢启动
      • 线性增
      • 乘性减
    • TCP的公平性

传输服务与协议

为运行在不同主机上的应用进程提供逻辑通信

逻辑上,应用层的进程可以直接与另一主机上的进程进行通信,通过套接字即可

实际上,需要传输层以及底下的协议栈提供服务。
在这里插入图片描述

  • 发送方:将应用层的报文分成合适的报文段,加上本层报头,然后传递给网络层
  • 接收方:将报文段进行报头解析,然后重组成报文,传递给应用层

传输层协议有TCP或者UDP协议两种选择

网络层提供的是端到端(主机到主机)之间的服务,传输层在网络层的基础上,提供更加细分的服务,从进程到进程之间的服务。

网络层与传输层

网络层:主机之间的逻辑通信

传输层:进程之间的逻辑通信

  • 依赖于网络层的服务:延时、带宽无法改善
  • 增强网络层的服务:顺序混乱、数据丢失、加密

多路复用与解复用

TCP

以TCP为例,应用层建立TCP套接字

在这里插入图片描述

应用层调用传输层的服务需要提供的信息有,数据报文与socket套接字—两个参数

  1. 在传输层中,通过使用套接字中的源PORT与目标PORT封装报头,然后向下传输
  2. 在网络层中,使用套接字中的源IP与目标IP封装成IP的报头。

分组到达目标端后,依次进行报头解包,向上提供有效载荷部分,网络层还需要提供源IP与目标IP,在传输层中,根据这些数据,再解包出来的源RORT与目标PORT,根据这四个数据可以确定对应的套接字,然后根据套接字可以确定目标进程。

UDP

套接字结构

在这里插入图片描述

逻辑概念图

在这里插入图片描述

  1. 进程调用传输层的UDP服务,需要向下提供数据部分、套接字、目标IP与PORT—三个参数
  2. UDP使用套接字中的源PORT与传下来目标PORT进行报头的封装
  3. 将数据报、套接字中的源IP、目标IP传递给网络层,使用IP协议,封装成IP数据报

在目标端中

  1. 网络层对IP报头进行解包,给传输层提供,源IP与目标IP以及有效载荷
  2. 传输层对UDP报头进行解包,给应用层提供目标PORT与目标IP,可以确定一个套接字,既可以找到目标进程

在网络传输的过程中,只要四元组 ( 源 I P ,源 P O R T ,目标 I P ,目标 P O R T ) (源IP,源PORT,目标IP,目标PORT) (IP,源PORT,目标IP,目标PORT)中的任何一个不一样,访问的主机的进程都会是不一样的

无连接传输UDP

UDP在IP上并没有增加一些服务的性能,报文可能丢失、乱序

  • 接收端与发送端之间没有握手
  • 每个UDP报文段都被独立的处理

常用于 流媒体、DNS、SNMP,一次传输搞定或者对速率要求高、丢失不敏感的类型。

用户数据报

在这里插入图片描述

校验和:一种校验手段,用于判断在传输的过程中,数据是否出错

传输校验码,在接收端会重新根据内容计算一遍,来与校验和对比,判断是否出错,但是校验不一定是绝对正确的,存在某些错误但是通过了校验。

报文段的头部很小,有效载荷占比大,所以传输速率高。

可靠数据传输(rdt)原理

在TCP协议中,器可以建立一条可靠数据传输信道,然后,在进行有序的分组的传输。

不过,传输层实现的有效数据传输协议的下层协议是不可靠的,要在一个底层不可靠的协议上实现可靠的传输协议。

问题逻辑

在这里插入图片描述

由于底层信道的不可靠性,导致rdt协议会比较复杂。

当底层信道是完全可靠的

  • 没有比特出错
  • 没有分组丢失

接收方与发送方

  • 发送方将数据打包发送到下层信道
  • 接收方从下层信道接收数据

底层信道完全可靠,不需要上层采取什么措施来保证数据可靠

具有比特错位的底层信道

假定底层信道的分组发送是按照顺序被接收的,不过在发送的过程中,会存在一些比特错位的情况(物理部件中)

发送端发送分组后,接收端接收需要对分组进行校验,校验成功,发送给接收端一个(ack)的信号,表示确认收到。

如果校验失败,接受方发送一个(nak)的信号,要求发送方再重传一次。

发送方发送一个分组后,再缓冲区中还需要留这个分组一个备份,等接受方发送一个ack的信号后,再跟新缓冲区,发送下一个分组。如果收到一个nak的信号,则从缓冲区中将备份重传一遍,等待信号。

FSM描述

在这里插入图片描述

自动重传协议(ARQ)

需要三种协议来处理比特差错的情况

  • 差错检测(校验算法)
  • 接收方反馈:确认收到ACK;否定确认,重传(NAK)
  • 重传:发送方会重传该分组

缺陷

不过有一个问题,没有考虑到接收方反馈信号受损的情况(发送方没有收到ack或者nak)

在分组之间引入一个字段代表序号

如果两个信息的序号一样,说明是处于重传的情况。序号改变了,说明这传递的是一个新的分组。

如果发送方发送了分组,序号0,接收方发送一个ack,但是ack受损,本来发送方是希望接收到ack或者nak,但是出现了其它的情况,发送方就会重新把序号0的分组发送给接收方,接收方收到,判断处前后两个分组的序号一样,就会再次发送ACK,同时一直等待,直到接收到前后两个序号不一样的分组,接收方就直到上一个状态结束了,继续去等待收到下一个序号不一样的分组。

  • 分组的序号一样:说明一直在重发,接收方与发送方在等待同步
  • 分组的需要不一样:说明进入了下一个阶段

接收方,在收到分组时(序号为0),如果校验通过,发回一个ack,然后等待发送方发一个序号1的分组,如果任然接受到的序号为0,说明发送方接收到的数据有误,则 会继续等待,同时发送一个ack给发送方,希望发送方可以同步上来

在这里插入图片描述

版本2

如果对于接收方的确认信息,ack或nak,如果不发送nak,通过序号与ack的结合也可以达到nak的效果。

对ack进行编号。

接收端收到的分组校验失败时,需要发送端重新发送一份,接收端会发送nak;发送端需要重新发送分组的情况有,nak出问题了或者分组发送校验失败,两个情况都需要重新发送一份分组

在这里插入图片描述

所以,当分组为0时,发送端接收到ack0时,说明双方正常,可以进行下一次分组发送,同时序号变为1;发送端接收到ack1时,说明需要重新发送一份序号0的分组。

接收方,当校验失败时,发送一个ack1,需要发送方重发,等待正常的序号0分组;当接收到一个序号0分组时,发送一个ack0,表示可以进行下一步(等待序号1的分组)。当收到一个序号0分组时,说明发送方正在重传,发回一个ack0,等待发送方发送序号1的的分组(进入下一步)。

此时状态0,等1,可以进入下一步

此时状态1,等0,可以进入下一步

对于发送方而言
  • 发送的分组0,接收到ack0,则发送下一个分组;接受到ack1,继续发送分组0,同时等待收到ack0
  • 发送的分组1,接收到ack1,则发送下一个分组;接受到ack0,继续发送分组1,同时等待收到ack1
对于接收方而言
  • 接收到分组0,校验成功,发送ack0,等待收到分组1,进入下一步;
  • 校验失败,发送ack1,等待。

具有比特错位与分组丢失的底层信道

当发送方发送一个分组,然后等待ack,但是分组丢失了,而接收方又没有收到分组,在等待分组,双方都在等待对方的信号,这样会造成死锁,无法向下进行。

引入了超时重传机制,等待超过一定时间就会重传一次分组。

对于发送方等待超时的情况下,发送方不知道是分组丢失,还是ack丢失,直接发送方重传一份。

如果是ack丢失,发送方重新发送一份,对于接收方而言,不过是重新接受一份,继续等待。
在这里插入图片描述

当定时设置的合适时,效率是正常的,如果定时设置的不合理,则会导致其性能严重下降。

当rdt3.0在信道较大(带宽大)的情况下,会出现吞吐量很低的情况,传输延时(距离长)较大,会造成利用率非常低,因为RTT时间长。大部分时间都花在传输上。因为,rdt3.0模式下,信道中只能有一个分组进行传输,严重浪费了带宽资源,引入流水线技术。

流水线

一个信道种传输多个分组,当一个分组发送刚出去后,立马发送下一个分组…

所以,发送端要准备一个缓冲区,将发送出去的分组暂存在缓冲区,如果发送失败了,还能重发

在这里插入图片描述

通用:滑动窗口协议

发送缓冲区

  • 内存中的一个区域,落入缓冲区的分组可以发送
  • 用于存放已经发送但是没有得到确认的分组(发送窗口)
  • 当需要重发时必要

发送缓冲区的大小

一次可以发送分组的数量

  • num=1时,就是停止等待协议
  • num>1时,合理的值,不能很大,链路利用率不能超过100%(表示缓存区存放的分组总和有限)

由于要求链路的利用率不能超过100%,且链路的容量是指带宽大小,带宽是有限的,所以对于缓冲区能存放的分组的大小是有限的。

发送窗口

  • 在发送缓冲区中,缓冲区不一定被待发送的分组全部占满了

  • 缓冲区中,那些已发送,但未确认的分组的序号构成的空间

  • 发送窗口的最大值是要<=发送缓冲区的值
    在这里插入图片描述

接收缓冲区

一次最多可以接收存储多少分组

接收窗口

接收窗口才是决定到底一次性接收多少分组

接收窗口尺寸等于1(GBN回退N步)

当接收窗口为1时,按照顺序向后滑动,接受完0号分组,再去接收1好分组

当窗口在2号位置上等待接收,如果三号分组来了,是不会接收的,抛弃掉,只有接受完2号分组才回去接收下一个。

同时,接收端发送一个ack1,表明1号分组已经接收,同时根据rdt的理论,这是在向发送端说,在等待2号分组的接收。

如果接收窗口在2号分组的位置上,且来了3、4、5…其它分组的,接收窗口都不会接收,会将他们抛弃掉,同时向发送端发送一个已接收的最高分组的ack,根据rdt的理论,这个表明接收端正在等待下一个序号的分组,还没接收到。

发送方

依次流水线发送发送窗口中的分组,只有最低序号的分组得到确认窗口才能向前移动

如果发送方一直收到的是已经发送的最高序号的ack,那么说明接收方一直没接收到,需要重传,则会将窗口中的所有分组都进程重传

定时器只有一个,在发送方,发送了分组后,就会开启定时器,定时器结束前没有接收到ack,就会将窗口内的分组全部重新发送一遍

接收方

其接收窗口的大小为1,这样要去顺序接收,如果当前序号的分组没有被接收,后面序号的分组如果到来是会被抛弃,因为要保证分组的有序性

接收窗口尺寸大于1(选择重发SR)

只要在接受窗口的范围内,是可以乱序接收的,接收到分组后,然后向发送端发送一个ack+对应接收的分组序号

如果窗口的第一个位置的分组丢失了,而后面的分组都被接收了,会有超时重传,重新发送发送窗口中的分组。

当最低序的分组被接受后,就可以让窗口向后滑动了,滑动到没被接收的位置。

都是要在rdt3.0协议下进行的流水线改造

发送方

发送窗口中的分组要依次进行发送,为避免分组丢失,会为窗口中的每一个分组都准备一个定时器,发送后开始计时。当接收到对应的ack后,窗口就会向后滑动。

如果定时器到了,就会将发送窗口中的未确认的分组重发一次

接收方

在接收窗口的内部,是可以乱序接收的,然后将其存在缓存区的对应位置上,当最低序号的分组都被接收了,接收窗口才能向后移动。

接收窗口中的每一个分组被接收后,都会发送一个独有的信号,告诉发送方,该分组已经接收,可以停止计时。

滑动

低序号的分组接收,接收窗口向后滑动

高序号的分组到来,窗口内的乱序接收,因为要保证rdt,所以必须保证分组有序,不滑动

发送确认

收到那个分组,就发送那个分组的确认信号。

  1. 发送窗口发送数据
  2. 接收窗口接收数据,接收窗口滑动
  3. 接收端发送确认
  4. 发送窗口滑动
对比

在这里插入图片描述

SR会为每一个分组都准备一个定时器,而GBN则是顺序接收,只会为发送窗口中的第一个准备定时器,如果超时,会将发送窗口中的分组都发送出去。

在这里插入图片描述

面向连接的传输TCP

提供点到点之间的通信,一台主机对一台主机,无法做到一对多的广播模式

TCP连接只在端系统中运行,在网络核心中的网络元素(路由器与交换机)并不会维持其连接状态,对于网络元素,其看到的只是数据报,并不会专门提供一条线路维持其连接。

TCP连接提供的是全双工服务,当两台主机上的进程建立了TCP连接后,两个进程之间可以互相传递数据,而不是单向的数据传递。

三次握手

  1. 客户进程首先发送一条特殊的TCP报文段(没有有效载荷)
  2. 服务器用另一条特殊的TCP报文段来响应(没有有效载荷)
  3. 客户端用第三个特殊的报文段作为响应(承载有效载荷)

MSS(最大报文段长度)

指应用层数据最大字节数

MSS是由从源主机到目标主机的路径上,所有链路上所能够发送的最大链路层帧(最大传输单元),以太网与PPP链路层协议都是1500个字节的MTU

TCP报文段,包括40分字节的报头,加上1460个字节的应用层数据段。
在这里插入图片描述

最大对于应用层的数据只能封装成这么大,如果太大,就要对数据进行切分,然后再封装。

TCP为每块客户数据块配上一个TCP首部,形成多个TCP报文段,这些报文段被传递给网络层,通过一连串的路由器与交换机的链路层与物理层,最后到达服务端的TCP连接接收,然后放入TCP接收缓存中(这个缓存应该是在OS提供的一块缓存区)。

TCP连接的每一端都有各自的发送缓存与接收缓存

两台主机之间的网络元素,并没有为连接提供任何的缓存与变量。
在这里插入图片描述

TCP报文段格式

在这里插入图片描述

序号(32比特)

这个是对于应用层的数据段,被分割成一块块的MSS,然后封装,这个是对于各块MSS在原数据段中的对于第一个字节的偏移量

TCP报文段中载荷部分的第一个字节在整个应用层数据流中的偏移量。
在这里插入图片描述

确认号(32比特)

任何一个TCP的实体,既是接收方也发送方。

在主机A与主机B建立了TCP连接,当主机A发送一串数据给主机B,主机B也会给主机A一个反馈报文段,当主机B收到主机A发送的0-533序号的所有字节,主机B会等待主机A发送534及其之后的报文段字节,主机B就会发送一个确认号为533的报文段,向主机A表明,533及其之前的报文段都已经被接受了,等待后面的报文段

对于乱序到达的报文段,可以选择缓存(SR),也可以选择抛弃(BGN)。

接收窗口

用于流量控制,愿意接收的字节数量

TCP的往返延时(RTT)和超时

超时设置要大于RTT时间

如果超时设置较小,则会造成主机B还没反馈,就又发送报文段,会发送很多的重复报文段

如果超时设置较大,会造成需要重传时,造成很大的延时。

如何估计RTT

长时间的主机访问的RTT虽然是符合正态分布的,但是无论怎样设置都会造成较大的问题。

但是短时间的主机访问RTT的时间是非常集中的,所以超时设置应该是一个动态的自适应参数

在一个局域网中,RTT非常小,但是对于两个进程之间的TCP通信,这个RTT会不太确定,影响很多。

所以需要时不时的去测量RTT,来动态的调整超时。

指数移动加权平均

在这里插入图片描述

当前采样值对于整体值的影响会随着时间(采样次数)的增加而呈指数规律越来越小。

RTT的波动影响

在这里插入图片描述

TCP可靠数据传递

TCP是一种流水线的数据传输协议,而流水线的协议由两种:GBN与SR

TCP的数据传递是两种的混合体

TCP基于IP建立了RDT协议

  • 管道化的报文段:GBN或者SR
  • 累计确认:通过报文段中的确认号(类似于GBN)
  • 单个重传定时器:只与最”老“那个报文段相关联,如果超时就会重发最老的那个报文段(SR与GBN的结合)
  • 接收方对于乱序,没有规范,可以接收也可以抛弃

在这里插入图片描述

超时重传

在这里插入图片描述

当过早超时时,发送方会发送最老的那个报文段,然后接收方就会发送最新的预期确认号,这样就可以让发送方关掉定时器,发送预期的报文段。

接收方发送的确认是累计确认,是最新的期望接收的报文段

情况一

在这里插入图片描述

情况二

在这里插入图片描述

快速重传

如果发送方收到了3个冗余的ACK(收到了3个确认号一样的ACK),说明发送方发送的那个报文段丢失了,因为是流水线持续发送报文段。

这样不用等到定时器触发,直接重发一份。

这个时机比超时重发更早一些,提高速度
在这里插入图片描述

接收方发送的报文段的序号是要大于接收到的ack,这样可以检测出接收方的报文段缓冲区存在间隔

在这里插入图片描述

伪代码

在这里插入图片描述

流量控制

目的

接收方控制发送方的发送速率,不让发送方发的太快、太多,而导致接收方的缓冲区溢出。

通过TCP报文中的接收窗口这个字段,接受方发送给发送方,可以让发送方知道接收方的接收缓冲区中还有多少空间
在这里插入图片描述

捎带技术

TCP连接是可以双向通信的,进程A发数据给进程B,进程B也要发数据给进程A。进程B收到进程A的数据,需要将ACK发送给进程A,但是这个ACK可以和进程B发给进程A的数据在一个报文段中一起发回去,TCP报文段也提供了这个格式。

连接管理

在正式交换数据之前,接收方与发送方需要三次握手,建立连接关系

  • 同意建立连接:双方都知道对方愿意建立连接
  • 同意连接参数:准备资源,维护变量参数

三次握手

在这里插入图片描述

在这里插入图片描述

第二次握手后,双方就可以开始随机初始化自己的初始序号

在这里插入图片描述

在第三次握手后,再开始分配资源,如果再前两次握手,会存在大量的办理按揭同时会消耗大量的系统资源,一种攻击手段。

四次挥手

在这里插入图片描述

两个半连接的互相拆除。

客户端确认关闭连接后,双方为了TCP连接准备的资源就会被释放。

通过携带技术,服务端的FIN报文段可以携带对客户端回应的ACK

拥塞控制原理

与流量控制不同,拥塞控制是出现在网络中,针对分组的丢失率与延迟的处理

对于网络核心中的元素,路由器与交换机

  • 分组丢失(路由器缓冲区溢出)
  • 分组延时高(出现拥塞的情况下,分组排队的时间很长)

拥塞的代价与原因

两个发送方和一个无穷大缓存的路由器

对于路由器的带宽,给两个发送方提供服务,作为一个共享带宽,一个发送方最大享用R/2的带宽

随着发送方的发送速率越来越大了,则在缓冲区的排队的分组也越来越多。当一个发送方占用的带宽达到R/2时,说明共享链路的流量强度以及达到上限。

在这里插入图片描述

分组发送中的延时也会越来越大,并且指数级增长。

两个发送方和一个有限缓存的路由器

都知道路由器的缓冲区一旦溢出对于新到来的分组就会被丢失

这样会触发发送方超时重传的机制,会重新发送分组。

一种理想情况,当缓冲区每空出来一个位置,就会有一个重传的分组到达去占据这个位置

另一种情况,当分组在缓冲区中排队延时超过一定时间,会引发重传机制,会再次发送一份分组,或许时间一长(多次路由器中的排队延时),会多次重传,就会造成很多不必要的分组重传,会加剧网络的拥塞程度,同时会造成吞吐率下降,即有效的传输会严重下降。

多个发送方多台路由器

多个发送方说明网络的拥塞会急剧上升,多台路由器会出现多个拥塞的节点

当一个发送方需要经过多台路由器才能到达接收方,如果前几个录用其出现拥塞,然后发送方会发送大量的重传分组,然后某个分组到达一个新的路由器时,那个路由器因为缓冲区溢出,而抛弃那个分组,这样会造成大量的传输能力的浪费,会造成链路的带宽的浪费,会加剧网络的拥塞程度。

控制方法

端到端的拥塞控制

网络层不会为传输层提供信息,端系统必须通过对网络层数据状态的观察来推断,网络中是否出现拥塞

TCP连接通过对报文段的丢失或者收到3次冗余的报文段来判断网络是否出现拥塞,一种推理方法。

当推断网络出现拥塞时,会响应的减少发送速率,当网络情况良好的时候,会提高发送速率。

网络辅助的拥塞控制

网络中的组件(路由器)会向发送方的传输层提供网络的拥塞状况,可以很简单的使用一个比特位来表明链路中的拥塞状态,让发送方调整自己的发送速率,以抑制网络拥塞的恶化

拥塞信息的传递有两种

  1. 直接由网络路由器发送一个分组给发送方,告诉发送方拥塞情况
  2. 对于发送方发向接收方的分组中,通过某个字段标记来表明网络拥塞,然后让分组到达接收方,由接收方发送一个拥塞分组告诉发送网络拥塞了,这个往返方法至少需要一个RTT的时间,还存在丢失的情况。

ATM

该网络的交换数据单元叫信元

信元只有53个字节,远小于分组的大小,所以其在链路上的传输速率要比分组快,虽然比线路交换慢。

ABR服务

在ATM网络中,网络不发送拥塞的情况,会提高传输速率尽可能利用可用带宽,在网络拥塞的情况,会限制传输速率。

信元分为数据信元与资源管理信元,大部分是数据信元,中间残差了少量的资源管理信元

在资源管理信元,中由两个比特位,一个表示轻微拥塞,一个表示重度拥塞,在经过交换机时,交换机会根据情况来设置资源管理信元的标志位。

发送方将一组信元发送给接收方,经过一连串的交换机,到达接收方后,接收方不做处理,资源管理信元被接收方原路返回给发送方,告诉发送方网络的拥塞情况。

资源管理信元中,还存在一个字段ER,在资源管理信元经过一个个交换机后,可以知道所有交换机可以位会话提供最小的带宽是多少,可以让发送方调整发送速率,改善网络拥塞情况

TCP拥塞控制

如果是网络辅助的拥塞控制,虽然可以提高网络的拥塞控制能力,但是会增加网络的负载,增加路由器的负担,代价比较大。

端到端的控制机制

网络路由器不提供信息,而是靠端自己获得的信息来判断网络是否发送拥塞

  • 路由器负载较轻
  • 符合网络核心简单的TCP/IP架构原则

如何检测拥塞

某个段超时(丢失):拥塞

超时定时器的时间到了,但是那个段的确认却没收到

  1. 网络拥塞:某个路由器缓冲区溢出,然后被丢弃了;经过多个路由器中排
  2. 校验失败:因为各级错误,没有通过校验,而被丢失(概率小)

虽然,一旦超时就认为拥塞是存在问题的,但是总体的大方向控制是没有错误的

3个冗余ACK:轻微拥塞

  • 收到第一个ACK:正常,收到确认信号
  • 后面收到3次同样的冗余ack,说明这个分组丢失了,但是又没触发定时器,提前重传

在这里插入图片描述

网络还能进行一定程度的传输,说明网络存在一定轻微的拥塞

如何控制端的发送速率

为此一个变量,CongWin:在对方未确认的情况下,可以往网络中发送多少字节

发送速率 r a t e = C o n g W i n R T T rate=\dfrac{CongWin}{RTT} rate=RTTCongWin,表明单位时间内可以往网络中注入多少字节

超时

会将CongWin的发送速率调整为1个MSS,进入到一个慢启动(SS)的阶段,然后倍增到CongWin/2(每个RTT),进入到拥塞避免(CA)阶段

三次冗余ACK

CongWin降为CongWin/2,进入CA阶段

正常情况

发送方收到正常的ACK,CongWin会逐步增加

  • SS阶段:成倍增加(每个RTT)
  • CA阶段:线性增加(每个RTT)

TCP拥塞控制与流量控制的联合处理

发送方控制发送但为确认的量,同时也不能超过接收窗口,需要满足流量控制

  • SendWin=min{CongWin,RcvWin}
  • 满足拥塞控制与流量控制

控制策略

慢启动

刚开始,CongWin等于一个MSS,然后从下一次开始,每次发送是之前一次的两倍,相当于指数级增加。

线性增

当出现超时的情况时,将阈值设置为CongWin/2,然后CongWin变成1MSS开始倍增,当倍增到阈值时,就停止倍增,然后以每次增加一个MSS的速率增加,探测更加准确的阈值。

在这里插入图片描述

乘性减

一旦出现超时或者冗余ACK,就会将阈值设置为原先的一半,CongWin变成1个MSS,重新倍增。

维持一个变量:Threshold,表示CongWin成倍增加的阈值。出现丢失时,就设置为CongWin/2

在这里插入图片描述

TCP的公平性

两个TCP会话,都需要通过一个瓶颈链路,链路带宽为R,两个会话的RTT相等

因为拥塞控制的阈值每次回变为CongWIn的一半,最后回收敛为两个会话各自占用一半的带宽

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

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

相关文章

非局部均值滤波的指令集优化和加速(针对5*5的搜索特例,可达到单核1080P灰度图 28ms/帧的速度)。

非局部均值滤波(Non Local Means&#xff09;作为三大最常提起来的去燥和滤波算法之一&#xff08;双边滤波、非局部均值、BM3D&#xff09;&#xff0c;也是有着很多的论文作为研究和比较的对象&#xff0c;但是也是有着致命的缺点&#xff0c;速度慢&#xff0c;严重的影响了…

【Spring】Spring MVC 程序开发

Spring MVC 程序开发 一. 什么是 Spring MVC1. MVC2. Spring、Spring Boot 与 Spring MVC 二. 创建 Spring MVC 项目1. 创建项目2. 用户和程序的映射3. 获取用户请求参数①. 获取单个参数②. 获取多个参数③. 传递对象④. 后端参数重命名&#xff08;后端参数映射&#xff09;R…

谈谈Android Jetpack Compose中的状态提升

谈谈Android Jetpack Compose中的状态提升 在本文中&#xff0c;我们将了解Jetpack Compose中的状态提升&#xff08;State Hoisting&#xff09;。在深入研究这个主题之前&#xff0c;让我们先了解一下Jetpack Compose中的有状态&#xff08;Stateful&#xff09;和无状态&am…

如何快速查询众多未签收快递单号

在日常工作中&#xff0c;快递查询是一个常见的任务。无论是电商卖家、快递员还是收件人&#xff0c;都需要查询快递的状态和信息。然而&#xff0c;一个一个地查询快递单号不仅耗时&#xff0c;还容易出错。因此&#xff0c;使用固乔快递查询助手这样的工具可以大大提高查询效…

Polygon zkEVM递归证明技术文档(5)——附录:借助SNARKjs和PIL-STARK实现proof composition

前序博客有&#xff1a; Polygon zkEVM递归证明技术文档&#xff08;1&#xff09;【主要描述了相关工具 和 证明的组合、递归以及聚合】Polygon zkEVM递归证明技术文档&#xff08;2&#xff09;—— Polygon zkEVM架构设计Polygon zkEVM递归证明技术文档&#xff08;3&#…

【数据结构】计数排序 排序系列所有源代码 复杂度分析(终章)

目录 一&#xff0c;计数排序 1&#xff0c;基本思想 2&#xff0c;思路实现 3&#xff0c;计数排序的特性总结&#xff1a; 二&#xff0c;排序算法复杂度及稳定性分析 三&#xff0c;排序系列所有源代码 Sort.h Sort.c Stack.h Stack.c 一&#xff0c;计数排序 计数…

origin作图上下对开,修改颜色

一般上下对开后默认两幅图颜色相同&#xff0c;如果要修改成不同的颜。双击空白处&#xff0c;在图层栏里取消勾选绘图属性。

基于Java的在线文档编辑管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

BRISK: Binary Robust Invariant Scalable Keypoints全文翻译

pdf链接&#xff1a;https://pan.baidu.com/s/1gFAYMPJStl4cF0CswY9cMQ 提取码&#xff1a;yyds 摘要 从图像中有效和高效地生成关键点是文献中深入研究的问题&#xff0c;并形成了许多计算机视觉应用的基础。该领域的领导者是SIFT和SURF算法&#xff0c;它们在各种图像转换下…

图文结合丨Prometheus+Grafana+GreatSQL性能监控系统搭建指南(上)

一、环境介绍 本文环境&#xff0c;以及本文所采用数据库为GreatSQL 8.0.32-24 $ cat /etc/system-release Red Hat Enterprise Linux Server release 7.9 (Maipo) $ uname -a Linux gip 3.10.0-1160.el7.x86_64 #1 SMP Tue Aug 18 14:50:17 EDT 2020 x86_64 x86_64 x86_64 G…

Xcode 15下,包含个推的项目运行时崩溃的处理办法

升级到Xcode15后&#xff0c;部分包含个推的项目在iOS17以下的系统版本运行时&#xff0c;会出现崩溃&#xff0c;由于崩溃在个推Framework内部&#xff0c;无法定位到具体代码&#xff0c;经过和个推官方沟通&#xff0c;确认问题是项目支持的最低版本问题。 需要将项目的最低…

关于 打开虚拟机出现“...由VMware产品创建,但该产品与此版VMwareWorkstateion不兼容,因此无法使用” 的解决方法

文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/133678951 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

我的创业之路:我为什么选择 Angular 作为前端的开发框架?

我是一名后端开发人员&#xff0c;在上班时我的主要精力集中在搜索和推荐系统的开发和设计工作上&#xff0c;我比较熟悉的语言包括java、golang和python。对于前端技术中typescript、dom、webpack等流行的框架和工具也懂一些。目前&#xff0c;已成为一名自由职业者&#xff0…

通用监控视频web播放方案

业务场景 对接监控视频&#xff0c;实现海康大华等监控摄像头的实时画面在web端播放 方案一&#xff0c;使用 RTSP2webnode.jsffmpeg 说明&#xff1a;需要node环境&#xff0c;原理就是RTSP2web实时调用ffmpeg解码。使用单独html页面部署到服务器后&#xff0c;在项目中需要播…

【stm32芯片设置解惑】:stm32F103系列的开漏输出和推挽输出的区别

场景&#xff1a; 大家在开发stm32的时候&#xff0c;不管是标准库开发还是hal库开发&#xff0c;最基础的就是芯片引脚的某某设置&#xff0c;为什么这么设置&#xff1f;这样设置的好处是什么&#xff1f; 问题描述 — 开漏输出和推挽输出的用处和区别 什么是开漏输出&#x…

Android Studio修改模拟器AVD Manger目录

Android Studio修改虚拟机AVD Manger目录 1、在AS的设备管理器Device Manager中删除原来创建的所有虚拟机&#xff08;Android Virtual Device&#xff09;&#xff1b; 2、新建一个自定义的AVD目录&#xff0c;例如&#xff1a;D:\Android\AndroidAVD 3、在高级系统设置中增加…

ArcGIS中的镶嵌数据集与接缝线

此处介绍一种简单方法&#xff0c;根据生成的轮廓线来做镶嵌数据集的拼接。 一、注意修改相邻影像的上下重叠。注意修改ZOrder和每幅影像的范围。 二、修改新的镶嵌线并且导出影像文件。 三、还有其他方法和注意事项。

c++视觉--通道分离,合并处理,在分离的通道中的ROI感兴趣区域里添加logo图片

c视觉–通道分离&#xff0c;合并处理 通道分离: split()函数 #include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image cv::imread("1.jpg");// 检查图像是否成功加载if (image.empty()) {std::cerr << "Error: Could not read the…

MyBatis-Plus演绎:数据权限控制,优雅至极!

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是尘缘&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f449;点击这里&#xff0c;就可以查看我的主页啦&#xff01;&#x1f447;&#x…

MFC扩展库BCGControlBar Pro v33.6 - 网格、报表控件功能升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v33.6已正式发布了&#xff0c;此版本包含了对图表组件的改进、带隐藏标签的单类功能区栏…