1. 运输层概述
(1)、前情回顾
计算机网络体结构中的物理层、数据链路层以及网络层
它们共同解决了将主机通过异构网络互连起来
所面临的问题,实现了主机到主机的通信
。
(2)、为什么需要运输层?
- 但实际上在
计算机网络中进行通信的真正实体
是位于通信两端主机中的进程
。 如何运行在不同的主机上的应用进程提供直接的通信服务是运输层的任务
,运输层协议又称端到端协议
,因为运输层的作用范围是端到端。
(3)、运输层的相关说明
- 运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),
它使应用进程看见的就好像是在两个运输层实体之间有一条端到端的逻辑通信信道
。
- 根据应用需求的不同,因特网的运输层为应用层提供了两种不同的运输协议,即
面向连接的TCP
和无连接的UDP
。
2. 运输层端口号、复用与分用
(1)、为什么需要端口号?
- 运行在计算机上的
进程使用进程标识符PID来标志
。 - 因特网上的计算机并不是使用统一的操作系统,
不同的操作系统又使用了不同格式的进程标识符
。 为了使运行不同操作系统的计算机的应用进程之间能够进行通信
,就必须使用统一的方法对TCP/IP体系的应用进程进行标识
。
(2)、端口号简介
端口号使用16比特
,取值范围0~65535
。端口号只有本地意义
,即端口号只是为了标识本地计算机应用层中的各进程在因特网中
,不同计算机中的相同端口号是没有任何联系的。
分类
- 数值端口号:
0~1023
,IANA把这些端口号
指派给了TCP/IP体系中最重要的一些应用协议
。 - 登记端口号:
1024~49151
,为没有熟知端口号的应用程序使用
。使用这类端口号必须在IANA按照规定的手续登记。 - 短暂端口号:
49152~65535
,留给客户端进程选择暂时使用
。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后。这个端口号可供其他客户进程使用
。
(3)、发送方的复用
多个进程
(这里一个端口表示一个进程)利用一个运输层协议(或者称为运输层接口)发送数据
称为 复用
应用进程的应用报文向下传递,有的被UDP协议封装成UDP数据报
,有的被TCP协议封装成TCP报文段
,然后再往下传输,被IP协议封装成IP数据报
进行运输。
(4)、接收方的分用
多个进程
(这里一个端口表示一个进程)利用一个运输层协议(或者称为运输层接口)接收时
叫做 分用。
IP数据报被接收方接收进行IP分用
,如果IP数据报的协议字段为17
,则将IP数据报中的数据载荷部分的UDP数据报向上传递给运输层
,如果IP数据报的协议字段为6
,则将IP数据报中的数据载荷部分的UDP数据报向上传递给运输层
。
(5)、常见的协议
- UDP(
RIP:520,DNS:53,TFTP:69,SNMP:161,DHCP:67/68
) - TCP(
SMTP:25,FTP:20/21,BGP:179,HTTP:80,HTTPS:443
)
3. TCP(传输控制协议)与UDP(用户数据报协议)的对比
- UDP支持
一对一,一对多,多对一和多对多交互通信
;TCP只能是一对一通信
- UDP是
无连接的(即发送方随时都可以发送数据报)
,TCP是面向连接的(在发送数据报之前必须建立连接,发送完毕后必须释放连接)
。
- UDP是
面向应用报文
的,TCP是面向字节流的
。
- UDP
向上提供无连接不可靠传输服务(如果数据报出现误码或丢失,不进行任何处理)
;TCP向上提供面向连接可靠传输服务(发送方发送什么,接收方就接受到什么)
。
- UDP首部开销小仅8字节,TCP首部最少20字节,最大60字节。
4. 流量控制
(1)、为什么需要流量控制?
一般来说,我们总是希望数据传输得更快一些。但是如果发送方发送得过快
,接收方就可能来不及接收,这就会造成数据的丢失
。
(2)、流量控制
流量控制就是让发送方得的发送速率不要太快
,要让接收方来得及接收
。
(3)、实现方式
利用滑动窗口机制
可以很方便地在TCP连接上实现对发送方的流量控制
。
- TCP接收方
利用自己的接收窗口的大小来限制发送方发送窗口的大小
。 - TCP发送方
收到接收方的零窗口通知
后,应启动持续计时器
。持续计时器超时
后,向接收方发送零窗口探测报文
。当之前发送方应尽接收过了来自接收方的零窗口报文,但是接收方再次发送相应的改变发送窗口的大小的通知,如果其丢失,则会造成死锁,所以零窗口探测报文是用来打破这种僵局的。如下图所示
(4)、进行流量控制的过程
如下图所示
说明
seq
表示的是该数据段的首字节序号
,ACK
表示的是确认分组
,ack
表示的是对相应的序号之前的数据进行累计确认
,rwnd
表示的是接收方的接收窗口大小
,显然上图进行了三次流量控制
。
5. 拥塞控制
(1)、为什么需要拥塞控制?
- 拥塞:在某段时间,如果网络中的
某一资源的需求
超过了该资源所能提供的可用部分
,网络性能就会变坏。 - 如果
出现拥塞而不进行控制
,整个网络的吞吐量将随输入负荷的增大而下降
。
(2)、前提摘要
下面我们介绍的四种算法原理,假定如下条件
:
- 数据是单方向传送,而另一个方向只传送确认。
- 接收方总是有足够大的缓存空间,因而发送方发送窗口的大小由网络的拥塞程度来决定。
- 以最大报文段MSS的个数为讨论问题的单位,而不是以字节为单位。
(3)、慢开始、拥塞避免
慢开始、拥塞避免的过程说明
刚开始的时候cwnd设置为1
,ssthresh门限值设置为为16
,慢开始
阶段,cwnd以乘以2的速度进行增长
,当到达ssthresh门限值
的时候,开始拥塞避免算法
,cwnd以1进行线性增长
。当发现超时重传
时,判断出现拥塞
,cwnd重新设置为1
,将ssthresh的值设置为发生拥塞时的cwnd的值的一半
,重新开始慢开始算法。(数据自定
)
(5)、为什么需要快重传和快恢复算法?
有时候,个别报文段会在网络中丢失
,但实际上网络并未发生拥塞
。这将导致发送方超时重传,并误认为网络发生了拥塞
;发送方把拥塞窗口cwnd又设置为最小值1
,并错误地启动慢开始算法,因而降低了传输效率
。
(4)、快重传
快重传:就是使发送方尽快进行重传
,而不是等超时计时器超时再进行重传
。
- 要求接收方
不要等待自己发送数据时才进行捎带确认
,而是进行立即发送确认
。 - 即使
收到了失序的报文段
也要立即发出对已收到的报文段的重复确认
。 - 发送方
一旦收到了3个连续的重复确认
,就将相应的报文段立即重传
,而不是等该报文段的超时计时器超时再重传。
快重传的过程说明
发送方向接收方发送数据,发送数据M1、M2后都收到了接收方的确认
,但是数据M3丢失
,因此,发送方还会继续发送数据M4、M5、M6
;接收方会一直向发送方发送重复确认M2,发送方接收到三个重复确认后
,对该报文段立即重传
,而不是等到超时计时器超时。
(5)、快恢复
快恢复的过程说明
刚开始的时候cwnd设置为1
,ssthresh门限值设置为为16
,慢开始
阶段,cwnd以乘以2的速度进行增长
,当到达ssthresh门限值
的时候,开始拥塞避免算法
,cwnd以1进行线性增长
。当发现超时重传
时,判断出现拥塞
,cwnd重新设置为1
,将ssthresh的值设置为发生拥塞时的cwnd的值的一半
,重新开始慢开始算法、拥塞避免算法到cwnd为16
,此时发送方收到3个重复确认
,从而启动快重传、快恢复算法设置ssthresh为8
,然后进行拥塞避免算法。(数据自定
)
6. 超时重传时间的选择
(1)、相关概念
- RTT:一个TCP数据报文段的
往返传播时间
。 超时重传时间RTO不能小于RTT
,不然会导致不必要的重传,使网络负荷增大
超时重传时间RTO不能远大于RTT
,不然会使网络的空闲时间增大
,降低传输效率
。
(2)、超时重传时间的计算公式
这里的超时重传时间是加权平均值
。因为单纯的几个不具有普遍性,会引起极端情况
。
(3)、超时重传后需要对超时重传时间进行更新吗?
- 因为
发生了超时重传
,不能准确的计算相应的RTT,因为会被相应的重传报文段混淆
。
- 所以报文段每重传一次,就
把重传时间RTO增大一些
,典型的做法就是增大为旧值的两倍
。
7. TCP可靠传输的实现
(1)、实现方式
TCP基于以字节为单位的滑动窗口
来实现可靠传输。
- 发送方
在未收到接收方的确认
时,可将发送窗口还未发送的数据全部发送出去
。 - 接收方
只接收序号落入窗口内的数据
,如果是未按序到达的数据
,接收方会先将其存下来
。
(2)、实现过程说明
按序
刚开始的时候,发送方会收到接收方的一个确认报文段(rwnd = 20 , ack = 34
)(表示接收窗口为20,期望收到的数据的序号为34
),然后发送方向接收方发送数据,如果是按序到达
的,接收方接收到之后,将相关数据从相应的接收缓存中删除
,然后接收方的窗口向前移动
,并向发送方发送前面数据的累计确认分组
,发送方接收到后将窗口向前移动
,并将相关数据从发送缓存中删除
;
不按序
如果不是按序到达
的,那么接收方的窗口保持不变,并向接收方发送未收到的数据的序号,当超过超时时间就会触发超时重传
。
(3)、特别说明
- 同一时刻,发送方的
发送窗口
并不总是和接收方的接收窗口一样大
- 对于
不按序到达的数据
,通常会将其先临时存放在接收窗口中
,等待字节流中所缺失的字节收到后,再按序交付上层的应用进程。 - TCP要求
接收方必须有累计确认和捎带确认机制
,减少传输开销。 - TCP的通信是
全双工通信
。通信的每一方都在发送和接收报文段。
8. TCP的连接建立
(1)、TCP的连接建立要解决的三个问题
- 使TCP双方能够确知对方的存在
- 使TCP双方能够协商一些参数
- 使TCP双方能够对运输实体资源进行分配
(2)、建立过程说明
建立过程中,TCP客户机会首先发送给TCP服务器一个TCP连接请求报文(SYN = 1, seq = x)
,TCP服务器进程收到后发送一个TCP连接请求确认报文(SYN = 1,ACK = 1,seq = y,ack = x + 1)
,TCP客户端进程收到相应的报文后进入连接已建立状态
,然后向TCP服务器进程发送一个TCP普通确认报文段
,然后TCP服务器进程进入连接已建立状态
。
(3)、第三次的TCP请求的确认的确认是否多余?
不多余
,这是为了防止已失效的连接请求报文段突然又传送到TCP服务器
,因而导致错误
。
9. TCP的连接释放
(1)、 TCP客户进程向TCP服务器发送TCP连接释放报文
当TCP客户端进程要主动关闭连接时,TCP客户端进程就会向TCP服务器端发送一个TCP连接释放报文
(FIN = 1 ,ACK= 1,seq = u,ack = v)。此时TCP客户端进入终止等待状态
。
(2)、TCP服务器端进程向TCP客户端进程发送一个普通的TCP确认报文
然后TCP服务器端进程会向TCP客户端进程发送一个普通的TCP确认报文
(ACK = 1,seq = v,ack = u+ 1),且此时的TCP服务器端进入关闭等待状态
,TCP客户端进程进入终止等待状态
。
此时TCP客户端进程到TCP服务器端的进程的连接已经关闭,而TCP服务器端到TCP客户端进程的连接还未关闭
。所以此时TCP服务器端进程还可以给TCP客户端进程进行数据传输。
(3)、TCP服务器端进程向TCP客户端进程发送TCP连接释放报文
当TCP服务器端的进程数据传输完毕后,TCP服务器端进程会向TCP客户端进程发送TCP连接释放报文
(FIN = 1,ACK = 1,seq = w,ack = u + 1),且此时TCP服务器端进程进入最后确认状态
。
(4)、TCP客户端进程向TCP服务器端进程发送普通的TCP连接释放确认报文
TCP客户端进程收到TCP服务器端进程发送而来的TCP连接释放报文后,TCP客户端进程会向TCP服务器端进程发送一个普通的TCP连接释放确认报文
。且此时从TCP服务器端进程到TCP客户端进程的连接关闭。TCP服务器端进程进入关闭状态,而TCP客户端进程进入时间等待状态。经过2MSL后进入关闭状态
。
(5)、TCP客户端进程有必要进入时间等待状态吗?可以直接进入关闭状态吗?
答案是必须进入时间等待状态。因为如果在TCP客户端进程发送完毕TCP连接释放确认报文后,该报文丢失,那么TCP服务器端进程就会一直重新发送相关的TCP连接释放报文
,而如果是直接进入关闭状态的话,那么TCP无法进入关闭状态而导致资源的浪费
。
(6)、保活计时器
会出现的现象:TCP客户端出现故障,那么TCP服务器端该如何发现?
- TCP服务器进程
每收到一次TCP客户进程的数据
,就重新设置并启动保活计时器。 - 如果保活计时器定时周期内未收到TCP客户端进程发来的数据,则当其到时后,TCP服务器进程就向TCP客户端进程发送一个探测报文段,以后每隔75秒钟发送一次。如果一连发送10个探测报文仍无TCP客户端进程的响应,TCP服务器端进程就认为TCP客户端进程所在主机出现了故障,就关闭这个连接。
10. TCP首部格式
源端口: 占16比特,写入源端口号,用来 标识发送该TCP报文段的应用进程
。
目的端口: 占16比特,写入目的端口号,用来标识接收该TCP报文段的应用进程
。
序号: 占32比特,取值范围[0,2^32-1],序号增加到最后一个后,下一个序号就又回到0。指出本TCP报文段数据载荷的第一个字节的序号
。
确认号: 占32比特,取值范围[0,2^32-1],确认号增加到最后一个后,下一个确认号就又回到0。指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认
。若确认号=n,则表明到序号n-1为止的所有数据都已正确接收,期望接收序号为n的数据
。
确认标志位ACK: 取值为1时确认号字段才有效;取值为0时确认号字段无效。TCP规定,在连接建立后所有传送的TCP报文段都必须把ACK置1
。
数据偏移: 占4比特,并以4字节为单位。用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远
。这个字段实际上是指出了TCP报文段的首部长度
。
窗口: 占16比特,以字节为单位。指出发送本报文段的一方的接收窗
。
同步标志位SYN: 在TCP连接建立时用来同步序号。终止标志位FIN: 用来释放TCP连接。复位标志位RST: 用来复位TCP连接。
推送标志位PSH: 接收方的TCP收到该标志位为1的报文段会尽快上交应用进程
,而不必等到接收缓存都填满后再向上交付。
校验和: 占16比特,检查范围包括TCP报文段的首部和数据载荷两部分。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部。
紧急指针: 占16比特,以字节为单位,用来指明紧急数据的长度。
填充: 由于选项的长度可变,因此使用填充来 确保报文段首部能被4整除
,(因为数据偏移字段,也就是首部长度字段,是以4字节为单位的)。