计算机网络笔记——传输层

传输层

从通信和信息处理的角度看,传输层是 5 层参考模型中的第 4 层,它向上面的应用层提供通信服务。它属于面向通信部分的最高层,同时也是用户功能中的最低层

5.1 传输层提供的服务

5.1.1 传输层的功能

传输层为两台主机提供了应用进程之间的通信,又称为端到端通信。由于网络层协议是不可靠的,会使分组丢失、失序和重复等,所以派出传输层为数据传输提供可靠的服务

在这里插入图片描述

既然传输层的UDP是不可靠的,为什么又说传输层提供可靠的服务?

确实传输层中的 UDP 是不可靠的,因为使用 UDP 不能保证数据报都能正确地到达目的地,UDP 发现错误之后可以选择丢弃,也可以选择向应用层报告错误。但是关键还是要由用户自己来选择,如果用户选择了 TCP(如 FTP 软件),自然传输层就是可靠的。但是,如果用户使用了 UDP(如 QQ 软件、视频会议软件等),传输层就不可靠。所以说传输层是否可靠与传输层使用的协议有很大关系,但是一般默认传输层是可靠的

传输层的功能

在这里插入图片描述

  • 提供应用进程间的逻辑通信(网络层提供主机之间的逻辑通信)。“逻辑通信”的意思是传输层之间的通信好像是沿图 5-2 所示的水平方向传送数据,但事实上这两个传输层之间并没有一条水平方向的物理连接
  • 差错检测:对收到报文的首部和数据部分都进行差错检测(网络层只检查 IP 数据报首部,并不检查数据部分)。
  • 提供无连接或面向连接的服务。根据应用的不同,如有些数据传输要求实时性(如实时视频会议),传输层需要有两种不同的传输协议,即面向连接的TCP 和无连接的 UDP。TCP 提供了一种可靠性较高的传输服务,UDP则提供了一种高效率的但不可靠的传输服务
  • 复用和分用:复用是指发送方不同的应用进程都可以使用同一个传输层协议传送数据分用是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程

面向连接的服务还有以下两个功能

  • 连接管理:通常把连接的定义和建立的过程称为握手。例如,TCP的“三次握手”机制。
  • 流量控制与拥塞控制:以对方和网络普遍接受的速度发送数据,从而防止网络拥塞造成数据的丢失。

在传输层应根据什么原则来确定使用面向连接服务还是无连接服务?

需要根据上层应用程序的性质来区分。例如,在传送文件时要使用文件传送协议 (FTP),而文件的传送必须是可靠的,不能有错误或者丢失,因此在传输层就必须使用面向连接的 TCP。但是若应用程序是要传送分组话音或视频点播信息,那么为了保证信息传输的实时性,传输层就必须使用无连接的 UDP

应用进程看见的好像在两个传输层实体之间有一条端到端的逻辑通信信道,怎么理解?

在这里插入图片描述

TCP是面向连接的,但TCP 使用的IP却是无连接的。这两种协议都有哪些主要的区别?

在这里插入图片描述

TCP 是面向连接的,但TCP所使用的网络可以是面向连接的(如X.25网络,已经淘汰,在此仅作为例子,不用了解)也可以是无连接的(如现在大量使用的IP 网络)。选择无连接网络使得整个系统非常灵活,当然也带来了一些问题。

显然,TCP所提供的功能和服务要比 IP 所能提供的功能和服务多得多。这是因为 TCP使用了诸如确认、滑动窗口、计时器等机制,因而可以检测出有差错的报文、重复的报文和失序的报文。

5.1.2 传输层寻址与端口

端口的基本概念

前面讲过数据链路层按 MAC 地址寻址,网络层按IP 地址寻址,而传输层是按端口号寻址的

端口(软件端口)就是传输层服务访问点,端口能够让应用层的各种应用进程将其数据通过端口向下交付给传输层以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层的相应进程。从这个意义上讲,端口就是用来标识应用层的进程。换句通俗的话,端口就类似于寝室号,而寝室里面住着应用进程。

端口号

由于同一时刻一台主机上会有大量的网络应用进程在运行,所以需要有大量的端口号来标识不同的进程。

端口用一个16位端口号进行标识,共允许有 216=65536个端口号。端口号只具有本地意义,即端口号只是为了标识本计算机应用层中的各进程。例如,主机A的8080号端口和主机B的8080号端口是没有任何联系的。

根据端口号范围可将端口分为3类:

  • 熟知端口(保留端口):数值一般为 0~1023。当一种新的应用程序出现时,必须为它指派一个熟知端口,以便其他应用进程和其交互。

在这里插入图片描述

  • 登记端口:数值为1024~49151。它是为没有熟知端口号的应用程序使用的,使用这类端口号必须在IANA 登记,以防止重复。

  • 客户端端口或短暂端口:数值为49152~65535。由于这类端口号仅在客户进程运行时才动态选择,所以称为短暂端口或临时端口。通信结束后,此端口就自动空闲出来,以供其他客户进程使用。

  • 套接字:一台拥有IP 地址的主机可以提供许多服务,如 Web 服务、FTP 服务、SMTP 服务等,这些服务完全可以通过一个 IP 地址来实现。只有通过 IP 地址和端口号才能唯一确定一个连接的端口,称为套接字

    套接字=(主机IP地址,端口号)。它唯一地标识了网络中的某台主机上的某个应用进程

5.1.3 无连接服务与面向连接服务

传输层提供了两种类型的服务: 无连接服务和面向连接服务,相应的实现分别是用户数据报协议(UDP)和传输控制协议 (TCP)

当采用 TCP 时,传输层向上提供的是一条全双工的可靠的逻辑信道;

当采用UDP 时,传输层向上提供的是一条不可靠的逻辑信道

UDP的主要特点

  • 传送数据前无须建立连接,数据到达后也无须确认。
  • 不可靠交付。
  • 报文头部短,传输开销小,时延较短。

TCP的主要特点

  • 面向连接,不提供广播或多播服务
  • 可靠交付。
  • 报文段头部长,传输开销大。

在网络传输层,TCP模块中有一个TCB(传输控制模块Transmit ControlBlock),它用于记录TCP运行过程中的变量对于有多个连接的TCP,每个连接都有一个TCB。TCB结构的定义包括这个连接使用的源端口、目的端口、目的IP、序号、应答序号、对方窗口大小、自己窗口大小、TCP 状态等

5.2 UDP

5.2.1 UDP数据报

UDP的基本概念

UDP和TCP 最大的区别在于它是无连接的,UDP 其实只在 IP 的数据报服务之上增加了端口的功能(为了找到进程)和差错检测的功能

优点:

  • 发送数据之前不需要建立连接。
  • UDP的主机不需要维持复杂的连接状态表。
  • UDP用户数据报只有8个字节的首部开销。
  • 网络出现的拥塞不会使源主机的发送速率降低(没有拥塞控制)。这对某些实时应用(如IP 电话、实时视频会议) 是很重要的。
  • UDP 支持一对一、一对多、多对一和多对多的交互通信

UDP数据报的组成

UDP 数据报有两个字段:数据字段和首部字段。首部字段有 8B,由4 个字段组成

在这里插入图片描述

  • 源端口:占2B。前面已经说了使用 16bit 来表示端口号,所以需要 2B 长度。
  • 目的端口:占2B。
  • 长度:占2B。
  • 校验和:占2B,用来测 UDP 用户数据报在传输中是否有错(既验首部,又检验数据部分),如果有错,就直接丢弃。若该字段为可选字段,当源主机不想计算校验和时,则直接令该字段为全0。检验范围:伪首部、UDP 数据报的首部和数据。其中,在计算校验和时临时生成伪首部。

5.2.2 UDP校验

UDP校验只提供差错检测。在计算校验和时,要在UDP 用户数据报之前临时加上 12B 的伪首部

伪首部包括源 IP 地址字段、目的 IP 地址字段、全0字段、协议字段(UDP 固定为17)、UDP长度字段(图5-5 设用户数据的度是15B)一定要记住首部只用于计算和验证校验和,其既不向下传送,也不向上递交

在这里插入图片描述

  • 校验时UDP数据报数据部分的长度不是偶数字节,则需要填入一个全0字节。
  • 如果 UDP 校验和校验出 UDP 数据报是错误的,可以丢弃,也可以交付给上层,但是需要附上错误报告,即告诉上层这是错误的数据报。
  • 通过伪首部,不仅可以检查源端口号、目的端口号和UDP 用户数据报的数据部分,还可以检查IP数据报的源IP 地址和目的地址。

按二进制反码计算后,当无差错时其结果应该为全 1;否则就表明有差错出现,接收方就应该丢弃这个UDP 报文

两个数的二进制反码求和运算规则如下:

  • 从低位到高位逐列进行运算。
  • 0+0-0,0+1=1,1+1=0(进位1加到下一列)。
  • 如果最高位相加产生进位,则需要对最后的结果加1。

5.3 TCP

5.3.1 TCP报文段

在这里插入图片描述

  • 源端口和目的端口:各占2B。与UDP 一样TCP 的首部当然也有源端口和目的端口。
  • 序号:占4B。尽管从应用层交付来的是TCP 报文段是TCP 是面字节流的(就是说TCP传送时是按照一个个字节来传送的),所以在一个TCP 连接中传送的字节流需要编号,这样才能保证按序交付。
  • 确认号:占4B。TCP 是含有确认机制的,所以接收需要给发送发送确认号,这个确认号只需记住一点:若确认号等于 N,则表明到序号 N-1 为止的所有数据都已经正确收到
  • 数据偏移:占4位。这里的数据偏不是数据中分片的那个数据偏移,而是表示首部长度,千万不要混淆。占4位可表示001~1111 共15 种状态,而基本单位是4B,所以数据偏移确定了首部最长为 60B。
  • 保留字段:占6位。保留为今后使用,但目前应置为 0,该字段可以忽略不计。
  • 紧急 URG:当 URG=1 时,明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。就好像有一个等待红灯的超长车队,此时有一辆救护车过来,属于紧急事件,救护车就可以不用等红灯了,直接从边上绕过所有的车。但是紧急 URG 需要和紧急指针配套使用,比如说有很多救护车过来,现在就需要一个紧急指针指向最后一辆救护车,一旦最后一辆救护车过去之后,TCP 就告诉应用程序恢复到正常操作也就是说数据从第一字节到紧急指针所指字节就是紧急数据。
  • 确认比特ACK:只有当ACK=1 时,确认号字段才有效;当ACK=0 时,确认号无效TCP规定一旦连接建立了,所有传送的报文段都必须把ACK 置1
  • 推送比特 PSH:TCP收到推送比特置1的报文段,就尽快的交付给接收应用进程,而不再等到整个缓存都填满后再向上交付
  • 复位比特RST:当RST=1时,表明TCP连接中出现严重错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接
  • 同步比特SYN:同步比特 SYN 置为1,表示这是一个连接请求或连接接收报文
  • 终止比特 FIN:释放一个连接。当 FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放传输连接
  • 窗口字段:占2B。窗口字段用来控制对方发送的数据量,单位为字节(B)。记住一句话:窗口字段明确指出了现在允许对方发送的数据量。例如,设确认号是 701,窗口字段是1000。这就表明,从701 号开始算起,发送此报文段的一方还有接收 1000B 数据的接收缓存空间。
  • 校验和字段:占2B。校验和字段检验的范围包括首部和数据两部分。在计算校验和时,和UDP一样,要在TCP 报文段的前面加上12B 的伪首部(只需将UDP 伪首部的第4个字段的17改为6,其他和UDP 一样)。
  • 紧急指针字段:占2B。
  • 选项字段:长度可变。TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS 字节。”
  • 填充字段:为了使整个首部长度是 4B 的整数倍

5.3.2 TCP连接管理

TCP 的传输连接分为3个阶段:连接建立、数据传送和连接释放TCP 传输连接的管理就是使传输连接的建立和释放都能正常地进行

TCP把连接作为最基本的抽象,每一条TCP连接有两个端点,TCP 连接的端点不是主机不是主机的IP 地址,不是应用进程,也不是传输层的协议端口。TCP 连接的端点叫作套接字(Socket)或插口端口号拼接到IP 地址即构成了套接字

每一条 TCP 连接唯一地被通信两端的两个端点(两个套接字)所确定。例如,TCP 连接::={socket1,socket2}={(IP1:port1),(IP1:port2)}。

TCP的连接和建立都是采用客户/服务器方式(C/S)。主动发起连接建立的应用进程叫作客户(Client),被动等待连接建立的应用进程叫作服务器(Server)

TCP传输连接的建立采用“三次握手”的方法

在这里插入图片描述

  • 客户机A的TCP 向服务器 B 发出连接请求报文段,其首部中的同步位 SYN=1(TCP规定,SYN报文段不能携带数据,但要消耗一个序号),并选择序号 seq=x,表明传送数据时的第一个数据字节的序号是 X
  • 服务器收到了数据报,并从SYN位为1知道这是一个建立连接的请求。如果同意,则发回确认。B 在确认报文段中应使 SYN=1,ACK=1,其确认号ack=x+1,自己选择的序号seq=y。注意,此时该报文段也不能携带数据(助记:因为有SYN=1,所以不能带数据)。
  • A收到此报文段后向 B 给出确认,其ACK=1,确认号 ack=y+1。A的TCP 通知上层应用进程,连接已经建立。B 的 TCP 收到主机A的确认后,也通知其上层应用进程,此时 TCP 连接已经建立,ACK 报文可以携带数据(没有 SYN字段),如果不携带数据则不消耗序号。

采用“三次握手”的方法,目的是为了防止报文段在传输连接建立过程中出现差错通过3次报文段的交互后,通信双方的进程之间就建立了一条传输连接,然后就可以用全双工的方式在该传输连接上正常地传输数据报文段了

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

TCP释放连接的过程:

  • 数据传输结束后,通信双方都可释放连接。现在A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。A 将连接释放报文段首部的 FIN置1,其序号 seq=u,等待 B 的确认。这里要注意,因为 TCP 是双工的,也就是说,可以想象一对 TCP 连接上有两条数据通路。当发送 FIN 报文时,发送FIN 的一端就不能发送数据,也就是关闭了其中一条数据通路,但是对方还是可以发送数据的

    在这里插入图片描述

  • B 发出确认,确认号ack=u+1,而这个报文段自己的序号 seg=v。TCP 服务器进程通知高层应用进程。从A到B 这个方向的连接就释放了,TCP连接处于半关闭状态。B 若发送数据,则A 仍要接收

在这里插入图片描述

  • 若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接

在这里插入图片描述

  • A 收到连接释放报文段后,必须发出确认。在确认报文段中,ACK=1,确认号 ack=w+1,自己的序号 seq=u+1。

在这里插入图片描述

TCP连接必须经过时间2MSL后才真正释放

在这里插入图片描述

总结:

  • 连接建立
    • SYN=1,seq=x。
    • SYN=1,ACK=1,seq=y,ack=x+1。
    • ACK=1,seq=x+1,ack=y+1。
  • 连接释放
    • FIN=1,seq=u。
    • ACK=1,seq=v,ack=u+1。
    • FIN=1,ACK=1,seq=w,ack=u+1。
    • ACK=1,seq=u+1,ack=w+1。

必须使得迟到的TCP 报文段的序号不处在新的连接所使用的序号范围之中这样,TCP在建立新的连接时所选择的初始序号一定要和前面的一些连接所使用过的序号不一样。因此,不同的 TCP 连接不能使用相同的初始序号

5.3.3 TCP可靠传输

TCP数据编号与确认

TCP 是面向字节的。TCP将所要传送的报文看成是字节组成的数据流,并使每一个字节对应于一个序号。在连接建立时,双方要商定初始序号。TCP 每次发送的报文段的首部中的序号字段数值表示该报文段中的数据部分的第一个字节的序号。

TCP 的确认是对接收到的数据的最高序号表示确认。接收端返回的确认号是已收到的数据的最高序号加 1。因此,确认号表示接收端期望下次收到的数据中的第一个数据字节的序号

TCP的重传机制

TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到了规定时间还没有收到确认,那么就要重传该报文段

TCP的一种自适应算法

  • 记录每个报文段发出的时间以及收到相应的确认报文段的时间。这两个时间之差就是报文段的往返时延

  • 将各个报文段的往返时延样本加权平均,就得出报文段的平均往返时延(RTT)

  • 每测量到一个新的往返时延样本,就按下式重新计算一次平均往返时延。

    RTT=(1-α)×(旧的 RTT)+α×(新的往返时延样本)

在上式中,0≤α<1。若 α 很接近于 1,表示新算出的平均往返时延 RTT 和原来的值相比变化较大,即 RTT 的值更新较快若选择 α 接近于0则表示加权计算的 RTT 受新的往返时延样本的影响不大,即 RTT 的值更新较慢一般推荐 α 取0.125

计时器的超时重传时间(RTO)应略大于上面得出的 RTT,即

RTO=β×RTT(β>1)

Karn算法:报文段每重传一次,就把RTO增大一些。

新的 RTO=γ×(旧的RTO),γ系数的典型值是2。当不再发生报文段的重传时,才根据报文段的往返时延更新加权 RTT和 RTO的数值。

TCP可靠机制的体现

  • 每个IP 数据报独立地选择路由,因此在到达目的主机时有可能出现失序。
  • 由于路由选择的计算出现错误,导致 IP 数据报在联网中转圈。最后数据报首部中的生存时间 TTL的数值下降到零,这个数据报在中途就被丢弃了。
  • 在某个路由器突然出现很大的通信量,以致路由器来不及处理到达的数据报,因此有的数据报被丢弃。

5.3.4 TCP流量控制

一般来说,人们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。

流量控制 (Flow Control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。利用滑动窗口机制可以很方便地在TCP连接上实现流量控制。

在这里插入图片描述

  • TCP为每一个连接设有一个持续计时器。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1B 的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。若窗口仍然是零则收到这个报文段的一方就重新设置持续计时器。若窗口不是零,则死锁的僵局就可以打破。
  • 可以用不同的机制来控制TCP报文段的发送时机。
    • TCP维持一个变量,它等于最大报文段长度(MSS)。只要缓存中存放的数据达到MSS字节时,就组装成一个TCP报文段发送出去
    • 由发送方的应用进程指明要求发送报文段,即TCP支持的推送(push)操作(前面将其和紧急指针做过比较,这里不再解释)。
    • 发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去

5.3.5 TCP拥塞控制的基本概念

在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞。

出现资源拥塞的条件是:对资源需求的总和>可用资源

若网络中产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随着输入负荷的增大而下降。

拥塞控制与流量控制的性质对比

  • 拥塞控制所要做的只有一个目的,就是使得网络能够承受现有的网络负荷
  • 拥塞控制是一个全局性的过程,涉及所有的主机、所有的路由器以及与降低网络传输性能有关的所有因素
  • 流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制。
  • 流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收
  • 拥塞控制是很难设计的,因为它是一个动态的(而不是静态的)问题。
  • 当前网络正朝着高速化的方向发展,这很容易出现缓存不够大而造成分组的丢失。但分组的丢失是网络发生拥塞的征兆而不是原因
  • 在许多情况下,正是拥塞控制本身成为引起网络性能恶化甚至发生死锁的原因,这点应特别引起重视。

拥塞控制又分为闭环控制和开环控制

  • 开环控制方法就是在设计网络时事先将有关发生拥塞的因素考虑周到,力求网络在工作时不产生拥塞
  • 闭环控制是基于反馈环路的概念。属于闭环控制的有以下几种措施:
    • 监测网络系统以便检测到拥塞在何时、何处发生。
    • 将拥塞发生的信息传送到可采取行动的地方。
    • 调整网络系统的运行以解决出现的问题。

5.3.6 拥塞控制的4种算法

发送端的主机在确定发送报文段的速率时,既要根据接收端的接收能力,又要从全局考虑不要使网络发生拥塞。

TCP 要求发送端维护以下两个窗口:

  • 接收端窗口 rwnd:接收端根据其目前接收缓存大小所许诺的最新的窗口值,反映了接收端的容量。由接收端将其放在 TCP 报文的首部的窗口字段通知发送端。
  • 拥塞窗口cwnd:发送端根据自己估计的网络拥塞程度而设置的窗口值,反映了网络的当前容量

发送端发送窗口的上限值应当取接收端窗口rwnd和拥塞窗口cwnd这两个变量中较小的一个,rwnd和cwnd 中较小的一个控制发送方发送数据的速率。

发送窗口的上限值=Min[rwnd,cwnd]

在这里插入图片描述

接收窗口的大小可以根据 TCP 报文首部的窗口字段通知发送端,而发送端怎么去维护拥塞窗口呢?

慢开始算法的原理

  • 在主机刚刚开始发送报文段时可先设置拥塞窗口 cwnd=1,即设置为一个最大报文段长度MSS 的数值。
  • 在每收到一个对新的报文段的确认后,将拥塞窗口加1,即增加一个MSS 的数值。
  • 用这样的方法逐步增大发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理

使用慢开始算法后,每经过一个传输轮次,拥塞窗口cwnd就加倍,即cwnd的大小呈指数形式增长。这样慢开始一直把拥塞窗口 cwnd 增大到一个规定的慢开始门限ssthresh(阙值),然后改用拥塞避免算法(一个传输轮次所经历的时间其实就是往返时间RTT。例如,拥塞窗口cwnd=4,这时的往返时间RTT就是发送方连续发送4个报文段并收到这4个报文段的确认总共经历的时间)。

拥塞避免算法的原理

为防止拥塞窗口cwnd 的增长引起网络阻塞,还需要一个状态变量,即慢开始门限ssthresh。

当 cwnd<ssthresh 时,使用慢开始算法。
当cwnd>ssthresh时,停止使用慢开始算法,改用拥塞避免算法。
当cwnd=ssthresh 时,既可以使用慢开始算法,也可以使用拥塞避免算法

拥塞避免算法的做法是:发送端的拥塞窗口 cwnd 每经过一个往返时延 RTT 就增加一个MSS的大小,通常表现为按线性规律增长

无论在慢开始阶段,还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要把慢开始门限 ssthresh 设置为出现拥塞时的发送窗口值的一半(但不能小于 2),然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕

  • 当TCP 连接进行初始化时,将拥塞窗口设置为1,如图5-16 所示。图中的窗口单位不使用字节而使用报文段。慢开始门限的初始值设置为 16 个报文段,即 ssthresh=16发送端的发送窗口不能超过拥塞窗口cwnd 和接收端窗口rwnd中的最小值假定接收端窗口足够大。因此现在发送窗口的数值等于拥塞窗口的数值

在这里插入图片描述

  • 在执行慢开始算法时,拥塞窗口 cwnd 的初始值为 1,发送第一个报文段M0

在这里插入图片描述

  • 发送端每收到一个确认,就把 cwnd 加1,于是发送端可以接着发送M1和M2两个报文段。

    在这里插入图片描述

  • 接收端共发回两个确认。发送端每收到一个对新报文段的确认,就把发送端的 cwnd加1。现在 cwnd从2增大到4,并可接着发送后面的4个报文段

    在这里插入图片描述

  • 发送端每收到一个对新报文段的确认,就把发送端的拥塞窗口加1,因此拥塞窗口cwnd 随着传输轮次按指数规律增长。

在这里插入图片描述

  • 当拥塞窗口cwnd 增长到开始门限值 ssthresh 时(当cwnd=16 时),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。

    在这里插入图片描述

  • 假定拥塞窗口的数值增长到24 时,网络出现超时,表明网络拥塞了。

在这里插入图片描述

  • 更新后的 ssthresh 值变为 12(发送窗口数值24 的一半),拥塞窗口重新设置为1,并执行慢开始算法。

在这里插入图片描述

  • 当 cwnd=12 时改为执行拥塞避免算法,拥塞窗口按线性规律增长,每经过一个往返时延就增加一个MSS的大小。

在这里插入图片描述

总结:

  • 乘法减小。它是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(出现一次网络拥塞),就把慢开始门限值 ssthresh 设置为当前的拥塞窗口值的一半。当网络频繁出现拥塞时,ssthresh 值会下降得很快,以减少注入到网络中的分组数。
  • 加法增大。它是指执行拥塞避免算法时,在收到对所有报文段的确认后(经过一个往返时间),就把拥塞窗口 cwnd 增加一个 MSS 大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。
  • 拥塞避免并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。拥塞避免是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞

在这里插入图片描述

快重传算法

首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。发送方只要连续收到3个重复确认就应当立即重传对方尚未收到的报文段。
在这里插入图片描述

快恢复算法

  • 当发送端收到连续3个的重复的确认帧时,就执行“乘法减小”算法,把慢开始门限ssthresh设置为当前拥塞窗口的一半。但接下去不执行慢开始算法。

  • 由于发送方现在认为网络很可能没有发生拥,所以现在不执行慢开始算法,即拥塞窗口 cwnd 现在不设置为1,而是将慢开始门限 ssthresh 设置为当前拥塞窗口的一半,然后开始执行拥塞避免算法(“加法增大”),使得拥塞窗口缓慢的线性增大。

在这里插入图片描述

快恢复算法具体如下:

  • 当发送端收到连续3个重复的ACK 时,就重新设置慢开始门限 ssthresh(拥塞窗口的一半)。
  • 与开始的不同之处是拥塞窗口 cwnd 不是设置为1,而是设置为新的ssthresh。
  • 若发送窗口值还允许发送报文段,就按拥塞避免算法继续发送报文段。

猜你喜欢

转载自blog.csdn.net/pipihan21/article/details/129572306