【TCP/IP】8. 传输层协议
8. 传输层协议
- 8. 传输层协议
- 概述
- 8.1 进程间通信
- 8.1.1 端口与端口号
- 8.1.2 端口分配方式
- 8.1.3 端口号范围及分类
- 8.1.4 进程标识与关联
- 8.1.5 客户 / 服务器模型
- 8.2 TCP 段格式
- 8.2.1 首部字段(20~60 字节)
- 8.2.2 伪首部
- 8.3 TCP 连接的建立和拆除
- 8.3.1 连接建立(三次握手)
- 8.3.2 连接拆除(四次握手)
- 8.4 TCP 流量控制
- 8.4.1 滑动窗口原理
- 8.4.2 特例:停等协议
- 8.5 TCP 拥塞控制
- 8.5.1 发送窗口的决定因素
- 8.5.2 拥塞控制策略
- 8.6 TCP 差错控制
- 8.6.1 错误类型及处理
- 8.6.2 超时重传定时
- 8.7 TCP 状态转换图
- 8.8 用户数据报协议(UDP)
- 8.8.1 UDP 数据报格式
- 8.8.2 UDP 特点
- 8.8.3 TCP 与 UDP 对比
- 8.9 流控制传输协议(SCTP)
- 8.9.1 核心概念
- 8.9.2 关键功能
- 8.9.3 偶联建立与关闭
- 本章要点
8. 传输层协议
概述
传输层的核心目的是弥补和加强通信子网的服务:
- 弥补:提供端到端的进程间通信(网络层仅提供点到点传输);
- 加强:提升服务质量(QoS),尤其是可靠性(需权衡开销,故提供多种服务类型供选择)。
TCP/IP 传输层的三个核心协议:
- 传输控制协议(TCP):面向连接、高可靠,适用于可靠性较差的广域网;
- 用户数据报协议(UDP):无连接、高效率,适用于可靠性较高的局域网;
- 流控制传输协议(SCTP):面向报文、可靠,适合流式通信(如多媒体、信令传输)。
8.1 进程间通信
传输层的核心是实现源进程到目的进程的端到端通信,关键是解决进程标识问题。
8.1.1 端口与端口号
- 端口:抽象的软件结构(含数据结构和 I/O 缓冲区),是进程访问传输服务的入口,也是通信进程的标识。
- 端口号:16 比特标识符(范围 0~65535),用于标识主机上的特定进程。
8.1.2 端口分配方式
分配方式 | 特点 | 适用场景 |
---|---|---|
全局分配 | 由权威机构(如 ICANN)统一分配,端口号固定 | 常用服务(如 HTTP、FTP),方便寻址 |
本地分配 | 进程动态向操作系统申请,使用后释放 | 临时通信,灵活适应大量应用 |
8.1.3 端口号范围及分类
范围 | 类型 | 用途 |
---|---|---|
0~1023 | 熟知端口(保留端口) | 标准服务的服务器端(如 HTTP 用 80,FTP 控制用 21) |
1024~49151 | 注册端口 | 企业应用软件的固定端口(需注册以避免冲突) |
49152~65535 | 动态端口(临时端口) | 客户端进程临时使用,用完释放 |
8.1.4 进程标识与关联
- 全局唯一进程标识:三元组
(协议,主机地址,端口号)
(协议区分 TCP/UDP/SCTP)。 - 进程关联:描述两个通信进程的关系,用五元组
(协议,本地主机地址,本地端口号,远地主机地址,远地端口号)
。
8.1.5 客户 / 服务器模型
- 交互流程:客户向服务器发送服务请求→服务器处理并响应。
- 地址特点:服务器使用熟知端口(固定且公开),客户使用临时端口(动态分配)。
8.2 TCP 段格式
TCP 将应用层数据分块封装为TCP 段(不定长),格式如下:
8.2.1 首部字段(20~60 字节)
字段 | 长度(比特) | 含义 |
---|---|---|
源端口 | 16 | 发送进程的端口号 |
目的端口 | 16 | 接收进程的端口号 |
序号 | 32 | 本段数据第一个字节在发送端数据流中的位置(用于按序重组) |
确认号 | 32 | 期望接收的下一字节序号(表示该序号前的数据已正确接收,实现累计确认) |
HLEN(首部长度) | 4 | 以 32 位字为单位的首部长度(定长部分 20 字节,故最小值为 5;含选项时最大为 15,即 60 字节) |
保留 | 4 | 留作将来使用(置 0) |
控制位 | 8 | 含 8 个标志位,分别为: - CWR:拥塞窗口缩减标志(响应 ECN); - ECE:ECN 响应标志(通知对方网络拥塞); - URG:紧急位(紧急数据优先传输,配合紧急指针); - ACK:确认位(确认号有效); - PSH:推送位(立即发送 / 提交数据,不等待缓冲区满); - RST:复位位(连接异常时释放连接); - SYN:同步位(建立连接时请求同步序号); - FIN:终止位(请求释放连接) |
窗口大小 | 16 | 接收方当前可用接收缓冲区大小(字节),用于流量控制 |
校验和 | 16 | 校验范围包括段首部、数据及伪首部(确保数据完整性) |
紧急指针 | 16 | URG=1 时有效,指示本段中紧急数据的最后一个字节位置 |
选项(+ 填充) | 0~40 字节 | 变长字段,常用选项: - 最大段大小(MSS):协商最大数据段长度(默认 536 字节); - 窗口规模因子:扩展窗口大小(新窗口=原窗口×2^因子 ); - 选择确认(SACK):报告失序 / 重复数据,优化重传; - 时间戳:计算往返时间(RTT),防止序号绕回 |
8.2.2 伪首部
- 作用:验证 TCP 段是否传送到正确信宿(补充端口号无法覆盖的主机和协议信息)。
- 内容:源 IP 地址、目的 IP 地址、保留(0)、协议(TCP=6)、TCP 段长度(字节)。
8.3 TCP 连接的建立和拆除
TCP 是面向连接的协议,连接管理通过 “握手” 实现。
8.3.1 连接建立(三次握手)
- 目的:同步双方序号,建立双向连接,防止重复连接。
- 过程:
- 第一次握手:客户→服务器,发送
SYN=1
,携带客户端初始序号(SEQ=x); - 第二次握手:服务器→客户,发送
SYN=1,ACK=1
,携带服务器初始序号(SEQ=y)和确认号(ACK=x+1); - 第三次握手:客户→服务器,发送
ACK=1
,携带确认号(ACK=y+1)。
- 第一次握手:客户→服务器,发送
- 特点:前两次握手消耗序号(SYN=1 时序号 + 1),第三次握手不消耗序号。
8.3.2 连接拆除(四次握手)
-
目的:确保双方数据均已传输完毕,有序释放双向连接。
-
过程
(假设 A 主动关闭):
- A→B:发送
FIN=1
,请求关闭 A→B 方向连接(SEQ=a); - B→A:发送
ACK=1
,确认关闭(ACK=a+1),此时 A→B 方向关闭(半关闭); - B→A:发送
FIN=1
,请求关闭 B→A 方向连接(SEQ=b); - A→B:发送
ACK=1
,确认关闭(ACK=b+1),此时 B→A 方向关闭,连接完全释放。
- A→B:发送
8.4 TCP 流量控制
- 目的:协调发送方与接收方的速率,避免接收方因缓冲区溢出丢失数据。
- 机制:滑动窗口协议,通过发送窗口和接收窗口的动态调整实现。
8.4.1 滑动窗口原理
- 接收窗口:接收方通过 TCP 段的 “窗口大小” 字段通告当前可用缓冲区大小(
接收窗口=缓存总大小-未提交数据量
)。 - 发送窗口:发送方窗口大小≤接收方窗口大小,限制连续发送的数据量(无需等待每个段的确认)。
- 窗口滑动:当接收方确认部分数据后,发送窗口向右滑动,释放已确认数据的缓冲区,纳入新数据。
8.4.2 特例:停等协议
当发送窗口大小 = 1 时,每发送一个字节需等待确认,效率极低,仅用于简单场景。
8.5 TCP 拥塞控制
- 拥塞:网络中路由器超载导致的延迟 / 丢包,可能引发 “丢包→重传→更拥塞” 的恶性循环。
- 机制:通过控制发送方的拥塞窗口调节注入网络的数据流速度。
8.5.1 发送窗口的决定因素
发送窗口大小 = min(接收方通告窗口大小,拥塞窗口大小)
- 接收方通告窗口:反映接收方处理能力;
- 拥塞窗口:反映网络处理能力(动态调整)。
8.5.2 拥塞控制策略
- 慢启动:
- 连接建立时,拥塞窗口初始化为 1 个最大段大小(MSS);
- 每收到一个确认,拥塞窗口翻倍(指数增长),直到达到门限值(初始为 65535 字节)。
- 拥塞避免:
- 当拥塞窗口≥门限值时,每经过一个往返时间(RTT),拥塞窗口增加 1 个 MSS(线性增长),减缓增长速度。
- 拥塞解决:
- 若发生超时重传(检测到拥塞),将门限值设为当前拥塞窗口的一半,拥塞窗口重置为 1 个 MSS,重新进入慢启动。
8.6 TCP 差错控制
- 目的:处理数据传输中的错误(破坏、重复、失序、丢失),保证数据可靠交付。
8.6.1 错误类型及处理
错误类型 | 检测方式 | 处理方法 |
---|---|---|
数据破坏 | 校验和 | 接收方丢弃,发送方超时重传 |
重复数据 | 序号 | 接收方丢弃重复段,仍发送确认 |
数据失序 | 序号 | 接收方暂存失序数据,等待前面数据到达后一并确认 |
数据丢失 | 超时重传机制 | 发送方超时后重传未确认数据 |
8.6.2 超时重传定时
- 核心:动态调整重传定时器的超时时间(Timeout),适应往返时间(RTT)的变化。
- 算法:
- 估算平滑 RTT(RTTS):
RTTS(n) = (1-α)×RTTS(n-1) + α×RTTM(n)
(α=1/8,RTTM 为实测 RTT); - 估算 RTT 偏差(RTTD):
RTTD(n) = (1-β)×RTTD(n-1) + β×|RTTS(n)-RTTM(n)|
(β=1/4); - 计算超时时间:
Timeout = RTTS + 4×RTTD
。
- 估算平滑 RTT(RTTS):
8.7 TCP 状态转换图
TCP 通过有限状态机描述连接生命周期,关键状态及转换如下:
状态 | 含义 | 典型转换事件 |
---|---|---|
CLOSED | 无连接状态 | 服务器 “被动打开”→LISTEN;客户端 “主动打开”→SYN-SENT |
LISTEN | 监听状态 | 收到 SYN→SYN-RCVD |
SYN-SENT | 已发送 SYN | 收到 SYN+ACK→ESTABLISHED |
SYN-RCVD | 已收到 SYN | 发送 ACK→ESTABLISHED |
ESTABLISHED | 连接已建立 | 发送 FIN→FIN-WAIT-1;收到 FIN→CLOSE-WAIT |
FIN-WAIT-1 | 已发送 FIN(等待 ACK) | 收到 ACK→FIN-WAIT-2;收到 FIN→CLOSING |
FIN-WAIT-2 | 半关闭(等待对方 FIN) | 收到 FIN→发送 ACK→TIME-WAIT |
CLOSE-WAIT | 收到 FIN(等待应用关闭) | 应用关闭→发送 FIN→LAST-ACK |
LAST-ACK | 已发送 FIN(等待 ACK) | 收到 ACK→CLOSED |
CLOSING | 双方同时发送 FIN | 收到 ACK→TIME-WAIT |
TIME-WAIT | 等待超时(确保对方收到 ACK) | 超时(通常 30 秒)→CLOSED |
8.8 用户数据报协议(UDP)
UDP 是无连接的传输层协议,在 IP 基础上增加进程通信能力,牺牲可靠性换取高效率。
8.8.1 UDP 数据报格式
-
首部
(定长 8 字节):
- 源端口(16 比特):发送进程端口(可置 0);
- 目的端口(16 比特):接收进程端口;
- 总长度(16 比特):UDP 数据报总字节数(首部 + 数据,最大 65535);
- 校验和(16 比特,可选):校验范围包括首部、数据及伪首部(验证信宿正确性)。
8.8.2 UDP 特点
- 无连接:发送前无需建立连接,开销低;
- 不可靠:不提供流量控制、拥塞控制和确认机制,数据可能丢失、失序;
- 高效率:适用于交易型应用(如 DNS 查询)、实时通信(如视频会议)。
8.8.3 TCP 与 UDP 对比
特性 | TCP | UDP |
---|---|---|
连接性 | 面向连接 | 无连接 |
可靠性 | 高(确认、重传、排序) | 低(仅校验和) |
开销 | 大(握手、窗口管理等) | 小(仅 8 字节首部) |
适用场景 | 大数据传输(如文件下载) | 小数据交互(如 DNS)、实时通信 |
8.9 流控制传输协议(SCTP)
SCTP 是为流式通信设计的可靠传输协议,结合 TCP 的可靠性和 UDP 的高效性,适用于多媒体、信令传输(如 IP 电话)。
8.9.1 核心概念
- 传送地址:
IP地址+SCTP端口号
,标识端点的通信地址; - 端点:逻辑实体,可关联多个传送地址(多归属);
- 偶联:两个端点间的关联(含协议状态信息),类似 TCP 连接;
- 流:偶联中的单向逻辑通道,流内数据按序提交,流间独立;
- 传输序号(TSN):标识数据块,用于确认和重传;
- 流序号(SSN):标识流内数据块的顺序。
8.9.2 关键功能
- 偶联建立:四次握手(避免 SYN 泛洪攻击);
- 流内顺序提交:流内数据按序交付,流间不影响;
- 分组验证:通过校验和确保数据完整性;
- 通路管理:支持多通路(多归属),故障时切换通路;
- 拥塞控制:类似 TCP(慢启动、拥塞避免)。
8.9.3 偶联建立与关闭
- 建立:四次握手(交换 INIT、INIT ACK、COOKIE ECHO、COOKIE ACK);
- 关闭:三次握手(发送 SHUTDOWN、SHUTDOWN ACK、SHUTDOWN COMPLETE),不支持半关闭。
本章要点
- 传输层通过端口标识进程,用三元组
(协议,主机地址,端口号)
全局唯一标识进程。 - TCP 是面向连接的可靠协议,通过三次握手建立连接、四次握手拆除连接,利用滑动窗口实现流量控制,通过拥塞窗口实现拥塞控制,通过超时重传处理差错。
- UDP 是无连接的高效协议,适用于实时通信,仅提供简单校验和。
- SCTP 是面向报文的可靠协议,支持多流、多通路,适用于流式通信。
- 端口号分熟知端口(0~1023)、注册端口(1024~49151)、动态端口(49152~65535)。