本文已参与「新人创作礼」活动,一起开启掘金创作之路。
5.1 运输层协议概述
5.1.1 进程之间的通信
从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时,只有位于网络边缘部分的主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。
5.1.2 运输层的两个主要协议
(1)用户数据报协议 UDP (User Datagram Protocol)
(2)传输控制协议 TCP (Transmission Control Protocol)
5.1.3 运输层的端口
两大类、三种类型的端口
常用的熟知端口
5.2 用户数据报协议UDP
5.2.1 UDP概述
(1)UDP 的主要特点 ①UDP 是无连接的,发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。 ②UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。 ③UDP 是面向报文的。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。UDP 一次交付一个完整的报文。 ④UDP 没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。很适合多媒体通信的要求。 ⑤UDP 支持一对一、一对多、多对一和多对多的交互通信。 ⑥UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。
5.2.2 UDP的首部格式
用户数据报 UDP 有两个字段:数据字段和首部字段。首部字段有 8 个字节,由 4 个字段组成,每个字段都是 2 个字节。 在计算检验和时,临时把 12 字节的“伪首部”和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和。
5.3 传输控制协议TCP概述
5.3.1 TCP最主要的特点
①TCP 是面向连接的运输层协议。 ②每一条 TCP 连接只能有两个端点 (endpoint),每一条 TCP 连接只能是点对点的(一对一)。 ③TCP 提供可靠交付的服务。 ④TCP 提供全双工通信。 ⑤面向字节流
5.3.2 TCP的连接
套接字:socket 套接字 socket = (IP地址 : 端口号)
5.4 可靠传输的工作原理
5.4.1 停止等待协议
“停止等待”就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
(1)无差错情况
A 发送分组 M1,发完就暂停发送,等待 B 的确认 (ACK)。B 收到了 M1 向 A 发送 ACK。A 在收到了对 M1 的确认后,就再发送下一个分组 M2。
(2)出现差错
在接收方 B 会出现两种情况:
①B 接收 M1 时检测出了差错,就丢弃 M1,其他什么也不做(不通知 A 收到有差错的分组)。
②M1 在传输过程中丢失了,这时 B 当然什么都不知道,也什么都不做。
在这两种情况下,B 都不会发送任何信息。
但A都必须重发分组,直到B正确接收为止,这样才能实现可靠通信。
(3)确认丢失和确认迟到
①确认丢失
若 B 所发送的对 M1 的确认丢失了,那么 A 在设定的超时重传时间内不能收到确认,但 A 并无法知道:是自己发送的分组出错、丢失了,或者 是 B 发送的确认丢失了。因此 A 在超时计时器到期后就要重传 M1。
假定 B 又收到了重传的分组 M1。这时 B 应采取两个行动:
第一,丢弃这个重复的分组 M1,不向上层交付。
第二,向 A 发送确认。不能认为已经发送过确认就不再发送,因为 A 之所以重传 M1 就表示 A 没有收到对 M1 的确认。
②确认迟到 第一,传输过程中没有出现差错,但 B 对分组 M1 的确认迟到了。 第二,A 会收到重复的确认。对重复的确认的处理很简单:收下后就丢弃。 第三,B 仍然会收到重复的 M1,并且同样要丢弃重复的 M1,并重传确认分组。
(4)信道利用率
停止等待协议的优点是简单,缺点是信道利用率太低。
(5)自动重传请求 ARQ
自动重传请求 ARQ (Automatic Repeat reQuest)。意思是重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。
流水线传输:
5.4.2 连续ARQ协议
发送方一次可以发出多个分组。使用滑动窗口协议控制发送方和接收方所能发送和接收的分组的数量和编号。每收到一个确认,发送方就把发送窗口向前滑动。接收方一般采用累积确认的方式。采用回退N(Go-Back-N)方法进行重传。
(1)累积确认
接收方一般采用累积确认的方式。即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。
优点:容易实现,即使确认丢失也不必重传。
缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。
(2)Go-back-N
如果发送方发送了前 5 个分组,而中间的第 3 个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。这就叫做 Go-back-N(回退 N),表示需要再退回来重传已发送过的 N 个分组。可见当通信线路质量不好时,连续 ARQ 协议会带来负面的影响。
(3)滑动窗口协议
(4)连续 ARQ 协议与停止等待协议
5.5 TCP报文段的首部格式
TCP 虽然是面向字节流的,但 TCP 传送的数据单元却是报文段。一个 TCP 报文段分为首部和数据两部分,而 TCP 的全部功能都体现在它首部中各字段的作用。TCP 报文段首部的前 20 个字节是固定的,后面有 4n 字节是根据需要而增加的选项 (n 是整数)。因此 TCP 首部的最小长度是 20 字节。
(1)源端口和目的端口字段——各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。
(2)序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
(3)确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
(4)数据偏移(即首部长度)——占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。“数据偏移”的单位是 32 位字(以 4 字节为计算单位)。
(5)保留字段——占 6 位,保留为今后使用,但目前应置为 0。
(6)紧急 URG —— 当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
(7)确认 ACK —— 只有当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。
(8)推送 PSH (PuSH) —— 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
(9)复位 RST (ReSeT) —— 当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
(10)同步 SYN —— 同步 SYN = 1 表示这是一个连接请求或连接接受报文。
(11)终止 FIN (FINish) —— 用来释放一个连接。FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
(12)窗口字段 —— 占 2 字节,用来让对方设置发送窗口的依据,单位为字节。
(13)检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
(14)紧急指针字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。
(15)选项字段 —— 长度可变。TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。”
MSS 与接收窗口值没有关系。若选择较小的 MSS 长度,网络的利用率就降低。若 TCP 报文段非常长,会使开销增大。
其他选项: ①窗口扩大选项 ——占 3 字节,其中有一个字节表示移位值 S。新的窗口值等于 TCP 首部中的窗口位数增大到 (16 + S),相当于把窗口值向左移动 S 位后获得实际的窗口大小。 ②时间戳选项——占 10 字节,其中最主要的字段时间戳值字段(4 字节)和时间戳回送回答字段(4 字节)。 ③选择确认选项
(16)填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍。
5.6 TCP可靠传输的实现
5.6.1 以字节为单位的滑动窗口
(1)
发送窗口表示:在没有收到确认的情况下,可以连续把窗口内的数据全部发送出去。
接收窗口表示:只允许接收落入窗口内的数据。
P3 – P1 = A 的发送窗口(又称为通知窗口)
P2 – P1 = 已发送但尚未收到确认的字节数
P3 – P2 = 允许发送但尚未发送的字节数(又称为可用窗口)
(2)发送缓存
发送缓存用来暂时存放:
发送应用程序传送给发送方 TCP 准备发送的数据;
TCP 已发送出但尚未收到确认的数据。
(3)接收缓存
接收缓存用来暂时存放:
按序到达的、但尚未被接收应用程序读取的数据;
不按序到达的数据。
5.6.2 超时重传时间的选择
(1)加权平均往返时间 TCP保留了 的一个加权平均往返时间 (这又称为平滑的往返时间)。第一次测量到 样本时, 值就取为所测量到的 样本值。以后每测量到一个新的 样本,就按下式重新计算一次 :
式中,0 ≤ < 1。若 很接近于零,表示 值更新较慢。若选择 接近于 1,则表示 RTT 值更新较快。RFC 6298 推荐的 值为 1/8,即 0.125。
(2)超时重传时间 RTO (Retransmission Time-Out) 应略大于上面得出的加权平均往返时间 。 RFC 6298 建议使用下式计算 :
是 RTT 的偏差的加权平均值。 RFC 6298 建议这样计算 。第一次测量时, 值取为测量到的 样本值的一半。在以后的测量中,则使用下式计算加权平均的 :
是个小于 1 的系数,其推荐值是 1/4,即 0.25。
(3)Karn 算法 在计算平均往返时间 时,只要报文段重传了,就不采用其往返时间样本。 但是,这又引起新的问题。当报文段的时延突然增大了很多时,在原来得出的重传时间内,不会收到确认报文段。于是就重传报文段。但根据 Karn 算法,不考虑重传的报文段的往返时间样本。这样,超时重传时间就无法更新。
(4)修正的 Karn 算法
系数 的典型值是 2 。当不再发生报文段的重传时,才根据报文段的往返时延更新平均往返时延 和超时重传时间 的数值。
5.6.3 选择确认SACK
如果要使用选择确认,那么在建立 TCP 连接时,就要在 TCP 首部的选项中加上“允许 SACK”的选项,而双方必须都事先商定好。如果使用选择确认,那么原来首部中的“确认号字段”的用法仍然不变。只是以后在 TCP 报文段的首部中都增加了 SACK 选项,以便报告收到的不连续的字节块的边界。由于首部选项的长度最多只有 40 字节,而指明一个边界就要用掉 4 字节,因此在选项中最多只能指明 4 个字节块的边界信息。
5.7 TCP的流量控制
5.7.1 利用滑动窗口实现流量控制
可能会出现死锁,TCP 为每一个连接设有一个持续计时器。只要 TCP 连接的一方收到对方的零窗口通知,就启动该持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带 1 字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。若窗口仍然是零,则收到这个报文段的一方就重新设置持续计时器。若窗口不是零,则死锁的僵局就可以打破了。
5.7.2 TCP的传输效率
(1)不同的机制来控制 TCP 报文段的发送时机 第一种机制是 TCP 维持一个变量,它等于最大报文段长度 MSS。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去。 第二种机制是由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送 (push) 操作。 第三种机制是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去。
(2)Nagle算法
(3)糊涂窗口综合症
原因:接收方应用进程消耗数据太慢,例如:每次只读取一个字节。
解决方法:让接收方等待一段时间,使得或者接收缓存已有足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。只要出现这两种情况之一,接收方就发出确认报文,并向发送方通知当前的窗口大小。
5.8 TCP的拥塞控制
5.8.1 拥塞控制的一般原理
(1)拥塞产生的原因 ①点缓存的容量太小; ②链路的容量不足; ③处理机处理的速率太慢; ④拥塞本身会进一步加剧拥塞;
(2)拥塞控制与流量控制的区别 ①拥塞控制:防止过多的数据注入到网络中,使网络中的路由器或链路不致过载;是一个全局性的过程,涉及到与降低网络传输性能有关的所有因素。 ②流量控制:抑制发送端发送数据的速率,以使接收端来得及接收;是点对点通信量的控制,是端到端的问题。
(3)拥塞控制所起的作用
(4)开环控制和闭环控制
①开环控制:在设计网络时,事先考虑周全,力求工作时不发生拥塞;
思路:力争避免发生拥塞。
②闭环控制:基于反馈环路的概念;根据网络当前的运行状态采取相应控制措施;
思路:在发生拥塞后,采取措施进行控制,消除拥塞。
措施:监测网络系统,以便检测到拥塞在何时、何处发生;将拥塞发生的信息传送到可采取行动的地方;调整网络系统的运行以解决出现的问题。
5.8.2 TCP的拥塞控制方法
(1)慢开始 (Slow start) 目的:用来确定网络的负载能力或拥塞程度。 算法的思路:由小到大逐渐增大拥塞窗口数值。 拥塞窗口 cwnd 控制方法:在每收到一个对新的报文段的确认后,可以把拥塞窗口增加最多一个 SMSS 的数值。
其中 N 是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数。不难看出,当 N < SMSS 时,拥塞窗口每次的增加量要小于 SMSS。用这样的方法逐步增大发送方的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。
(2)拥塞避免算法
思路:让拥塞窗口 cwnd 缓慢地增大,避免出现拥塞。
每经过一个传输轮次,拥塞窗口 cwnd = cwnd + 1。
使拥塞窗口 cwnd 按线性规律缓慢增长。
在拥塞避免阶段,具有 “加法增大” (Additive Increase) 的特点。
(3)快重传算法 发送方只要一连收到三个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。
(4)快恢复算法 当发送端收到连续三个重复的确认时,由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是执行快恢复算法 FR (Fast Recovery) 算法: ①慢开始门限 ssthresh = 当前拥塞窗口 cwnd / 2 ; ②新拥塞窗口 cwnd = 慢开始门限 ssthresh ; ③开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。
(5)TCP拥塞控制流程图
5.8.3 主动队列管理AQM
(1)先进先出规则与尾部丢弃策略 在最简单的情况下,路由器的队列通常采用先进先出 (FIFO) 规则与尾部丢弃策略 (tail-drop policy)。 当队列已满时,以后再到达的所有分组将都被丢弃。
(2)随机早期检测 RED
当 时,丢弃概率 。
当 时,丢弃概率 。
当 时, 。
在 RED 的操作中,最难处理的就是丢弃概率 p 的选择,因为 p 并不是个常数。例如,按线性规律变化,从 0 变到 pmax。
5.9 TCP的运输连接管理
(1)TCP 是面向连接的协议。TCP 连接有三个阶段:连接建立、数据传送和连接释放。
(2)需要解决的三个问题: ①要使每一方能够确知对方的存在。 ②要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)。 ③能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。
(3)客户—服务器方式 TCP 连接的建立采用客户服务器方式。 主动发起连接建立的应用进程叫做客户 (client)。 被动等待连接建立的应用进程叫做服务器 (server)。
5.9.1 TCP的连接建立
5.9.2 TCP的连接释放
A 必须等待 2MSL 的时间:
第一,为了保证 A 发送的最后一个 ACK 报文段能够到达 B。
第二,防止 “已失效的连接请求报文段”出现在本连接中。
保活计时器:用来防止在TCP连接出现长时期的空闲。
5.9.3 TCP的有限状态机
粗实线箭头表示对客户进程的正常变迁。
粗虚线箭头表示对服务器进程的正常变迁。
细线箭头表示异常变迁。
小结
运输层提供应用进程间的逻辑通信,运输层之间的通信并不是真正在两个运输层之间直接传送数据。这一层开始就比较贴近用户了,容易理解一点。