「生活可以更简单, 欢迎来到我的开源世界」
  1. 运输层协议概述
  2. 用户数据报协议UDP
  3. 传输控制协议TCP概述
  4. 可靠传输的工作原理
  5. 停止等待协议
  6. 连续ARQ协议
  7. TCP报文段的首部格式
  8. TCP可靠传输的实现
  9. TCP的流量控制
  10. TCP的拥塞控制
  11. TCP的运输连接管理
第5章 运输层
2018-07-24
」 「

运输层:

运输层协议概述

运输层向上面的应用层提供通信服务。当网络的边缘部分的两台主机使用网络的核心部分的功能进行端到端的通信时,只有主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。

两台主机进行通信就是两台主机中的应用进程互相通信,通信的真正端点并不是主机而是主机中的进程。

image-20201029205358115

网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信

image-20201029210330272

运输层还要对收到的报文进行差错检测

TCP/IP运输层的两个主要协议都是互联网的正式标准:

image-20201029210344256

两个对等运输实体在通信时传送的数据单元叫做运输协议数据单元TPDU。但在TCP/IP体系中,根据所使用的协议是TCP或UDP,分别称之为TCP报文段UDP用户数据报

image-20201029211216165

运输层的复用和分用:

硬件端口是不同硬件设备进行交互的接口,软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址。

TCP/IP的运输层用一个16位端口号来标志一个端口,端口号只有本地意义,它只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。

运输层的端口号分为两大类:

用户数据报协议UDP

UDP的主要特点是:

用户数据报UDP有两个字段:

image-20201029225431486

当运输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交最后的终点——应用进程。

image-20201029225656203

如果接收方UDP发现收到的报文中的目的端口号不正确,就丢弃该报文,并由网际控制报文协议ICMP发送“端口不可达”差错报文给发送方。

UDP用户数据报在计算检验和时,要在UDP用户数据报之前增加12个字节的伪首部,这是在计算检验和时临时添加在UDP用户数据报前面,得到一个临时的UDP用户数据报。检验和就是按照这个临时的UDP用户数据报来计算的。伪首部既不向下传送也不向上递交,仅仅是为了计算检验和。

IP数据报的检验和只检验IP数据报的首部,但UDP的检验和是把首部和数据部分一起都检验。

传输控制协议TCP概述

TCP最主要的特点:

image-20201030172956309

TCP连接是一条虚连接(也就是逻辑连接),而不是一条真正的物理连接。

TCP并不关心应用程序一次把多长的报文发送到TCP的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP发送的报文长度是应用程序给出的)。

TCP把连接作为最基本的抽象,每一条TCP连接有两个端点,TCP连接的端点叫做套接字插口,端口号拼接到IP地址即构成了套接字:套接字socket = (IP地址:端口号)

每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定,即:

TCP连接 ::= {socket1, socket2} = {(IP1:port1),(IP2:port2)}

可靠传输的工作原理

TCP发送的报文段是交给IP层传送的,但IP层只能提供尽最大努力服务,即TCP下面的网络所提供的是不可靠的传输。TCP必须采用适当的措施才能使得两个传输层之间的通信变得可靠。

停止等待协议

image-20201031143215751

可靠传输协议的设计:A只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发过的分组,即超时重传。要实现超时重传,就要在每发送完一个分组时设置一个超时计时器。

需要注意三点:

  1. A在发送完一个分组后,必须暂时保留已发送的分组的副本
  2. 分组和确认分组都必须进行编号
  3. 超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些

image-20201031143634601

确认丢失时:

  1. 丢弃这个重复的分组M1,不向上层交付
  2. 向A发送确认

确认和重传机制,使得可以在不可靠的传输网络上实现可靠的通信。

可靠传输协议常称为自动重传请求ARQ:重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。

image-20201031144151737

$信道利用率U = {T_D \over T_D + RTT + T_A}$

image-20201031144206600

连续ARQ协议

image-20201031144747565

连续ARQ协议规定:发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。图中原来已经发送了前5个分组,那么现在可以发送第6个分组了。

接收方一般采用累积确认的方式:接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,表示到这个分组为止的所有分组都已正确收到了。

累积确认:

TCP报文段的首部格式

TCP是面向字节流的,但是TCP传送的数据单元却是报文段。TCP首部的固定长度(最小长度)是20字节,整个首部的长度是4字节的整数倍。

image-20201031150431371

TCP可靠传输的实现

TCP的滑动窗口是以字节为单位的。

image-20201031153801209

发送窗口的位置由窗口的前沿和后沿的位置共同确定:

image-20201031155704324

发送方的应用进程把字节流写入TCP的发送缓存,接收方的应用程序从TCP的接收缓存中读取字节流。

发送缓存用来暂时存放:

发送窗口通常只是发送缓存的一部分。已被确认的数据应当从发送缓存中删除,因此发送缓存和发送窗口的后沿是重合的。

接收缓存用来暂时存放:

TCP的发送窗口是根据接收窗口设置的,但同一时刻,发送窗口不总是和接收窗口一样大:

TCP标准对不按序到达的数据并无明确规定:

TCP要求接收方必须有累积确认的功能,这样可以减少开销:

TCP的通信是全双工通信,通信中的每一方都在发送和接收报文段,每一方都有自己的发送窗口和接收窗口。

运输层的超时计时器的超时重传时间设置:

当接收方接受到不连续的字节块时,可使用选择确认SACK,此时在建立连接时要在TCP首部的选项中加上“允许SACK”的选项。由于首部选项的长度最多只有40字节,而指明一个边界要用4字节(因为序号有32位),因此在选项中最多只能指明4个字节块的边界信息(8个边界),共用了32字节,另外需要1个字节指明是SACK选项,1个字节指明这个选项占用多少字节。

SACK文档并没有指明发送方应当怎样响应SACK,因此大多数的实现还是重传所有未被确认的数据块。

TCP的流量控制

流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。

image-20201031203010356

发送方的发送窗口不能超过接收方给出的接收窗口的数值。

TCP的窗口单位是字节,不是报文段。

TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值,如果窗口值仍然是零,则重新设置持续计时器。

TCP的拥塞控制

在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况叫做拥塞

所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。

拥塞控制的前提是:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,设计到所有的主机、所有的路由器,以及降低网络传输性能有关的所有因素。

相反,流量控制往往是指点对点通信量的控制,是个端到端的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。

image-20201031213929383

拥塞控制的两大方面:

TCP进行拥塞控制的算法有四种:

发送方维持一个叫做拥塞窗口cwnd的状态变量,拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。当接收方总是有足够大的缓存空间时,发送方让自己的发送窗口等于拥塞窗口。

判断网络拥塞的依据就是出现了超时。

image-20201101170414504

相关变量:(用报文段的个数作为窗口大小的单位

慢开始算法:每经过一个传输轮次,拥塞窗口cwnd就加倍。

拥塞避免算法:每经过一个传输轮次,拥塞窗口cwnd就加一。拥塞避免并非完全能够避免了拥塞,是说把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

快重传算法可以让发送方尽早知道发生了个别报文段的丢失。快重传算法首先要求对方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。

image-20201101171524869

发送方知道只是丢失了个别的报文段时,不启动慢开始,而是执行快恢复算法:

在拥塞避免阶段,拥塞窗口是按照线性规律增大的,常称为加法增大AI

一旦出现超时或3个重复确认,就要把门限值设置为当前拥塞窗口值的一半,并大大减小拥塞窗口的数值,常称为乘法减小MD

二者合一起就是AIMD算法。

image-20201101171933600

接收方根据自己的接收能力设定了接收方窗口rwnd,并把该窗口值写入TCP首部中的窗口字段,传给发送方。接收方窗口又称为通知窗口。

发送方的发送窗口一定不能够超过对方给出的接收方窗口值rwnd,则:

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

网络层的策略对TCP拥塞控制影响最大的就是路由器的分组丢弃策略。最简单的情况下是使用尾部丢弃策略,路由器的尾部丢弃往往会导致一连串的分组丢失,使发送方出现超时重传,使TCP进入慢开始状态,尾部丢弃可能同时影响很多条TCP连接,使很多TCP连接在同一时间突然都进入慢开始状态,这在TCP术语中称为全局同步。全局同步使得全网的通信量突然下降很多,而在网络恢复后,其通信量又突然增大很多。

为了避免网络中的全局同步现象,提出了主动队列管理AQM,AQM早期的实现方案是随机早期检测RED

TCP的运输连接管理

TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。

运输连接有三个阶段:连接建立、数据传送、连接释放

运输连接的管理就是使运输连接的建立和释放都能正常进行。

TCP连接的建立采用客户服务器模式:

image-20201101213840232

image-20201101214333994

image-20201101214351953

建立TCP连接时,A最后要发送一次确认,主要是为了防止已失效的连接请求报文段突然又传到了B,因而产生错误。

释放TCP连接时,A要经历2MSL时间的TIME-WAIT状态,理由是:

<⇧>