第五章:传输层
5.1 传输层提供的服务
5.1.1 传输层的功能
概述
从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。
传输层位于网络层之上,它为运行在不同主机上的进程之间提供了逻辑通信,而网络层提供了主机之间的逻辑通信。显然,即使当网络层协议是不可靠的,也就是即使网络层协议会使分组丢失、混乱和重复,传输层同样也能为应用程序提供可靠的服务。
传输层为相互通信的的进程提供逻辑通信
传输层的功能
1、传输层提供应用进程之间的逻辑通信 (即端到端的通信)。与网络层的区别是,网络层提供的是主机之间的逻辑通信。
2、复用和分用。
- 复用:是指发送方不同的应用进程都可以使用同一个传输层协议传送数据;
- 分用:是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程。
3、传输层对收到的报文进行差错检测 (首部和数据部分)。而网络层只检查IP数据报的首部,不检验数据部分是否出错。
4、提供两种不同的传输协议,即面向连接的TCP和无连接的UDP。而网络层无法同时实现两种协议。
当传输层采用面向连接的TCP时,尽管下面的网络是不可靠的,但这种逻辑通信信道就相当于是一条全双工的可靠信道。但当传输层采用无连接的UDP时,这种逻辑通信信道仍然是一条不可靠信道。
5.1.2 传输层的寻址与端口
端口的作用
- 端口能够让应用层的各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程。
- 端口就是传输层服务访问点TSAP,标识的是主机中的应用进程。
- 数据链路层的SAP是MAC地址,网络层的SAP是IP地址,传输层的SAP是端口。
- 硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与传输实体进行层间交互的一种地址。传输层使用的是软件端口。
- 端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程。在因特网中不同计算机的相同端口号是没有联系的。
端口号
应用进程通过端口号进行标识,端口号长度为16bit,能够表示65536(216)个不同的端口号。端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程,不同计算机的相同 端口号是没有联系的。
根据端口号范围可将端口分为两类
- 服务端使用的端口号
- 熟知端口号:数值为0~1023, IANA (互联网地址指派机构)把这些端口号指派给了TCP/IP最重要的一些应用程序,让所有的用户都知道。
- 登记端口号:数值为1024~49151。它是为没有熟知端口号的应用程序使用的,使用这类端口号必须在IANA 登记,以防止重复。
- 客户端使用的端口号
- 数值为49152~65535,由于这类端口号仅在客户进程运行时才动态选择,因此又叫短暂端口号(也称临时端口)。通信结束后,刚才使用过的客户端口号就不复存在,这个端口号就可以供其他客户进程使用。
套接字
网络中通过IP地址来标识和区别不同的主机,通过端口号来标识和区分一台主机中的不同应用进程。在网络中采用发送方和接收方的套接字(Socket) 组合来识别端点。
套接字实际上是一个通信端点,即 套接字=(主机IP地址,端口号) 套接字 = (主机IP地址,端口号) 套接字=(主机IP地址,端口号) ,它唯一地标识了网络中的一个主机和其上的一个应用(进程)。
5.1.3 无连接服务与面向连接服务
概述
面向连接服务:是在通信双方进行通信之前,必须先建立连接,在通信过程中,整个连接的情况一直被实时地监控和管理。当通信结束后 ,则应该释放这个连接。
无连接服务:两个实体之间的通信不需要先建立好连接,需要通信的时候,直接将信息发送到“网络”中,让该信息的传递在网上尽力而为地往目的地传送。
TCP/IP 协议族在IP层之上使用了两个传输协议 :
- 面向连接的传输控制协议TCP, 当采用TCP时,传输层向上提供的是一条全双工的可靠逻辑信道。
- 无连接的用户数据报协议UDP,当采用UDP 时,传输层向上提供的是一条不可靠的逻辑信道。
IP数据报和UDP数据报的区别
- IP数据报在网络层要经过路由的存储转发;
- UDP数据报是在传输层的端到端的逻辑信道中传输,而封装成IP数据报在网络层传输时,UDP数据报的信息对路由是不可见的。
TCP和网络层虚电路的区别
- TCP报文段是在传输层抽象的逻辑信道中传输,对路由器不可见;
- 虚电路所经过的交换结点都必须保存虚电路状态信息。在网络层若采用虚电方式,则无法提供无连接服务;
- 而传输层采用TCP协议不影响网络层提供无连接服务。
5.2 UDP协议
5.2.1 UDP数据报
概述
[RFC 768]定义的UDP只是做了传输协议能够做的最少工作,只在IP的数据报服务之上增加了两个最基本的服务:复用和分用以及差错检测。
特点
-
UDP是无连接的,减少开销和发送数据之前的时延。
-
UDP使用最大努力交付,即不保证可靠交付。
-
UDP是面向报文的,适合一次性传输少量数据的网络应用。
-
UDP无拥塞控制,适合很多实时应用 。
-
UDP首部开销小,8B,TCP20B。
UDP优点:
- UDP无需建立连接。因此UDP不会引入建立连接的时延。
- 无连接状态。TCP需要在端系统中维护连接状态。此连接状态包括接收和发送缓存、拥 塞控制参数和序号与确认号的参数。而UDP不维护连接状态,也不跟踪这些参数。
- 分组首部开销小。TCP有20字节的首部开销,而UDP仅有8字节的开销。
- 应用层能更好地控制要发送的数据和发送时间。UDP没有拥塞控制,因此网络中的拥塞也不会影响主机的发送效率。
UDP常用于一次性传输比较少量数据的网络应用,如 DNS、SNMP等,也常用于多媒体应用如IP电话、实时视频会议、流媒体等。
UDP提供尽最大努力的交付, 即不保证可靠交付,但这并不意味着应用对数据的要求是不可靠的,因此所有维护传输可靠性的工作需要用户在应用层来完成。应用实体可以根据应用的需求来灵活设计自己的可靠性机制。
UDP是面向报文的。报文不可分割,是UDP数据报处理的最小单位。
UDP的首部格式
UDP数据报包含两个部分:UDP首部和用户数据,整个UDP数据报作为IP数据报的数据部分封装在IP数据报中。UDP首部有8个字节,由4个字段组成,每个字段的长度都是两个字节。
各字段意义:
-
源端口:源端口号。在需要对方回信时选用。不需要时可用全0。
-
目的端口:目的端口号。这在终点交付报文时必须要使用到。
-
长度:UDP数据报的长度(包括首部和数据),其最小值是8(仅有首部)。
-
校验和:检测UDP数据报在传输中是否有错。有错就丢弃。该字段是可选的,当源主机不想计算校验和,则直接令该字段为全0。
- 当传输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交给应用进程。
- 如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于端口号的应用进程),就丢弃该报文,并由ICMP发送 “端 口不可达” 差错报文给发送方。
5.2.2 UDP校验
概述
在计算校验和时,要在UDP数据报之前增加12个字节的伪首部,伪首部并不是UDP真正的首部。只是在计算校验和时,临时添加在UDP数据报的前面,得到一个临时的UDP数据报。校验和就是按照这个临时的UDP数据报计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算校验和。这样的校验和,既检查了UDP数据报,又对IP数据报的源IP地址和目的IP地址进行了检验。
UDP校验和计算过程
UDP校验和的计算方法和IP数据报首部校验和的计算方法相似,都使用二进制反码运算求和再取反。但不同的是:IP数据报的校验和只检验IP数据报的首部,但UDP的校验和是把首部和数据部分一起都检验。
在发送端:
- 填上伪首部
- 全0填充检验和字段
- 全0填充数据部分(UDP数据报要看成许多4B的字串接起来)
- 伪首部+首部+数据部分采用二进制反码求和
- 把和求反码填入检验和字段
- 去掉伪首部,发送
在接收端:
- 填上伪首部
- 伪首部+首部+数据部分采用二进制反码求和
- 结果全为1则无差错,否则丢弃数据手/交给应用层附上出差错的警告。
注意
- 校验时,若UDP数据报部分的长度不是偶数个字节,则需要填入一个全0字节,但是此字节和伪首部一样,是不发送的。
- 如果UDP校验和校验出UDP数据报是错误的,可以丢弃,也可以交付给上层,但是需要附上错误报告,即告诉上层这是错误的数据报。
- 通过伪首部,不仅可以检查源端口号、目的端口号和UDP用户数据报的数据部分,还可以检查IP数据报的源IP地址和目的地址。
这种简单的差错检验方法的检错能力并不强,但它的好处是简单,处理速度快。
5.3 TCP协议
5.3.1 TCP协议的特点
概述
TCP是在不可靠的IP层之上实现的可靠的数据传输协议,它主要解决传输的可靠、有序、 无丢失和不重复的问题。
特点
- TCP是面向连接 (虚连接) 的传输层协议。
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的 (一对一)。
- TCP提供可靠交付的服务,保证传送的数据无差错、不丢失、不重复、按序到达。可靠有序,不丢不重。
- TCP提供全双工通信,TCP 允许通信双方的应用进程在任何时候都能发送数据,为此TCP连接的两端都设有发送缓存和接收缓存 ,用来临时存放双向通信的数据。
- 发送缓存:① 准备发送的数据;② 己发送但尚未收到确认的数据。
- 接收缓存:① 按序到达但尚未被接受应用程序读取的数据;② 不按序到达的数据。
- TCP是面向字节流的,虽然应用程序和TCP的交互是一次一个数据块 (大小不等), 但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。( 流:流入到进程或从进程流出的字节序列)。
5.3.2 TCP报文段
概述
TCP传送的数据单元称为报文段。一个TCP报文段分为TCP首部和TCP数据两部分,整个TCP段作为IP数据报的数据部分封装在IP数据报中。其首部的前20字节是固定的。TCP报文段的首部最短为20字节,后面有4N宇节是根据需要而增加的选项,通常长度为4字节的整数倍。
TCP报文段既可以用来运载数据,也可以用来建立连接、释放连接和应答。
TCP报文段首部
各字段意义:
1、源端口和目的端口字段:各占2字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。
2、序号字段:占4字节,TCP是面向字节流的,所以TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
3、确认号字段:占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。 若确认号=N,则表明到序号N-1为止的所有数据都己正确收到。
4、数据偏移字段: (表示首部长度) 占4位 ,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,单位是32位 (以4字节为计算单位)。因此当此字段的值为15时, 达到TCP首部的最大长度60字节。
5、保留字段:占6位,保留为今后使用,但目前应置为0,该字段可以忽略不计。
6、6个控制位
- 紧急位URG:URG=1时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,但是URG需要和紧急指针配套使用,也就是说数据从第一个字节到紧急指针所指字节就是紧急数据。
- 确认位ACK:ACK=1时确认号有效,当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1。
- 推送位PSH:PSH=1时,接收方尽快交付接收应用进程,不再等到缓存填满再向上交付。
- 复位RST:RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输链接。
- 同步位SYN:SYN=1时,表示这是一个连接请求或连接接收报文。
- 当SYN=1,ACK=0时,表明这是一个连接请求报文,对方若同意建立连接,则在响应报文中使用 SYN=1,ACK=1。 即,SYN=1就表示这是一个连接请求或连接接收报文。
- 终止位FIN:FIN=1时,表明此报文段发送方数据己发完,要求释放连接。
7、窗口字段:占2字节。它指出了现在允许对方发送的数据量,接收方的数据缓存空间是有限的,故用窗口值作为接收方让发送方设置其发送窗口的依据,单位为字节。
8、检验和字段:占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,和UDP一样,要在TCP报文段的前面加上 12字节的伪首部。
9、紧急指针字段:占 16 位,指出在本报文段中紧急数据共有多少个字节 (紧急数据放在本报文段数据的最前面)。
10、选项字段:长度可变。TCP最初只规定了一种选项,即最大报文段长度。MSS是TCP报文段中的数据字段的最大长度。
11、填充字段:为了使整个首部长度是4字节的整数倍。
5.3.3 TCP连接管理
概述
TCP是面向连接的协议。因此每一个TCP连接都有三个阶段:连接建立、数据传送和连接释放。TCP连接的管理就是使运输连接的建立和释放都能正常进行。
TCP把连接作为最基本的抽象,每一条TCP连接有两个端点,TCP连接的端口叫做套接字(socket)或插口。 端口拼接到IP地址即构成了套接字。每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定。
TCP连接的建立采用客户/服务器方式。 主动发起连接建立的应用进程叫做客户机(Client),而被动等待连接建立的应用进程叫做服务器( Server)。
TCP的连接的建立
连接的建立经历以下 3 个步骤,通常称为“三次握手:
阶段1:客户机的TCP首先向服务器的TCP发送一个连接请求报文段。这个特殊的报文段中不含应用层数据,其首部中的SYN标志位被置为 1。另外,客户机会随机选择一个起始序号 seq=x (连接请求报文不携带数据,但要消耗掉一个序号) 。
- SYN=1,seq=x(随机)
阶段2:服务器的TCP收到连接请求报文段后,如同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量。在确认报文段中,SYN和ACK位都被置为1,确认号字段的值为x+1,并且服务器随机产生起始序号 seq=y (确认报文不携带数据,但也要消耗掉一个 序号)。确认报文段同样不包含应用层数据。
- SYN=1,ACK=1,seq=y(随机),ack=x+1
阶段3:当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量 。这个报文段的 ACK 标志位被置1,序号宇段为x+1,确认号字段 ack=y+1。该报文段可以携带数据,如果不携带数据则不消耗序号。
- SYN=0,ACK=1,seq=x+1, ack=y+1
注意:
- TCP提供的是全双工通信,因此通信双方的应用进程在任何时候都能发送数据。
- 服务器端的资源是在完成第二次握手时分配的,而客户端的资源是在完成第三次握手时分配的。这就使得服务器易于受到SYN洪泛攻击。
SYN洪泛攻击
SYN洪泛攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送 TCP SYN, SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。
TCP连接的释放
参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的“资源”(缓存和变量)将被释放。TCP连接释放的过程通常称为“四次挥手”。
阶段1:客户机打算关闭连接,就向其TCP发送一个连接释放报文段,并停止再发送数据, 主动关闭TCP连接,该报文段FIN标志位被置1, seq=u,它等于前面己传送过的数据的最后一个字节的序号加1 (FIN报文段即使不携带数据,也要消耗掉一个序号)。
- FIN=1, seq=u
阶段2:服务器收到连接释放报文段后即发出确认,确认号是 ack=u+1,而这个报文段自己的序号是v,等于它前面己传送过的数据的最后 一个字节的序号加1。此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态。但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭。
- ACK=1,seq=v,ack=u+1
阶段3:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时其发出FIN=1的连接释放报文段。
- FIN=1,ACK=1,seq=w,ack=u+1
阶段4:客户机收到连接释放报文段后,必须发出确认。在确认报文段中,ACK字段被置为1,确认号ack=w+1, 序号 seq=u+1。此时 TCP连接还没有释放掉,必须经过时间等待计时器设置的时间2MSL后, A才进入到连接关闭状态。
- ACK=1,seq=u+1,ack=w+1
5.3.4 TCP可靠传输
概述
TCP的任务是在IP层的不可靠的、尽力而为服务 的基础上建立一种可靠数据传输服务。TCP提供的可靠数据传输服务就是要保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。TCP使用了校验、序号、确认和重传等机制来达到这个目的。
序号
TCP首部的序号宇段用来保证数据能有序提交给应用层,TCP把数据看成一个无结构但是有序的字节流,而序号是建立在传送的字节流之上,而不是建立在报文段之上。
TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
假设A和B之间建立了一条TCP连接,A的发送缓存区中总共有10个字节,序号从0开始标号,第一个报文包含第0~2个字节,则该TCP报文段的序号是0;第二个报文段的序号是3。
确认
TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。发送方缓存区会继续存储那些已经发送但未收到确认的报文段,以便在需要的时候重传。
TCP默认使用累计确认,即TCP只确认数据流中至第一个丢失字节为止的字节。
重传
有两种事件会导致TCP对报文段进行重传:超时和冗余ACK。
1、超时
TCP每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到期但还没有收到确认,就要重传这一报文段。
由于TCP的下层是一个互联网环境,IP数据报所选择的路由变化很大。因而传输层的往返时延的方差也很大。为了计算超时计时器的重传时间,TCP采用一种自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间,这两个时间之差叫做报文段的往返时间(Round-Trip Time,RTT)。
TCP保留了RTT的一个加权平均往返时间RTTs,当第一次测量RTT样本时,RTTs值就为所测量到的RTT样本的值,但以后每测量一个新的 RTT样本,就重新计算一次RTTs。
公式:新的RTTS=(1−α)∗(旧的RTTS)+α∗(新的RTT样本)新的RTT_S=(1-\alpha)*(旧的RTT_S)+\alpha*(新的RTT样本)新的RTTS=(1−α)∗(旧的RTTS)+α∗(新的RTT样本)
参数:0≤α≤10\leq\alpha\leq10≤α≤1 ,若α很接近于零,表示新的RTTs值和旧的RTTs值相比变化不大,而受新的RTT样本影响不大 (RTT 值更新较慢)。若选择α接近于1,则表示新的RTTs值受新的RTT样本的影响较大 (RTT值更新较快)。
超时计时器设置的超时重传时间 ( Retransmission Time-Out, RTO) 应略大于加权平均往返时间RTTs:
公式:RTO=RTTS+4∗RTTDRTO=RTT_S+4*RTT_DRTO=RTTS+4∗RTTD
参数:RTTDRTT_DRTTD 是RTT的偏差的加权平均值,它与RTTSRTT_SRTTS和新的RTT样本之差有关。当第一次测量时,RTTDRTT_DRTTD 取为测量到的RTT样本值的一半。
公式:新的RTTD=(1−β)∗(旧的RTTD)+β∗∣RTTS−新的RTT样本∣新的 RTT_D=(1-\beta)*(旧的RTT_D)+\beta*|RTT_S-新的RTT样本|新的RTTD=(1−β)∗(旧的RTTD)+β∗∣RTTS−新的RTT样本∣
参数:β\betaβ是个小于1的系数,它的推荐值是0.25。
2、冗余ACK (冗余确认)
每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。 冗余ACK就是再次确认某个报文段的ACK,而发送方先前已经收到过该报文段的确认。
TCP规定每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。
TCP规定当发送方收到对同一个报文段的3个冗余ACK时,就可以认为跟在这个被确认报文段之后的报文段已经丢失。
发送方己发送1, 2, 3, 4, 5报文段
接收方收到1,返回给1的确认(确认号为2的第个字节)
接收方收到3,仍返回给1的确认(确认号为2的第一个字节)
接收方收到4,仍返回给1的确认(确认号为2的第一个字节)
接收方收到5,仍返回给1的确认(确认号为2的第一个字节)
发送方收到3个对于报文段1的冗余ACK - 认为2报文段丢失,重传2号报文段(快速重传)
5.3.5 TCP的流量控制
概述
TCP提供了流量控制服务以消除发送方使接收方缓存区溢出的可能性,因此可以说流量控制是一个速度匹配服务(匹配发送方的发送速率与接收方的读取速率)。TCP利用滑动窗口机制实现流量控制。
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这就是接收窗口rwnd,即调整TCP报文段首部中的“窗口”宇段值,来限制发送方向网络注入报文的速率。
同时,发送方根据其对当前网络拥塞程序的估计而确定的窗口值,称为拥塞窗口 cwnd,其大小与网络的带宽和时延密切相关。发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。
示例
A向B发送数据,连接建立时,B告诉A:“我的rwnd=400(字节)",假设每一个报文段100B,报文段序号初始值为1。
问题:当响应主机B的滑动窗口值为0时,主机A会一直等待B的确认,进而形成一个死锁局面。
解决:
- TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。
- 若持续计时器设置的时间到期, 就发送一个零窗口探测报文段。 接收方收到探测报文段时给出现在的窗口值。
- 若窗口仍然是0,那么发送方就重新设置持续计时器。
注意
传输层 & 数据链路层流量控制的区别:传输层定义了端到端用户之间的流量控制,数据链路层定义了两个中间的相邻结点的流量控制。另外,数据链路层的滑动窗口协议的窗口大小不能动态变化,传输层则可以动态变化。
5.3.6 TCP拥塞控制
概述
拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。当出现拥塞时,端点并不能了解到拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为通信时延的增加。当然拥塞控制和流量控制也有相似的地方,都是通过控制发送方发送数据的速率来达到效果的。
出现拥塞的条件
本质:对资源需求的总和>可用资源
网络中有许多资源同时呈现供应不足 -> 网络性能变坏 -> 网络吞吐量将随输入负荷增大而下降
拥塞控制 & 流量控制区别
拥塞控制:是让网络能够承受现有的网络负荷,它是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
流量控制:往往是指点对点的通信量的控制,即接收端控制发送端,它所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
拥塞控制算法
为了更好地对传输层进行拥塞控制,因特网建议标准定义了以下四种算法 : 慢开始、拥塞避免、快重传、快恢复。
发送方在确定发送报文段的速率时,既要根据接收方的接收能力,又要从全局考虑不要使网络发生拥塞。因此,TCP协议要求发送方维护以下两个窗口:
接收窗口rwnd:接收方根据目前接收缓存大小所许诺的最新的窗口值,反映了接收方的容量。由接收方根据其放在TCP报文的首部的窗口字段通知发送方。
拥塞窗口cwnd:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映了网络的当前容量。只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入网络中的分组数。
发送窗口的上限值取接收窗口rwnd和拥塞窗口cwnd中较小的一个:发送窗口上限值=Min[接收窗口rwnd,拥塞窗口cwnd]发送窗口上限值=Min[接收窗口rwnd,拥塞窗口cwnd]发送窗口上限值=Min[接收窗口rwnd,拥塞窗口cwnd]
慢开始和拥塞避免
-
慢开始算法:在 TCP刚刚连接好,开始发送TCP报文段时,先令拥塞窗口cwnd=1, 即一个最大报文段长度MSS。而在每收到一个对新的报文段的确认后,将cwnd加1,即增大一个MSS。用这样的方第法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。
-
拥塞避免算法:发送端的拥塞窗口cwnd每经过一个往返时延RTT就增加一个MSS的大小,而不是加倍,使cwnd按线性规律缓慢增长 (即加法增大), 而当出现一次超时(网络拥塞)时, 则令慢开始门限 ssthresh等于当前cwnd的一半(即乘法减小)。
根据 cwnd 的大小执行不同的算法,可归纳如下:
- 当 cwnd < ssthresh 时,使用慢开始算法。
- 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
- 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法(通常做法)。
-
网络拥塞的处理:当网络出现拥塞时,无论在慢开始阶段还是在拥塞避免阶段,只要发送方检测到超时事件的发生(没有按时收到确认,重传计时器超时),就要把慢开始门限ssthresh设置为出现拥塞时的发送方cwnd值的一半(但不能小于2)。 然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。
这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
拥塞避免是指在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞,并非完全能避免拥塞。
慢开始和拥塞避免算法的实现举例
- 初始时,拥塞窗口置为1,即cwnd=1,慢开始门限置为16,即ssthresh=16。慢开始阶段,cwnd初值为1,以后发送方每收到一个确认ACK, cwnd值加1,也即经过每个传输轮次(RTT), cwnd呈指数规律增长。
- 当拥塞窗口cwnd增长到慢开始门限ssthresh时(即当cwnd=16时),就改用拥塞避免算法,cwnd 按线性规律加性增长。
- 假定cwnd=24时,网络发生拥塞,更新ssthresh值为12 (即变为超时时cwnd值24的一半),cwnd重置1,并执行慢开始算法,当 cwnd=12时,改为拥塞避免算法。
快重传和快恢复
快重传和快恢复算法是对慢开始和拥塞避免算法的改进。
- 快重传:当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。
- 快恢复:当发送端收到连续三个冗余ACK (即重复确认)时,就执行“乘法减小”算法,把慢开始门限ssthresh设置为出现拥塞时发送方 cwnd的一半。
实际上,慢开始、拥塞避免算法、快重传和快恢复几种算法应该是同时应用在拥塞控制机制之中的,当发送方检测到超时的时候就采用慢开始和拥塞避免, 当发送方接收到冗余ACK的时候就采用快重传和快恢复。
5.4 小结
知识架构
本文深入解析传输层协议,包括TCP和UDP的特点与工作机制。详细介绍了TCP的连接管理、可靠传输、流量控制及拥塞控制机制,以及UDP的无连接特性和服务。

700

被折叠的 条评论
为什么被折叠?



