计算机网络第五章 传输层
计算机学科基础:计算机网络第五章的学习笔记
一.传输层提供的服务(✠)
1.传输层的功能(✠)
传输层的概述
- 从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,
它属于面向通信部分的最高层,同时也是用户功能中的最低层 - 在通信子网中没有传输层,传输层只存在于通信子网以外的主机中
- 传输层向高层用户屏蔽了低层网络核心的细节(如网络拓扑、路由协议等),
它使应用进程看见的是在两个传输层实体之间好像有一条端到端的逻辑通信信道,这条逻辑通信信道对上层的表现却因传输层协议不同而有很大的差别。 - 当传输层采用面向连接的TCP时,尽管下面的网络是不可靠的(只提供尽最大努力的服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。
但当传输层采用无连接的UDP时,这种逻辑通信信道仍然是一条不可靠信道。
- 从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,
传输层的功能
- 传输层位于网络层之上,它为运行在不同主机上的进程之间提供了逻辑通信,而网络层提供主机之间的逻辑通信。
- 逻辑通信”的意思是:传输层之间的通信好像是沿水平方向传送数据,
但事实上这两个传输层之间并没有一条水平方向的物理连接
- 逻辑通信”的意思是:传输层之间的通信好像是沿水平方向传送数据,
- 复用和分用
- 复用是指发送方不同的应用进程都可使用同一个传输层协议传送数据
- 分用是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程。
- 注意:网络层也有复用分用的功能,但网络层的复用是指发送方不同协议的数据都可以封装成IP数据报发送出去,
分用是指接收方的网络层在剥去首部后把数据交付给相应的协议。
- 传输层还要对收到的报文进行差错检测(首部和数据部分)
- 而网络层只检查IP数据报的首部,不检验数据部分是否出错
- 提供两种不同的传输协议,即面向连接的TCP和无连接的UDP。
- 而网络层无法同时实现两种协议(即在网络层要么只提供面向连接的服务,如虚电路,要么只提供无连接服务,如数据报,而不可能在网络层同时存在这两种方式)
- 传输层位于网络层之上,它为运行在不同主机上的进程之间提供了逻辑通信,而网络层提供主机之间的逻辑通信。
2.传输层的寻址与端口(✪)
- 端口的作用
- 端口能够让应用层的各种应用进程将其数据通过端口向下交付给传输层,
以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程。 - 端口是传输层服务访问点(TSAP),它在传输层的作用类似于IP地址在网络层的作用或MAC地址在数据链路层的作用,
只不过IP地址和MAC地址标识的是主机,而端口标识的是主机中的应用进程。- 数据链路层的SAP是MAC地址,网络层的SAP是IP地址,传输层的SAP是端口。
- 在协议栈层间的抽象的协议端口是软件端口,它与路由器或交换机上的硬件端口是完全不同的概念。
- 硬件端口是不同硬件设备进行交互的接口,
- 而软件端口是应用层的各种协议进程与传输实体进行层间交互的一种地址。传输层使用的是软件端口。
- 端口能够让应用层的各种应用进程将其数据通过端口向下交付给传输层,
- 端口号
- 应用进程通过端口号进行标识,端口号长度为16bit,能够表示65536($2^{16}$)个不同的端口号。
- 端口号只具有本地意义,即端口号只标识本计算机应用层中的各进程,
在因特网中不同计算机的相同端口号是没有联系的。 - 端口号的分类(根据范围)
- 服务器端使用的端口号(0~49151)
- 熟知端口号,数值为0~1023
- IANA(互联网地址指派机构)把这些端口号指派给了TCP/IP最重要的一些应用程序,让所有的用户都知道
- 登记端口号,数值为1024~49151
- 它是供没有熟知端口号的应用程序使用的,使用这类端口号必须在IANA登记,以防止重复。
- 熟知端口号,数值为0~1023
- 客户端使用的端口号,数值为49152~65535
- 由于这类端口号仅在客户进程运行时才动态地选择,因此又称短暂端口号(也称临时端口)
- 通信结束后,刚用过的客户端口号就不复存在,从而这个端口号就可供其他客户进程以后使用。
- 服务器端使用的端口号(0~49151)
- 套接字
- 在网络中通过IP地址来标识和区别不同的主机,通过端口号来标识和区分一台主机中的不同应用进程,
端口号拼接到IP地址即构成套接字Socket。 - 在网络中采用发送方和接收方的套接字来识别端点。套接字实际上是一个通信端点,套接字Socket=(IP地址:端口号)
它唯一地标识网络中的一台主机和其上的一个应用(进程)
- 在网络中通过IP地址来标识和区别不同的主机,通过端口号来标识和区分一台主机中的不同应用进程,
3.无连接服务与面向连接服务(✪)
- 面向连接服务与无连接服务
- 面向连接服务就是在通信双方进行通信之前,必须先建立连接,
在通信过程中,整个连接的情况一直被实时地监控和管理。通信结束后,应该释放这个连接 - 无连接服务是指两个实体之间的通信不需要先建立好连接,
需要通信时,直接将信息发送到“网络”中,让该信息的传递在网上尽力而为地往目的地传送。
- 面向连接服务就是在通信双方进行通信之前,必须先建立连接,
- TCP协议与UDP协议
- 面向连接的传输控制协议(TCP)
- TCP提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接
- 采用TCP时,传输层向上提供的是一条全双工的可靠逻辑信道
- TCP不提供广播或组播服务
- TCP增加了许多开销,如确认(可靠传输)、流量控制、计时器及连接管理等。
这不仅使协议数据单元的头部增大很多,还要占用许多的处理机资源。 - TCP主要适用于可靠性更重要的场合,如文件传输协议(FTP)、超文本传输协议(HTTP)、远程登录(TELNET)等。
- 无连接的用户数据报协议(UDP)
- UDP是一个无连接的非可靠传输层协议,采用UDP时,传输层向上提供的是一条不可靠的逻辑信道
- UDP在传送数据之前不需要先建立连接,远程主机的传输层收到UDP报文后,不需要给出任何确认。
- 它在IP之上仅提供两个附加服务:多路复用和对数据的错误检查
- 如果用户应用程序使用UDP进行数据传输,那么必须在传输层的上层即应用层提供可靠性方面的全部工作。
- 由于UDP比较简单,因此执行速度比较快、实时性好。
使用UDP的应用主要包括小文件传送协议(TFTP)、DNS、SNMP和实时传输协议(RTP)
- 例题
- 注:UDP首部有8B,TCP首部最少20B,此时选D
- 注:UDP首部有8B,TCP首部最少20B,此时选D
- 面向连接的传输控制协议(TCP)
- IP数据报和UDP数据报的区别
- IP数据报在网络层要经过路由的存储转发
- 而UDP数据报在传输层的端到端的逻辑信道中传输,封装成IP数据报在网络层传输时,
UDP数据报的信息对路由是不可见的
- TCP和网络层虚电路的区别
- TCP报文段在传输层抽象的逻辑信道中传输,对路由器不可见
- 虚电路所经过的交换结点都必须保存虚电路状态信息。在网络层若采用虚电路方式,则无法提供无连接服务
而传输层采用TCP不影响网络层提供无连接服务。
二.UDP协议
1.UDP数据报
- UDP概述
- UDP仅在IP的数据报服务之上增加了两个最基本的服务:复用和分用以及差错检测
- UDP不保证可靠交付,但这并不意味着应用对数据的要求是不可靠的,所有维护可靠性的工作可由用户在应用层来完成
应用开发者可根据应用的需求来灵活设计自己的可靠性机制 - UDP是面向报文的。发送方UDP对应用层交下来的报文,在添加首部后就向下交付给IP层,一次发送一个报文,
既不合并,也不拆分,而是保留这些报文的边界 - 接收方UDP对IP层交上来UDP数据报,在去除首部后就原封不动地交付给上层应用进程,一次交付一个完整的报文。
- 报文不可分割,是UDP数据报处理的最小单位
- 因此,应用程序必须选择合适大小的报文,若报文太长,UDP把它交给IP层后,可能会导致分片
- 若报文太短,UDP把它交给IP层后,会使IP数据报的首部的相对长度太大,两者都会降低IP层的效率。
- UDP的优点
- 无须建立连接:因此UDP不会引入建立连接的时延
- 无连接状态:UDP不维护连接状态,也不跟踪这些参数。
因此,某些专用应用服务器使用UDP时,一般都能支持更多的活动客户机 - 分组首部开销小:TCP有20B的首部开销,而UDP仅有8B的开销。
- 应用层能更好地控制要发送的数据和发送时间:UDP没有拥塞控制,因此网络中的拥塞不会影响主机的发送效率
某些实时应用要求以稳定的速度发送,能容忍一些数据的丢失,但不允许有较大的时延,而UDP正好满足这些应用的需 - UDP支持一对一、一对多、多对一和多对多的交互通信
- UDP的应用场景
- UDP常用于一次性传输较少数据的网络应用,如DNS、SNMP等,
因为对于这些应用,若采用TCP,则将为连接创建、维护和拆除带来不小的开销。 - UDP也常用于多媒体应用(如IP电话、实时视频会议、流媒体等),显然,可靠数据传输对这些应用来说并不是最重要的;
但TCP的拥塞控制会导致数据出现较大的延迟,这是它们不可容忍的。 - 适用于客户机/服务器领域,不适用于远程登录
- UDP常用于一次性传输较少数据的网络应用,如DNS、SNMP等,
- UDP数据报(UDP首部和用户数据)
- UDP首部(有8B,由4个字段组成,每个字段的长度都是2B)
- 源端口:源端口号。在需要对方回信时选用,不需要时可用全0
- 目的端口:目的端口号。这在终点交付报文时必须使用到,是实现分用服务的依据
- 长度:UDP数据报的长度(包括首部和数据),其最小值是8(仅有首部)
- 校验和:检测UDP数据报在传输中是否有错。有错就丢弃。
该字段是可选的,当源主机不想计算校验和时,则直接令该字段为全0
- 图片
- UDP数据报传输的流程(分用服务)
- 当传输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口上交给应用进程
- 如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于端口号的应用进程)
那么就丢弃该报文,并由ICMP发送“端口不可达”差错报文给发送方 - 图片
- UDP首部(有8B,由4个字段组成,每个字段的长度都是2B)
2.UDP校验
UDP的校验和功能不是必需的,可以不使用,若源主机不想计算校验和,则该校验和字段应为全0
伪首部的概念
在计算校验和时,要在UDP数据报之前增加12B的伪首部
伪首部并不是UDP的真正首部。只是在计算校验和时,临时添加在UDP数据报的前面,得到一个临时的UDP数据报。
校验和就是按照这个临时的UDP数据报来计算的伪首部既不向下传送又不向上递交,而只是为了计算校验和
- UDP校验和的计算方法和IP数据报首部校验和的计算方法相似,
但不同的是,IP数据报的校验和只检验IP数据报的首部,但UDP的校验和则检查首部和数据部分 - 图片
UDP校验和的过程(UDP校验和的计算方法是二进制反码运算求和再取反)
- 发送方首先把全零放入校验和字段并添加伪首部,然后把UDP数据报视为许多16位的字串接起来。
- 若UDP数据报的数据部分不是偶数个字节,则要在数据部分末尾填入一个全零字节(但此字节不发送)
- 如UDP数据报的长度是15B(不含伪首部),因此需要添加一个全0字节
- 然后按二进制反码计算出这些16位字的和,将此和的二进制反码写入校验和字段,去掉伪首部之后发送
- 例如:如果校验和的计算结果恰好为0,那么将校验和字段置为全1。
- 接收方把收到的UDP数据报加上伪首部(如果不为偶数个字节,那么还需要补上全零字节)后,
按二进制反码求这些16位字的和。 - 当无差错时其结果应为全1,否则就表明有差错出现,接收方就应该丢弃这个UDP数据报,
或向上交给应用层附上出差错的报告 - 图片
- 注意事项
- 校验时,若UDP数据报部分的长度不是偶数个字节,则需填入一个全0字节,但是此字节和伪首部一样,是不发送的
- 如果UDP校验和校验出UDP数据报是错误的,那么可以丢弃,
也可以交付给上层,但是需要附上错误报告,即告诉上层这是错误的数据报 - 通过伪首部,不仅可以检查源端口号、目的端口号和UDP用户数据报的数据部分,
还可以检查IP数据报的源IP地址和目的地址。
三.TCP协议(✪)
1.TCP协议的特点
- TCP是在不可靠的IP层之上实现的可靠的数据传输协议,它主要解决传输的可靠、有序、无丢失和不重复问题
- TCP协议的特点
- TCP是面向连接的传输层协议,TCP连接是一条逻辑连接(虚连接)
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点到点的(一对一)
- TCP提供可靠交付的服务,保证传送的数据无差错、不丢失、不重复且有序
- TCP提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据,
为此TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据- 发送缓存暂存的数据
- 发送应用程序传送给发送方TCP准备发送的数据
- TCP已发送但尚未收到确认的数据
- 接收缓存暂存的数据
- 按序到达但尚未被接收应用程序读取的数据
- 不按序到达的数据
- 发送缓存暂存的数据
- TCP是面向字节流的,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅视为一连串的无结构的字节流。
- TCP和UDP在发送报文时所采用的方式完全不同
- UDP报文的长度由发送应用进程决定
- TCP报文的长度则根据接收方给出的窗口值和当前网络拥塞程度来决定。
- 如果应用进程传送到TCP缓存的数据块太长,TCP就把它划分得短一些再传送
- 如果太短,TCP也可以等到积累足够多的字节后再构成报文段发送出去
2.TCP报文段
- TCP传送的数据单元称为报文段。TCP报文段既可以用来运载数据,又可以用来建立连接、释放连接和应答
- 一个TCP报文段分为首部和数据两部分,整个TCP报文段作为IP数据报的数据部分封装在IP数据报中
- 首部的前20B是固定的。TCP首部最短为20B,后面有4N字节是根据需要而增加的选项,长度为4B的整数倍;
加上可选字段后,TCP首部最大为60B - TCP报文字段
- 源端口和目的端口:各占2B
- 端口是传输层与应用层的服务接口,传输层的复用和分用功能都要通过端口实现
- 注:IP/UDP数据报和TCP报文都是源在前目的在后
只有MAC帧是目的在前源在后
- 注:IP/UDP数据报和TCP报文都是源在前目的在后
- 端口是传输层与应用层的服务接口,传输层的复用和分用功能都要通过端口实现
- 序号:占4B,范围为$0\sim 2^{32}-1$,共$2^{32}$个序号
- TCP是面向字节流的(即TCP传送时是逐个字节传送的),所以TCP连接传送的字节流中的每个字节都按顺序编号
- 序号字段的值指的是本报文段所发送的数据的第一个字节的序号
- 如:一报文段的序号字段值是301,而携带的数据共有100B,表明本报文段的数据的最后一个字节的序号是400
因此下一个报文段的数据序号应从401开始。
- 确认号:占4B
- 期望收到对方下一个报文段的第一个数据字节的序号
- 若确认号为N,则表明到序号N-1为止的所有数据都已正确收到
- 例:B正确收到了A发送过来的一个报文段,其序号字段是501,而数据长度是200B(序号501~700),
这表明B正确收到了A发送的到序号700为止的数据。因此B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701
- 数据偏移(即首部长度):占4位(bit)
- 指出TCP报文段的数据起始处距离TCP报文段的起始处有多远(因为TCP首部有可选选项)
- “数据偏移”的单位是4B,由于4位二进制数能表示的最大值为15,因此TCP首部的最大长度为60B
- 保留。占6位,保留为今后使用,但目前应置为0
- 6个控制位(每个一位,共占6位)
- 紧急位URG。当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,
应尽快传送(相当于高优先级的数据)。但URG需要和首部中紧急指针字段配合使用,
即数据从第一个字节到紧急指针所指字节就是紧急数据。(在发送缓存中可以插队) - 确认位ACK。仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。
TCP规定,在连接建立后所有传送的报文段都必须把ACK置1. - 推送位PSH(Push)。接收方TCP收到PSH=1的报文段,就尽快地交付给接收应用进程,
而不再等到整个缓存都填满了后再向上交付。 - 复位位RST(Reset)。当RST=1时,表明TCP连接中出现严重差错(如主机崩溃或其他原因),
必须释放连接,然后再重新建立运输连接。 - 同步位SYN。当SYN=1时表示这是一个连接请求或连接接受报文。
当SYN=1,ACK=0时,表明这是一个连接请求报文,对方若同意建立连接,则应在响应报文中使用SYN=1,ACK=1. - 终止位FIN(Finish)。用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
- 紧急位URG。当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,
- 窗口。占2B,范围为$0\sim2^{16}-1$
- 现在允许对方发送的数据量,是接收方让发送方设置其发送窗口的依据
- 若以发送方的窗口值来看,则表示发送端收到一个确认之前可以发送的字节数
- 例如,设确认号是701,窗口字段是1000。这表明,从701号算起,发送此报文段的一方还要接收1000字节数据(字节序号为701~1700)的接收缓存空间
- 例
- 常常使接收方没有接收到之前某个报文段的数据就发送了确认(接收窗口)来考察,此题还能发送的数据为接收窗口减已发送未收到数据=300,选C
- 常常使接收方没有接收到之前某个报文段的数据就发送了确认(接收窗口)来考察,此题还能发送的数据为接收窗口减已发送未收到数据=300,选C
- 校验和。占2B。
- 校验和字段检验的范围包括首部和数据两部分。在计算校验和时,和UDP一样,要在TCP报文段的前面加上12B的伪首部(只需将UDP伪首部的协议字段的17改成6,UDP长度字段改成TCP长度,其他的和UDP一样)。
- 紧急指针。占2B。
- 紧急指针仅在URG=1时才有意义,它指出在本报文段中紧急数据共有多少字节(紧急数据在报文段数据的最前面)
- 选项。长度可变。
- TCP最初只规定了一种选项,即最大报文段长度(Maximum Segment Size,MSS).MSS是TCP报文段中的数据字段的最大长度(注意仅仅是数据字段)。
- 填充。这是为了使整个首部长度是4B的整数倍。
- 源端口和目的端口:各占2B
- 图片
3.TCP连接管理(♚)
- TCP连接的端口即为套接字(Socket)或插口,每条TCP连接唯一地被通信的两个端点(即两个套接字)确定
- TCP连接的建立采用客户/服务器模式。主动发起连接建立的应用进程称为客户(Client)
而被动等待连接建立的应用进程称为服务器(Server)。 - TCP连接的建立(三次握手)
- 客户端发送请求连接报文段,此时无应用层数据
SYN=1,seq=x - 服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据
SYN=1,ACK=1,seq=y,ack=x+1 - 客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据。
ACK=1,seq=x+1,ack=y+1 - 图片
- 客户端发送请求连接报文段,此时无应用层数据
- TCP连接的释放(四次挥手)
- 客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。
FIN=1,seq=u - 服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了,此时为半关闭状态。
ACK=1,seq=v,ack=u+1 - 服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接
FIN=1,ACK=1,seq=w,ack=u+1 - 客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭
ACK=1,seq=u+1,ack=w+1(此时客户机的状态为TIME-WAIT) - 图片
- 客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。
- 例题
- 例1:总结:回复字段中的序号为上一个字段的ack;回复字段的ack为上一个字段的序号+数据载荷,如本题选B
- 例2:至少的时间时,此时服务器端的两次发送可以合并为一次,由图像可知,客户端时间为:RTT+2MSL;
服务器端时间为:1.5RTT。此题选D - 例3:甲与乙建立TCP连接时发送的SYN段中的序号为1000,则在数据传输阶段所用起始序号为1001,在断开连接时,甲发送给乙的FIN段中的序号为5001,在无任何重传的情况下,甲向乙已经发送的应用层数据的字节数为5001-1001=4000。
- 例1:总结:回复字段中的序号为上一个字段的ack;回复字段的ack为上一个字段的序号+数据载荷,如本题选B
4.TCP可靠传输
- TCP提供的可靠数据传输服务保证接收方进程从缓存区读出的字节流与发送方发出的字节流完全一样
TCP使用了校验、序号、确认和重传等机制来达到这一目的。其中,TCP的校验机制与UDP校验一样,只需要将17改为6 - 序号
- TCP首部的序号字段用来保证数据能有序提交给应用层,TCP把数据视为一个无结构但有序的字节流,
序号建立在传送的字节流之上,而不建立在报文段之上 - TCP连接传送的数据流中的每个字节都编上一个序号。序号字段的值是指本报文段所发送的数据的第一个字节的序号。
- TCP首部的序号字段用来保证数据能有序提交给应用层,TCP把数据视为一个无结构但有序的字节流,
- 确认
- TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。
发送方缓存区会继续存储那些已发送但未收到确认的报文段,以便在需要时重传 - TCP采用了对报文段确定的机制
- TCP默认使用累积确认,即TCP只确认数据流中至第一个丢失字节为止的字节。
- TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。
- 重传
- 超时重传
- TCP每发送一个报文段,就对这个报文段设置一次计时器。
计时器设置的重传时间到期但还未收到确认时,就要重传这一报文段 - TCP采用一种自适应算法,TCP保留了RTT的一个加权平均往返时间RTTs
它会随新测量RTT样本值的变化而变化 - 超时计时器设置的超时重传时间(RTO)应略大于RTTs,但也不能大太多,否则当报文段丢失时,TCP不能很快重传,导致数据传输时延大。
- TCP每发送一个报文段,就对这个报文段设置一次计时器。
- 快速重传
- 每当比期望序号大的失序报文段到达时接收方时,发送一个冗余ACK给发送方(丢失报文之前正确接收到的报文的ACK)
- 当发送方收到三个这样的ACK后,立即重传之前丢失的报文,即为快速重传
- 例
- 本题选C
- 本题选C
- 超时重传
5.TCP流量控制(♚)
TCP提供流量控制服务来消除发送方由于发送速率太快使接收方缓存区溢出的可能性
TCP提供一种基于滑动窗口协议的流量控制机制,发送方发送数据的量由接收方决定在流量控制中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口rwnd
即调整TCP报文段首部中的“窗口”字段值,来限制发送方向网络注入报文的速率- 发送方根据其对当前网络拥塞程度的估计而确定的窗口值,这称为拥塞窗口cwnd,其大小与网络的带宽和时延密切相关
TCP流量控制的过程
- 接收方设置确认报文段首部的窗口字段来将rwnd通知给发送方,rwnd即接收方允许连续接收的最大能力,单位是字节。
- 发送方总是根据最新收到的rwmd值来限制自己发送窗口的大小,从而将未确认的数据量控制在rwnd大小之内
保证不会使接收方的接收缓存溢出。 - 发送方的发送窗口的实际大小取rwnd和cwmd中的最小值
- 示例
- 传输层和数据链路层的流量控制的区别
- 传输层定义端到端用户之间的流量控制,数据链路层定义两个中间的相邻结点的流量控制
- 数据链路层的滑动窗口协议的窗口大小不能动态变化,传输层的则可以动态变化
6.TCP拥塞控制(♚)
拥塞控制的概念
- 拥塞控制是指防止过多的数据注入网络,保证网络中的路由器或链路不致过载
- 在拥塞控制中,由发送方自己通过检测网络状况来决定发送数据的量
- 发送方的发送窗口的实际大小取rwnd和cwmd中的最小值
- 拥塞的定义
- 当对资源需求的总和>可用资源时,会出现拥塞
- 出现拥塞时,端点并不了解拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为通信时延的增加。
- 此时网络中有许多资源同时呈现供应不足→网络性能变坏→网络吞吐量将随输入负荷增大而下降
- 拥塞控制与流量控制的区别
- 拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,
涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。 - 流量控制往往是指点对点的通信量的控制,是个端到端的问题(接收端控制发送端),
它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收。 - 拥塞控制和流量控制都通过控制发送方发送数据的速率来达到控制效果
- 拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,
TCP协议的窗口
- 接收窗口:接收方根据接受缓存设置的窗口值,并告知给发送方,反映接收方容量
- 拥塞窗口:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量
- 发送窗口的上限取决于接收窗口和拥塞窗口中最小的那个
- 注意区分接收缓存与接收窗口(接收缓存>=接收窗口,接收窗口=接收缓存-在缓存中的数据)
- 例:发送窗口的上限值=min{接收窗口,拥塞窗口}。4个RTT后,乙收到的数据全部存入缓存,不被取走,
此时接收窗口只剩下1KB(16-1-2-4-8=1)的空间,虽然拥塞窗口此时为16,但是发送窗口是取其中较小的值(接收窗口1KB)选A
- 例:发送窗口的上限值=min{接收窗口,拥塞窗口}。4个RTT后,乙收到的数据全部存入缓存,不被取走,
拥塞控制的4种算法(计算某时刻的拥塞窗口大小)
慢开始和拥塞避免算法
- 慢开始和拥塞避免算法的概念
- 慢开始算法
- 在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段,
目的是试探一下网络的拥塞情况(初始值由最大段长MSS决定) - 之后每经过一个传输轮次(即往返时延RTT),cwnd就会加倍,即cwnd的值随传输轮次指数规律增长。
- 慢开始一直把cwnd增大到一个规定的慢开始门限ssthresh(阈值),然后改用拥塞避免算法
- 在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段,
- 拥塞避免算法
- 拥塞避免算法的思路是让拥塞窗口cwmd缓慢增大,每经过一个往返时延RTT就把发送方的拥塞窗口cwmd加1,
而不是加倍,使拥塞窗口cwmd按线性规律缓慢增长(即加法增大) - 根据cwnd的大小执行不同的算法,可归纳如下
- 当cwnd<ssthresh时,使用慢开始算法
- 当cwmd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法。
- 当cwnd=ssthresh时,既可使用慢开始算法,又可使用拥塞避免算法
- 拥塞避免算法的思路是让拥塞窗口cwmd缓慢增大,每经过一个往返时延RTT就把发送方的拥塞窗口cwmd加1,
- 乘法减少和加法增加
- 乘法减小
- 不论是在慢开始阶段还是在拥塞避免阶段,只要出现超时(即很可能出现了网络拥塞),
就把慢开始门限值ssthresh设置为当前拥塞窗口的一半(并执行慢开始算法) - 当网络频繁出现拥塞时,ssthresh值就下降得很快,以大大减少注入网络的分组数。
- 不论是在慢开始阶段还是在拥塞避免阶段,只要出现超时(即很可能出现了网络拥塞),
- 加法增加
- 执行拥塞避免算法后,在收到对所有报文段的确认后(即经过一个RTT),就把拥塞窗口cwd增加一个MSS大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞
- 乘法减小
- 慢开始算法
- 慢开始和拥塞避免算法的执行过程
- 初始时,拥塞窗口设置为1,即cwnd=1,慢开始门限置为16,即ssthresh=16
(初始值由最大段长MSS决定,一般为1) - 慢开始阶段,cwnd的初值为1,以后发送方每收到一个确认ACK,cwnd值加1,
也即经过每个传输轮次(RTT),cwnd呈指数规律增长(第一次RTT后为2,第二次RTT后为4) - 注意区分第n次传输时与第n个RTT之后(第n个RTT内发送的都得到应答)的拥塞窗口大小的区别
- 当拥塞窗口cwnd增长到慢开始门限ssthresh时(即当cwnd=l6时),就改用拥塞避免算法,cwmd按线性规律增长(16,17,18……)
- 在慢开始(指数级增长)阶段,若2cwnd>ssthresh,则下一个RTT后的cwmd等于ssthresh,而不等于2cwnd
即cwmd不能跃过ssthresh值。 - 如在第16个轮次时cwmd=8、ssthresh=12,则在第17个轮次时cwnd=12,而不等于16。
- 在慢开始(指数级增长)阶段,若2cwnd>ssthresh,则下一个RTT后的cwmd等于ssthresh,而不等于2cwnd
- 假定cwmd=24时网络出现超时,更新ssthresh值为I2(即变为超时时cwnd值的一半),cwnd重置为1,并执行慢开始算法,当cwmd=I2时,改为执行拥塞避免算法,待增加到超时时又重新慢开始
- 图片(掌握过程)(注:MSS的值决定了初始的拥塞窗口大小的值,如果为2则为:2/4/8……)
- 例题
- 例1:注意:此时问的是第13次传输时拥塞窗口的大小,即为第13个次序时窗口的值,如果问的是第13次RTT后窗口的值,那么此时的值为第14个次序时窗口的值(1/2/4/8/9/10/11/12/1/2/4/6/7,选C)
- 例2:最长的时间显然就是此时已经在门限值之上并一直做加法增加的情况,(32-8)*2=48,选D
- 例1:注意:此时问的是第13次传输时拥塞窗口的大小,即为第13个次序时窗口的值,如果问的是第13次RTT后窗口的值,那么此时的值为第14个次序时窗口的值(1/2/4/8/9/10/11/12/1/2/4/6/7,选C)
- 初始时,拥塞窗口设置为1,即cwnd=1,慢开始门限置为16,即ssthresh=16
- 慢开始和拥塞避免算法的概念
快重传和快恢复算法
快重传
- 快重传技术使用了冗余ACK来检测丢包的发生。同样,冗余ACK也用于网络拥塞的检测
丢了包当然意味着网络可能出现了拥塞 - 快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段
- 当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,
而不必等待那个报文段设置的重传计时器超时
- 快重传技术使用了冗余ACK来检测丢包的发生。同样,冗余ACK也用于网络拥塞的检测
快恢复算法
- 当发送方连续收到三个冗余ACK(即重复确认)时,执行“乘法减小”算法,
把慢开始门限ssthresh设置为此时发送方cwnd的一半。这是为了预防网络发生拥塞。 此时跳过拥塞窗口cwnd从1起始的慢开始过程,把cwnd值设置为慢开始门限ssthresh改变后的数值,
然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。图片
- 当发送方连续收到三个冗余ACK(即重复确认)时,执行“乘法减小”算法,
两组算法的适用情况
- 在TCP连接建立和网络出现超时时,采用慢开始和拥塞避免算法(只要看到题干中有超时就用此方法)
- 例:此时使用的是慢开始与拥塞避免算法,注意题干中为:这些报文段均得到确认之后,即为1,2,4,8,16(选B)
- 例:此时使用的是慢开始与拥塞避免算法,注意题干中为:这些报文段均得到确认之后,即为1,2,4,8,16(选B)
- 当发送方接收到冗余ACK时,采用快重传和快恢复算法
- 例:此时使用的是快重传与快恢复算法,注意题干中为:这些报文得到确认之后,即为17,18,19,20,21(选D)
- 例:此时使用的是快重传与快恢复算法,注意题干中为:这些报文得到确认之后,即为17,18,19,20,21(选D)
- 在TCP连接建立和网络出现超时时,采用慢开始和拥塞避免算法(只要看到题干中有超时就用此方法)