第三章 传输层
第一节 传输层的基本服务
1.1 传输层功能
-
传输层的核心任务是为应用进程之间提供端到端的逻辑通信服务。
-
通信的真正端点并不是主机,而是主机中运行的应用进程。
主要功能
- 传输层寻址
- 应用层报文的分段和重组
- 报文的差错检测
- 进程间的端到端可靠数据传输控制
- 面向应用层实现复用与分解
- 端到端的流量控制
- 拥塞控制
1.2 传输层寻址与端口
-
用统一的寻址方法对应用进程进行标识 —— 端口号。
-
在全网范围内利用
IP地址 + 端口号
唯一标识一个通信端点。
三类端口
熟知端口号
,数值为 0 ~ 1023。登记端口号
,数值为 1024 ~ 49151,为没熟知端口号的应用程序使用的。使用这个范围的端口号必须在 IANA 登记以防止重复。客户端口号或短暂端口号
。数值为 49152 ~ 65535,留给客户进程选择暂时使用。
常见协议的端口号
- FTP:21(TCP)
- HTTP:80(TCP)
- SMTP:25(TCP)
- POP3:110(TCP)
- DNS:53(UDP)
1.3 无连接服务于面向连接服务
传输层提供的服务可以分为 无连接服务
和 面向连接服务
两大类。
无连接服务(UDP)
数据传输之前无需与对端进行任何信息交换(即“握手”),直接构造传输层报文段并向接收端发送。
面向连接服务(TCP)
在数据传输之前,需要双方交换一些控制信息,建立逻辑连接,然后再传输数据,数据传输结束后还需要再拆除连接。
第二节 传输层的复用与分解
多路复用与多路分解
是传输层的一项基本功能,支持众多应用进程共用同一个传输层协议,并能够将接收到的数据准确交付给不同的应用进程。
无连接的多路复用与多路分解
UDP 套接字的端口号是 UDP 实现复用与分解的重要依据。
UDP 依据二元组<目的IP地址,目的端口号>来标识一个 UDP 套接字。
面向连接的多路复用与多路分解
TCP 依据四元组<源IP地址,源端口号、目的IP地址、目的端口号>来标识一个 TCP 套接字,即标识一条 TCP 连接。
第三节 停-等协议与滑动窗口协议
可以实现可靠数据传输的协议有 停-等协议
和 滑动窗口协议
。
可靠数据传输基本原理
- 差错检测:利用差错编码实现数据包传输过程中的比特差错检测。
- 确认:接收方向发送方反馈接收状态。
- 重传:发送方重新发送接收方没有正确接收的数据。
- 序号:确保数据按序提交。
- 计时器:解决数据丢失问题。
停-等协议
停-等协议的主要特点就是每发送一个报文段后就停下来等待接收方的确认。
停-等协议的基本工作过程
- 发送方发送经过差错编码和编号的报文段,等待接收方的确认;
(发送并等待确认)
- 接收方如果正确接收报文段,即差错检测无误且序号正确,则接收报文段,并向发送方发送 ACK,否则丢弃报文段,并向发送方发送 NAK;
(接收并确认/否认)
- 发送方如果收到 ACK,则继续发送后续报文段,否则重发刚刚发送的报文段。
(继续发送/重发)
滑动窗口协议
由于 停-等协议
的机制问题,会降低信道利用率。为了解决这个问题,设计了流水线协议或管道协议——允许发送方在没有收到确认前连续发送多个分组。
典型的流水线协议:滑动窗口协议
两种最具有代表性的滑动窗口协议:
GBN 协议(Go-Back-N,回退N步)
发送端窗口大小较大,可以在未得到确认前连续发送多个分组,但接收窗口大小仅为1,只能接收1个按序到达的分组,未按序到达的分组或某个分组差错,就会引起发送方重发该分组及其之后的所有分组。
SR 协议(Selective Repeat,选择重传)
增加接收方缓存能力(接收窗口 > 1),缓存正确到达但失序的分组,仅要求发送方重传未被接收方确认的分组,等缺失分组到达后一并向上层按序提交。
第四节 用户数据包协议(UDP)
用户数据包协议 UDP 是 Internet 传输层协议,提供 无连接
、不可靠
、数据报尽力传输服务
。比如 DNS。
UDP 数据报结构
一个数据报包含 首部
和 数据
,UDP 首部只有4个字段,每个字段由2个字节组成。
数据报结构如图:
- 源端口号和目的端口号:用于 UDP 实现复用与分解。
- 长度字段:指示 UDP 报文段中的字节数(首部和数据的总和)。
- 校验和:接收方用来检测该报文段是否出现了差错。
UDP 校验和
UDP 校验和提供了差错检测功能。
计算校验和
- 对所有参与运算的内容按16位对其求和;
- 求和过程中遇到的任何溢出(即进位)都被回卷(即进位与和的最低位相加);
- 最后得到的和取反码;
二进制加法如何运算:
第五节 传输控制协议(TCP)
- TCP 提供全双工通信服务,即 TCP 允许通信双方的应用进程在任何时候都能发送数据和接收数据。
- TCP 连接的两端都设有发送缓存与接收缓存,用来临时存放双向通信的数据。
- MSS(最大报文段长度)是指在报文段中封装的应用层数据的最大长度,而不是指包括 TCP 首部的 TCP 报文段的最大长度。
TCP 报文段结构
1️⃣ 源端口号与目的端口号(16位):
标识发送该报文段的源端口号和目的端口号,用于多路复用/分解来自或送到上层应用的数据。
2️⃣ 序号字段与确认序号(32位):
序号字段是该段所封装的应用层数据的第一个字节的序号。确认序号是期望从对方接收数据的字节序号,即该序号所对应的字节尚未收到,该序号之前的字节已全部正确接收,也就是说,TCP 采用累积确认机制。
3️⃣ 首部长度(4位):
指出 TCP 段的首部长度,以4字节为计算单位,比如该字段值为5时,表示 TCP 段的首部长度为20字节。
4️⃣ URG、ACK、PSH、RST、SYN 和 FIN 字段各占1位(共占6位):
- URG = 1:表明紧急指针字段有效,通知系统此报文段中有紧急数据,应尽快传送。
- ACK = 1:标识确认序号字段有效。
- PSH = 1:尽快将报文段中的数据交付接收应用进程。
- RST = 1:表明 TCP 连接中出现严重差错,必须释放连接,然后再重新建立 TCP 连接。
- SYN = 1:表示该 TCP 报文段是一个建立新连接请求控制段或者是同意建立新连接的确认段(此时ACK=1)。
- FIN = 1:表明该 TCP 报文段的发生端数据已发送完毕,并请求释放 TCP 连接。
5️⃣ 接收窗口(16位):
用于向对方通告接收窗口大小,用于实现 TCP 的流量控制。
6️⃣ 校验和(16位):
校验和字段检验的范围类似于 UDP,提供了差错检测功能。
7️⃣ 紧急指针(16位):
该字段只有 URG = 1 时才有效,指出在本 TCP 报文段中紧急数据共有多少个字节。注意,即使接收窗口大小为零时,也可以发送紧急数据。
8️⃣ 填充字段(0~3字节):
取值为0,其目的是为了使整个首部长度是4字节的整数倍。
TCP 连接管理
TCP 连接包括 连接建立
与 连接拆除
。
连接建立
TCP 连接建立的 “三次握手” 过程如下:
? 主机A的 TCP 向主机B发出连接请求报文段。第一次握手
? 主机B收到连接请求报文段后,如同意,则返回确认报文段。第二次握手
? 主机A收到主机B的确认报文段后,向主机B发送确认报文段。第三次握手
❗ 第一次握手和第二次握手的 TCP 报文段不携带数据,第三次握手的 TCP 报文段可以携带数据。
? 连接建立过程图示:
连接拆除
TCP 连接释放的 “四次挥手” 过程如下:
? 主机A向主机B发送释放连接报文段。第一次挥手
? 主机B向主机A发送确认报文段。第二次挥手
? 主机B向主机A发送释放连接报文段。第三次挥手
? 主机A向主机B发送确认报文段。主机B收到该确认报文段,可以马上释放连接;主机A在发出确认报文段后,延迟一段时间即释放连接。第四次挥手
❗ TCP 采用四次挥手进行断开连接的主要原因:
为了确保断开连接过程的可靠,不会由于不可靠断开连接而破坏 TCP 的可靠数据传输;TCP 的四次挥手断开连接是对称断开连接,要求两端都主动提出断开连接请求,这样可以确保双方均能确认是否已全部收到对方的数据,达到可靠数据传输的目的。
? 连接拆除过程图示:
TCP 可靠数据传输
- TCP 的可靠数据传输实现机制包括差错编码、确认、序号、重传、计时器等。
- TCP 的可靠数据传输是基于滑动窗口协议,但是发送窗口大小是动态变化的,发送窗口取决于流量控制的接收端通告的窗口大小和实现拥塞控制的拥塞窗口大小,任一时刻 TCP 发送窗口都取值这两个窗口的最小值。
TCP 的可靠数据传输服务通过以下工作机制来实现:
1️⃣ 应用数据被分割成数据块(通常是 MSS),封装成 TCP 报文段传递给 IP。
2️⃣ 发出报文段后启动一个计时器,如果不能及时收到确认(丢失),将重发该报文段。
3️⃣ 通过校验和字段检测数据在传输过程中是否发生差错。
4️⃣ 根据序号对收到的数据重新排序和丢弃重复的报文段。
5️⃣ 提供流量控制,控制发送端发送数据的速度,防止接收端的缓冲区溢出。
TCP 流量控制
流量控制目的
协调发送方与接收方的数据发送与接收速度,避免因发送方发送数据太快,超出接收方的数据接收和处理能力,导致数据在接收方被丢弃。
TCP 如何实现流量控制
实现流量控制的方法有很多,基本原理可以采用停-等协议或滑动窗口协议来实现。虽然 TCP 协议实现流量控制也是利用窗口协议,但不是简单的滑动窗口协议。
1️⃣ 利用窗口协议来限制发送方发送数据的速率。
2️⃣ TCP 连接建立时,双方都为之分配了固定大小的缓冲空间。TCP 的接收端只允许发送端发送接收端缓冲区所能接纳的数据。
- 接收端在给发送端发送确认报文段时,通告接收窗口大小。
- 发送端在接下来发送数据报文段时,确保未确认报文段的应用层数据总量不超过接收端通告的接收窗口大小,从而确保接收端不会发生缓存溢出。
TCP 拥塞控制
拥塞
拥塞是指太多主机以太快的速度向网络中发送太多的数据,超出了网络处理能力,导致大量数据分组“拥挤”在网络中间设备(如路由器)队列中等待转发,网络性能显著下降的现象。
拥塞控制
拥塞控制就是通过合理调度、规范、调整向网络中发送数据的主机数量、发送速率或数据量,以避免拥塞或尽快消除已发生的拥塞。
TCP 拥塞控制机制:
1️⃣ 窗口机制:通过调节窗口的大小实现对发送数据速率的调整
2️⃣ 窗口调整的基本策略:加性增加,乘性减小:网络未发生拥塞时,逐渐“加性”增大窗口大小,当网络拥塞时“乘性”快速减小窗口大小。
3️⃣ TCP 的拥塞控制算法:包括了慢启动、拥塞避免、快速重传和快速恢复。