一、运输层协议概述
- 运输层为应用进程之间提供端到端的逻辑通信。
二、运输层的端口
- 端口(port),也称为协议端口号(protocol port number)
对上层的应用进程进行标识- 端口用一个16位端口号进行标志。
- 端口号只具有本地意义
端口号只是为了标志本计算机应用层中的各进程。在因特网中不同计算机的相同端口号是没有联系的。
服务器端使用的端口号
- 熟知端口,数值一般为 0~1023。
- 登记端口号,数值为1024~49151。
客户端使用的端口号
- 短暂端口号,数值为49152~65535,留给客户进程选择暂时使用。
三、运输层的两个主要协议
TCP/IP 的运输层有两个不同的协议:
- 用户数据报协议 UDP (User Datagram Protocol)
- 传输控制协议 TCP (Transmission Control Protocol)
1、用户数据报协议 UDP
UDP 传送的协议数据单元是用户数据报(User Datagram)
不需要先建立连接
不提供可靠交付
开销小
2、传输控制协议 TCP
TCP 传送的数据单位协议是TCP报文段(segment)
提供面向连接的服务
提供可靠交付
开销大,如确认、重传、流量控制等
四、用户数据报协议 UDP
- UDP 只在 IP 的数据报服务之上增加端口的功能和差错检测的功能。
- UDP 用户数据报只能提供不可靠的交付。
- 基于
UDP
的应用层协议有 :域名转换:DNS
协议、文件传输:FTP
协议 网络管理:SNMP
协议、 远程文件服务器:NFS
协议**
UDP 是面向报文的
UDP 协议的首部
- 首部字段有 8 个字节,由 4 个字段组成,每个字段都是两个字节。
- 在计算检验和时,临时把“伪首部”和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和。
UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如:QQ 语音、 QQ 视频 、直播等等。
UDP 协议的特点:
- UDP 是无连接的;
- UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);
- UDP 是面向报文的;
- UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 直播,实时视频会议等);
- UDP 支持一对一、一对多、多对一和多对多的交互通信;
- UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。
五、可靠传输的工作原理
无差错传输的介绍:
- 无差错:即 传输信道不出差错。
- 发送 & 接收效率匹配:即 无论发送方以多快的速度发送数据,接收方总来得及处理收到的数据。
核心思想:采用一些可靠传输协议,使得
- 出现差错时,让发送方重传差错数据:即 出错重传。
- 当接收方来不及接收收到的数据时,可通知发送方降低发送数据的效率:即 速度匹配。
- 针对上述2个问题,分别采用的解决方案是:自动重传协议 和 流量控制 & 拥塞控制协议。
1、滑动窗口 协议
- 发送方和接收方分别维护发送窗口和接收窗口
- 接收窗口:接收方根据目前接收缓存可用大小进行设置
- 发送窗口:发送方根据接收方发来的报文段的窗口字段进行设置
- 由于TCP通信是双向的,TCP连接的每一端都必须设有发送窗口和接收窗口。
- TCP两端的四个窗口经常处于动态变化之中
1.1 工作原理
对于发送端:
- 每收到一个确认帧,发送窗口就向前滑动一个帧的距离。
- 当发送窗口内无可发送的帧时(即窗口内的帧全部是已发送但未收到确认的帧),发送方就会停止发送,直到收到接收方发送的确认帧使窗口移动,窗口内有可以发送的帧,之后才开始继续发送。
具体如下图:
对于接收端:当收到数据帧后,将窗口向前移动一个位置,并发回确认帧,若收到的数据帧落在接收窗口之外,则一律丢弃。
1.2 滑动窗口 协议的重要特性
- 只有接收窗口向前滑动、接收方发送了确认帧时,发送窗口才有可能(只有发送方收到确认帧才是一定)向前滑动
- 停止-等待协议、后退N帧协议 & 选择重传协议只是在发送窗口大小和接收窗口大小上有所差别:
- 停止等待协议:发送窗口大小=1,接收窗口大小=1;即 单帧滑动窗口 等于 停止-等待协议
- 后退N帧协议:发送窗口大小>1,接收窗口大小=1。
- 选择重传协议:发送窗口大小>1,接收窗口大小>1。
- 当接收窗口的大小为1时,可保证帧有序接收。
- 数据链路层的滑动窗口协议中,窗口的大小在传输过程中是固定的(注意要与TCP的滑动窗口协议区别)
2、停止等待协议
- 发送方每发完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
- 出现差错情况:
分组在传输过程中丢失了或接收方收到有差错的分组,则丢弃。
- 处理方法:
发送方在一段时 间内没有收到确认,则重传。
- 确认丢失和确认迟到
- 使用确认和重传机制,就可以在不可靠的传输网络上实现可靠的通信。
- 停止等待协议也称为自动重传请求ARQ (Automatic Repeat reQuest)。
- 停止等待协议的优点是简单,但缺点是信道利用率太低。
- 流水线传输
- 发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。
- 由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率。
3、连续 ARQ 协议
- 发送方维持发送窗口
- 发送窗口:位于窗口内的分组可以连续发送,不需要等待确认。
- 每收到一个确认后,发送窗口向后滑动一个分组
- 接收方采用累积确认的方式
收到几个分组后,对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。
优点:即使前面某个确认丢失,只要收到后面的确认,则不必重传。
缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。
4、流量控制 & 拥塞控制(针对 速度匹配)
4.1 措施1:流量控制
- 如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。
- 流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。
- 利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。
简介:
简单说明:
- 连接建立时,B告诉A︰“我的接收窗口是 rwnd = 400”(即receiver window,接收窗口)
- 因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值
- TCP的窗口单位是字节(不是报文段):设每一个报文段为100字节,而数据报文段序号的初始值设为 1
- 大写 ACK 表示首部中的确认位 ACK ,小写 ack 表示确认字段的值 ack。【只有当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。 】
- 从上图可看出,B进行了三次流量控制
- 第一次︰把窗口减少到 rwnd = 300
- 第二次又减到了 rwnd = 100,最后减到 rwnd = 0,即不允许发送方再发送数据了
- 这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。
- B 向 A 发送的三个报文段都设置了 ACK= 1,只有在ACK=1时确认号字段才有意义。
特别注意:死锁问题
若 B 之后发送了rwnd=400 的报文,但该报文丢失,则导致互相等待的死锁僵局。
解决方案
- TCP 为每一个连接设有一个持续计时器。
- 只要 TCP 连接的一方收到对方的零窗口通知,就启动持续计时器。
- 若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带 1 字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。【若该窗口为0:那么收到该报文段的一方就重新设置持续计时器;若该窗口不为0:则打破死锁】
4.2 措施2:拥塞控制
在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞。
出现资源拥塞的条件:
- 对资源需求的总和 > 可用资源
定义:
- 拥塞控制是一个全局性的过程。防止过多的数据注入网络中,这样可以使网络能承受现有的负荷。
- 流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制。抑制发送端发送数据的速率,以便使接收端来得及接收。
- 比较
举例:
- 某光纤网络的链路传输速率为100Gb/s。有一个巨型计算机以1Gb/s的速率向一个PC传送文件。
- 不存在拥塞问题,但需要流量控制,因为PC可能来不及接收
- 另一个网络,链路传输速率为1Mb/s,1000计算机连接在这个网络上,其中500台计算机向其余500台计算机以100kb/s的速率发送文件
- 要进行拥塞控制,因为网络过载
- 具体解决方案
共分为2个解决方案:慢开始 & 拥塞避免、快重传 & 快恢复
其中,涉及4种算法,即 慢开始 & 拥塞避免、快重传 & 快恢复
(1)慢开始 & 拥塞避免
- 发送方维持一个叫做拥塞窗口 cwnd (congestion window)的状态变量。
- 发送方的发送窗口等于拥塞窗口
- 发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数
- 慢开始算法的原理:
- 由小到大逐渐增大发送窗口(拥塞窗口)
- 在主机刚刚开始发送报文段时可先设置拥塞窗口 cwnd = 1,即设置为一个最大报文段 MSS 的数值(536字节)。
- 在每收到一个对新的报文段的确认后,将拥塞窗口加 1,即增加一个 MSS 的数值。
- 用这样的方法逐步增大发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。
特别注意:
慢开始的“慢”指:一开始发送报文段时拥塞窗口
(cwnd)
设置得较小(为1),使得发送方在开始时只发送一个报文段(目的是试探一下网络的拥塞情况)
并不是指拥塞窗口(cwnd)
的增长速率慢
设置慢开始门限 ssthresh
慢开始门限 ssthresh 的用法如下:
- 当 cwnd < ssthresh 时,使用慢开始算法。
- 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
- 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。
- 拥塞避免算法的思路:
拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢地增大,即每经过一个传输轮次就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长。
- 拥塞避免 并不可避免拥塞,只是将拥塞窗口按现行规律缓慢增长,使得网络比较不容易出现拥塞
- 相比慢开始算法的加倍,拥塞窗口增长速率缓慢得多
- 慢开始算法 & 拥塞避免算法的选择
- 当网络出现拥塞,就要把慢开始门限 ssthresh 设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。
- 然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法。
- 这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
举例:
- 阶段1∶因cwnd < ssthresh ,故使用慢开始算法,在执行慢开始算法时,拥塞窗口 cwnd 的初始值为 1,之后每一个传输轮次就将 cwnd 加倍
- 阶段2︰因cwnd > ssthresh ,故停止使用慢开始算法而改用拥塞避免算法,拥塞窗口按线性规律增长。
- 阶段3∶出现网路拥塞,把慢开始门限(ssthresh)设置为出现拥塞时的发送方窗口值的一半(即12)、把拥塞窗口(cwnd)重新设置为1
- 阶段4∶因cwnd < ssthresh,故使用慢开始算法
- 阶段5︰因cwnd > ssthresh ,故停止使用慢开始算法而改用拥塞避免算法,拥塞窗口按线性规律增长,每经过一个往返时延就增加一个 MSS 的大小。
- 注:
- 乘法减小︰出现网络拥塞时慢开始门限(ssthresh)设置为出现拥塞时的发送方窗口值的一半
- 加法增大︰拥塞避免时的缓慢增大
- 二者合并叫为AIMD算法(即加法增大、乘法减少)
(2)补充知识:快重传算法、快恢复算法
1、快重传算法原理
- 快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。
- 发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。
2、作用:由于发送方尽早重传未被确认的报文段,因此采用快重传后可以使整个网络吞吐量提高约20%。
3、快重传举例
4、快恢复算法原理
- 当发送端收到连续三个重复的确认时,把慢开始门限 ssthresh 减半。将cwnd设置为慢开始门限 ssthresh 减半后的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。
- 因为发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法。
注:
- 由于跳过了拥塞窗口
(cwnd)
从1起始的慢开始过程,所以称为:快恢复- 此处网络不会发生网络拥塞,因若拥塞,则不会收到多个重复确认报文
文章内容参考至:https://juejin.cn/post/6844903592965439501#heading-20 以及 谢希仁著. 计算机网络(第7版)。