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

【事先声明】
这是对于中科大的计算机网络的网课的学习笔记,感谢郑烇老师的无偿分享 书籍是《计算机网络(自顶向下方法 第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.mzph.cn/news/99193.shtml

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

相关文章

常见排序算法Java版(待续)

冒泡排序O(n^2) public class Main {public static void main(String[] args) {Random random new Random();int[] nums new int[]{random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100)};for (i…

英特尔参与 CentOS Stream 项目

导读红帽官方发布公告欢迎英特尔参与进 CentOS Stream 项目&#xff0c;并表示 “这一举措不仅进一步深化了我们长期的合作关系&#xff0c;也构建在英特尔已经在 Fedora 项目中积极贡献的基础之上。” 目前&#xff0c;CentOS Stream 共包括以下特别兴趣小组&#xff08;SIG&a…

汽车冲压车间的RFID技术设计解决方案

一、RFID技术的基本原理 RFID技术是一种利用非接触式自动识别的技术&#xff0c;通过将RFID标签放置在被识别物品上&#xff0c;并使用RFID读写器对标签进行扫描和识别&#xff0c;实现对物品的自动识别和追踪。RFID标签分为被动式和主动式两种。被动式标签无内置电源&#xf…

23.3 Bootstrap 框架4

1. 轮播 1.1 轮播样式 在Bootstrap 5中, 创建轮播(Carousel)的相关类名及其介绍: * 1. carousel: 轮播容器的类名, 用于标识一个轮播组件. * 2. slide: 切换图片的过渡和动画效果. * 3. carousel-inner: 轮播项容器的类名, 用于包含轮播项(轮播图底下椭圆点, 轮播的过程可以显…

HTTP协议的请求协议和响应协议的组成,HTTP常见的状态信息

HTTP协议 什么是协议 协议实际上是某些人或组织提前制定好的一套规范,大家只要都按照这个规范来就可以做到沟通无障碍 HTTP协议是W3C(万维网联盟组织)制定的一种超文本传输通信协议(发送消息的模板和数据的格式),除了传送字符串,还有声音、视频、图片等流媒体等超文本信息 …

ctfshow-web11(session绕过)

php代码审计&#xff1a; function replaceSpecialChar($strParam){$regex "/(select|from|where|join|sleep|and|\s|union|,)/i";return preg_replace($regex,"",$strParam);} 首先定义了一个函数&#xff0c;主要是使用preg_replace函数对我们提交的内…

SpringBoot的创建和使用

优点 快速添加依赖&#xff1b; 内置web容器&#xff1b; 自动装配&#xff1b; idea创建 创建maven项目&#xff08;配置&#xff09; 一定要选择2.x版本的Spring Boot 介绍目录 (有这个注解的SpringBootApplication就是启动类) 删除文件 尝试去运行带有SpringBootApplica…

面向对象设计-UML六种箭头含义

目录 UML概述UML语义UML表示法 六种常用关系标识方法泛化实现依赖关联聚合组合 本文参考文章 https://blog.csdn.net/qq_25091281/article/details/123801862 UML概述 UML (Unified Modeling Language)为面向对象软件设计提供统一的、标准的、可视化的建模语言。适用于描述以…

数学分析:含参变量的积分

同样很多收敛性的证明不是重点&#xff0c;但里面的知识还是需要适当掌握&#xff0c;知道中间的大致思考和解决路径即可。 本质还是极限的可交换性&#xff0c;求导可以换到积分里面去操作。 这里要注意变量的区别&#xff0c;首先积分的被积变量是x&#xff0c;但是函数的变量…

springsecurity

springsecurity 一个安全框架&#xff0c;例如&#xff1a;在进行登录之前&#xff0c;会进行一个拦截&#xff0c;经过安全框架之后&#xff0c;才会跳转到原本要登录的地址 culr:&#xff08;不细写&#xff0c;需另找文档&#xff09; 可以进行登录的操作&#xff08;在git…

[Android]问题解决-Device must be bootloader unlocked

现象 在push文件时&#xff0c;remount命令发生如下报错&#xff1a; $ adb remount Device must be bootloader unlocked解决 1. 打开 开发者模式中的OEM unlocking开关 2. fastboot unlock设置 adb reboot bootloader fastboot flashing unlock根据屏幕提示&#xff0c;…

Android 多线程并发详解

一&#xff0c;基础概念 1.1什么是CPU 中央处理器&#xff08;CPU&#xff09;&#xff0c;是电子计算机的主要设备之一&#xff0c;电脑中的核心配件。其功能主要是解释计算机指令以及处理计算机软件中的数据。CPU是计算机中负责读取指令&#xff0c;对指令译码并执行指令的…

MySQL-锁

MySQL的锁机制 1.共享锁(Shared Lock)和排他锁(Exclusive Lock) 事务不能同时具有行共享锁和排他锁&#xff0c;如果事务想要获取排他锁&#xff0c;前提是行没有共享锁和排他锁。而共享锁&#xff0c;只要行没有排他锁都能获取到。 手动开启共享锁/排他锁&#xff1a; -- 对…

计算机是如何启动的

一直好奇计算机启动的原理是怎么样的&#xff1f;最近刚好想搞一下操作系统&#xff0c;故此总结一下。 打开电源 对于现代计算机来说&#xff0c;打开电源是开机的第一步&#xff0c;这一点无用质疑&#xff0c;离开了电&#xff0c;现代社会估计就会垮台。 计算机启动 加电…

Spring Cloud学习笔记【分布式请求链路跟踪-Sleuth】

文章目录 Spring Cloud Sleuth概述概述主要功能&#xff1a;Sleuth中的术语和相关概念官网 zipkin配置下载运行zipkin下载zipkin运行 demo配置服务提供者 lf-userpom.xmlapplication.ymlUserController 服务调用者 lf-authpom.xmlapplication.ymlAuthController 测试 Spring Cl…

JuiceFS 目录配额功能设计详解

JuiceFS 在最近 v1.1 版本中加入了社区中呼声已久的目录配额功能。已发布的命令支持为目录设置配额、获取目录配额信息、列出所有目录配额等。完整的详细信息&#xff0c;请查阅文档。 在设计此功能时&#xff0c;对于它的统计准确性&#xff0c;实效性以及对性能的影响&#…

前端uniapp如何修改下拉框uni-data-select下面的uni-icons插件自带的图片【修改uniapp自带源码图片/图标】

目录 未改前图片未改前源码未改前通过top和bottom 和修改后图片转在线base64大功告成最后 未改前图片 未改前源码 然后注释掉插件带的代码&#xff0c;下面要的 未改前通过top和bottom 和修改后 找到uni-icons源码插件里面样式 图片转在线base64 地址 https://the-x.cn/b…

RK3288:BT656 RN6752调试

这篇文章主要想介绍一下再RK3288平台上面调试BT656 video in的注意事项。以RN6752转接芯片&#xff0c;android10平台为例进行介绍。 目录 1. RK3288 VIDEO INPUT 并口 2. 驱动调试 2.1 RN6752 驱动实现 ①rn6752_g_mbus_config总线相关配置 ②rn6752_querystd配置制式 …

【单片机】18-红外线遥控

一、红外遥控背景知识 1.人机界面 &#xff08;1&#xff09;当面操作&#xff1a;按键&#xff0c;旋转/触摸按键&#xff0c;触摸屏 &#xff08;2&#xff09;遥控操作&#xff1a;红外遥控&#xff0c;433M/2.4G无线通信【穿墙能力强】&#xff0c;蓝牙-WIFI-Zigbee-LoRa等…

基于WTMM算法的图像多重分形谱计算matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、WTMM算法概述 4.2、WTMM算法原理 4.2.1 二维小波变换 4.2.2 模极大值检测 4.2.3 多重分形谱计算 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部…