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

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

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

相关文章

redis,mongoDB,mysql,Elasticsearch区别

Redis&#xff1a; Redis是一种高性能键值存储数据库&#xff0c;基于内存操作&#xff0c;支持数据持久化&#xff0c;支持数据类型丰富灵活&#xff0c;如字符串、哈希、列表、集合、有序集合等。Redis还提供了订阅/发布、事务、Lua脚本、主从同步等功能&#xff0c;适用于访…

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

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

对于L1正则化和L2正则化的理解

在DL中&#xff0c;L1和L2正则化经常被使用到&#xff0c;因为大于1L的正则化都是凸优化的问题&#xff0c;是个简单问题&#xff0c;可以被解决。 首先说正则的意义&#xff1a; 一切可以缓解过拟合的方法&#xff0c;都可以被叫做正则化 我最开始理解正则化的时候就是看lh…

基于共生生物优化的BP神经网络(分类应用) - 附代码

基于共生生物优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于共生生物优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.共生生物优化BP神经网络3.1 BP神经网络参数设置3.2 共生生物算法应用 4.测试结果…

一个好用的k8s代理工具——KtConnect

介绍 KtConnect实现了开发者本地运行的服务与Kubernetes集群中的服务之间的双向互通。 核心功能 本地直接访问Kubernetes集群内网 通过KtConnect可以直接连接Kubernetes集群内部网络&#xff0c;在不修改代码的情况下完成本地联调测试 本地解析Kubernetes服务内网域名 直…

SpringCloud学习笔记-注册微服务到Eureka注册中心

目录 1.在该Module的pom文件中引入eureka依赖2.在该module的src/main/resources/application.yml配置文件3.启动对应的微服务4.查看微服务是否启动成功 假如我有一个微服务名字叫user-service,我需要把它注册到Eureka注册中心,则具体步骤如下: 1.在该Module的pom文件中引入eure…

Bootstrap中固定某一个元素不随滚动条滚动

可以利用类sticky-top实现固定某个元素在顶部的效果&#xff0c;示例代码如下&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>固定某一个元素不随滚动条滚动</title><meta name"viewport&quo…

子组件跳转父组件

描述&#xff1a;父组件Form.vue 点击关联&#xff0c;弹出子组件importForm.vue 选中一条数据之后&#xff0c;点击确定按钮&#xff0c;关闭子组件importForm.vue&#xff0c;将子组件的内容显示在父组件Form.vue中 选中第一条数据&#xff0c;点击确定 父组件对应的工作内容…

【新书推荐】当 Python 遇到 ChatGPT —— 自动化办公落地

文章目录 当 Python 遇到 ChatGPT&#xff1a;一种强大的组合1. 文本生成2. 自动翻译3. 对话生成4. 情感分析 新书推荐《Python自动化办公应用大全&#xff08;ChatGPT版&#xff09;&#xff1a;从零开始教编程小白一键搞定烦琐工作&#xff08;上下册&#xff09;》前言内容简…

pillow篇---pillow连续打开同一张图片会导致打开失败问题

如果你需要在多次操作同一张图像时避免出现缓存问题&#xff0c;你可以使用 Image.open() 方法的 seek() 方法将文件指针移动到图像数据的开头&#xff0c;以便重新读取图像数据。示例如下&#xff1a; from PIL import Image# 打开图像文件 image Image.open(example.jpg)# …

mysql面试题27:数据库中间件了解过吗?什么是sharding jdbc、mycat,并且讲讲怎么使用?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:数据库中间件了解过吗,比如sharding jdbc、mycat? 我知道的数据库中间件有以下这些: MySQL Proxy:MySQL Proxy是一个开源的数据库中间件,它位…

Python学习笔记

1、缩进相同的一组语句构成一个代码块&#xff0c;称之为代码组 2、if 、while、def和class这样的复合语句&#xff0c;首行以关键字开始&#xff0c;以冒号(:)结束&#xff0c;该行之后的一行或者多行代码构成代码组 3、在python中无论输入的内容是数字还是字符&#xff0c;…

轻松实现视频、音频、文案批量合并,享受批量剪辑的便捷

在日常生活中&#xff0c;我们经常会需要将多个视频、音频和文案进行合并剪辑&#xff0c;以制作出符合我们需求的短视频。然而&#xff0c;这个过程通常需要花费大量的时间和精力。幸运的是&#xff0c;现在有一款名为“固乔智剪软件”的工具可以帮助我们轻松完成这个任务。 首…

CS5801电路设计|HDMI转EDP转接板方案|HDMI2.0转EDP数据采集卡方案

CS5801国产(北京集睿致远&#xff09;研发HDMI转DP/EDP(4K60)转换器方案芯片,其设计HDMI转EDP转接板方案电路&#xff1a; CS5801输入端可以是1080P、4K30、4K60HZ这三种规格,输出的接口可以是DP信号接口,或者是EDP信号接口,输入端HDMI由4路信号组成&#xff0c;支持1.62Gbps、…

asp.net电影院选座系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net电影院选座系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net电影院选座系统1 二、功能介…

flutter开发实战-inappwebview实现flutter与Javascript的交互JSBridge

flutter开发实战-inappwebview实现flutter与Javascript的交互JSBridge 在使用webview中&#xff0c;需要实现flutter与Javascript交互&#xff0c;在使用webview_flutter插件的时候&#xff0c;整理了一下webview与Javascript的交互JSBridge&#xff0c;具体可以查看 https:/…

jmeter添加断言(详细图解)

先创建一个线程组&#xff0c;再创建一个http请求。 为了方便观察&#xff0c;我们添加两个监听器&#xff0c;察看结果树和断言结果。 添加断言&#xff1a;响应断言&#xff0c;响应断言也是比较常用的一个断言 设置响应断言&#xff1a;正常情况下响应代码是200。选择响应代…

Linux虚拟机搭建RabbitMQ集群

普通集群模式&#xff0c;意思就是在多台机器上启动多个 RabbitMQ 实例&#xff0c;每台机器启动一个。创建的 queue&#xff0c;只会放在一个 RabbitMQ 实例上&#xff0c;但是每个实例都同步 queue 的元数据&#xff08;元数据可以认为是 queue 的一些配置信息&#xff0c;通…

web基础以及http协议

web基础&#xff0c;http协议 域名&#xff1a;www.88886.co DNS解析 静态页面 动态页面 DNS域名&#xff1a; 网络上的通信都是基于IP通信模式&#xff1a;TCP/IP TCP建立连接和断开连接&#xff0c;都是要双方进行确认的 建立连接&#xff1a;三次握手 断开连接&#x…

C++设计模式-装饰器(Decorator)

目录 C设计模式-装饰器&#xff08;Decorator&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-装饰器&#xff08;Decorator&#xff09; 一、意图 动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;Decorator模式相比生成子…