运输层
学习参考资料:
- 湖南科技大学—计算机网络
- 谢希仁 计算机网络(第7版)
文章目录
1. 概述
运输层为相互通信的应用进程提供了逻辑通信,两台主机进行通信就是两台主机中的应用进程互相通信。
运输层向高层用户屏蔽了下面网络核心的细节,它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道。
1.1 两个主要协议
- 用户数据报协议 UDP (User Datagram Protocol)
- 传输控制协议 TCP (Transmission Control Protocol)
两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元 TPDU (Transport Protocol Data Unit)。
- TCP 传送的数据单位协议是 TCP 报文段(segment)。
- UDP 传送的数据单位协议是 UDP 报文或用户数据报。
1.2 端口
两个计算机中的进程要互相通信,不仅必须知道对方的 IP 地址(为了找到对方的计算机),而且还要知道对方的端口号(应用进程之间通信)。
2. 用户数据报协议UDP
UDP 只在 IP 的数据报服务之上增加了很少一点的功能:
- 复用和分用的功能
- 差错检测的功能
有如下特点:
UDP 是无连接的
,发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。UDP 使用尽最大努力交付
,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。UDP 是面向报文的。
UDP 没有拥塞控制
,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。很适合多媒体通信的要求。UDP 支持一对一、一对多、多对一和多对多的交互通信。
UDP 的首部开销小
,只有 8 个字节,比 TCP 的 20 个字节的首部要短。
UDP的首部格式:
- 用户数据报 UDP 有两个字段:数据字段和首部字段。
- 首部字段有 8 个字节,由 4 个字段组成,每个字段都是 2 个字节。
- 在计算检验和时,临时把 12 字节的“伪首部”和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和。
3. 传输控制协议TCP
3.1 概述
3.2 可靠运输
可靠运输采用流水线协议。 流水线传输
就是发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。这样可使信道上一直有数据不间断地传送。由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率。
3.3 TCP报文段的首部格式
TCP 虽然是面向字节流的,但 TCP 传送的数据单元却是报文段。
TCP 报文段首部的前 20 个字节是固定的,后面有 4n 字节是根据需要而增加的选项 (n 是整数)。因此 TCP 首部的最小长度是 20 字节。
- 源端口:占16比特,写入源端口号,用来
标识发送该TCP报文段的应用进程
。 - 目的端口:占16比特,写入目的端口,用来
标识接收该TCP报文段的应用进程
。 - 序号:占32比特,TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
- 确认号:占32比特,是期望收到对方的下一个报文段的数据的第一个字节的序号,同时也是对之前收到的所有数据的确认。
如果确认号为n,则表明到序号n-1为止的所有数据都已经正确接收,期望接收序号为n的数据。
- 数据偏移:占4比特,并以4字节为单位。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。最小值为5,最大值为15。
- 保留:占6比特,保留为今后使用,但目前应置为0。
- 紧急URG:当URG为1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
- 确认ACK:只有当ACK为1时确认号字段才有效;当ACK为0时确认号无效。
- 推送 PSH (PuSH):接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
- 复位 RST (ReSeT):当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
- 同步 SYN:同步 SYN = 1 表示这是一个连接请求或连接接受报文。
- 终止 FIN (FINish):用来释放一个连接。FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
- 窗口:占16比特,以字节为单位。指出发送本报文段的一方的接收窗口。
窗口值作为接收方让发送方设置其发送窗口的依据。这是以接收方的接收能力来控制发送方的发送能力,称为流量控制。
- 校验和:占16比特,检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
- 紧急指针:占16比特,以字节为单位,用来表明紧急数据的长度。
- 选项:长度可变。TCP 最初只规定了一种选项,即最大报文段长度 MSS。
- 填充:使整个首部长度是 4 字节的整数倍。
3.4 流量控制
- 一般说来,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。
- 流量控制 (flow control) 就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。
- 利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。
主机A初始时的接收窗口为400,在发送过程中,序号为201-300的数据丢失;则主机B的回传的报文中确认号为201(即还没接收的报文序号),且告诉主机A调整接收窗口为300。
主机A接收到B的报文后,调整自己的接收窗口大小,因为主机A还未收到201-300数据的确认报文,故接收窗口不能继续向前移动。此时接收窗口中可发送序号301-500的数据至主机B,主机B会保存这些数据。重传计时器超时后主机A重传201-300的数据,当主机B成功接收到201-300数据后,将201-500数据交付给上层处理,回传的确认报文中的确认号为501,并告诉主机A调整接收窗口为100。
3.5 拥塞控制
拥塞产生的原因:
拥塞控制与流量控制的区别:
拥塞控制的一般原理:
3.5.1 TCP的拥塞控制方法
控制拥塞窗口的原则:
- 只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。
- 但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。
拥塞的判断:
- 重传定时器超时:网络已经发生了拥塞。
- 收到三个重复的 ACK:预示网络可能会出现拥塞(实际可能还未发生拥塞)。
四种拥塞控制算法:
- 慢开始 (slow-start)
- 拥塞避免 (congestion avoidance)
- 快重传 (fast retransmit)
- 快恢复 (fast recovery)
慢开始阶段:
- 在主机刚刚开始发送报文段时可先将拥塞窗口 cwnd设置为一个最大报文段 MSS 的数值。
- 在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个 MSS 的数值。
- 用这样的方法逐步增大发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。
拥塞避免阶段:
- 加法增大:是指执行拥塞避免后,当收到对所有报文段的确认就将拥塞窗口 cwnd增加一个 MSS 大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。
- 乘法减小:是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即出现一次网络拥塞),就把慢慢开始阈值ssthresh 设置为当前的拥塞窗口值乘以 0.5。
- 当网络频繁出现拥塞时,ssthresh 值就下降得很快,以大大减少注入到网络中的分组数。
3.6 TCP连接的建立和释放
3.6.1 建立连接
TCP 连接的建立采用客户服务器方式:
- 主动发起连接建立的应用进程叫做客户 (client)。
- 被动等待连接建立的应用进程叫做服务器 (server)。
TCP 建立连接的过程叫做握手。握手需要在客户和服务器之间交换三个 TCP 报文段。称之为三报文握手(三次握手)
。采用三报文握手主要是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误。
如果没有TCP连接请求确认的确认:
注意:
- TCP的标准规定,SYN=1的报文段不能携带数据,但要消耗掉一个序号。
- TCP的标准规定,普通的确认报文段如果不携带数据,则不消耗序号。
3.6.2 释放连接
数据传输结束后,通信的双方都可释放连接。TCP 连接释放过程是四报文握手。
必须等待2MSL的时间吗?
- 为了保证客户端发送的最后一个 ACK 报文段能够到达服务器端。
- 防止“已失效的连接请求报文段”出现在本连接中。
如何发现客户端发生故障?