《计算机网络(第5版)》第五章 运输层
-
- 一、运输层协议概述
-
- [1. 运输层的作用](#1. 运输层的作用)
- [2. 运输层的两个主要协议](#2. 运输层的两个主要协议)
- [3. 运输层的端口](#3. 运输层的端口)
- 二、用户数据报协议(UDP)
-
- [1. UDP特点](#1. UDP特点)
- [2. UDP首部格式(8字节)](#2. UDP首部格式(8字节))
- [3. UDP检验和计算](#3. UDP检验和计算)
- 三、传输控制协议(TCP)概述
-
- [1. TCP主要特点](#1. TCP主要特点)
- [2. TCP连接](#2. TCP连接)
- 四、可靠传输的工作原理
-
- [1. 停止等待协议](#1. 停止等待协议)
- [2. 连续ARQ协议(滑动窗口协议)](#2. 连续ARQ协议(滑动窗口协议))
- 五、TCP报文段的首部格式
- 六、TCP可靠传输的实现
-
- [1. 以字节为单位的滑动窗口](#1. 以字节为单位的滑动窗口)
- [2. 超时重传时间的选择](#2. 超时重传时间的选择)
- [3. 选择确认SACK](#3. 选择确认SACK)
- 七、TCP流量控制
-
- [1. 利用滑动窗口实现流量控制](#1. 利用滑动窗口实现流量控制)
- [2. 传输效率考虑](#2. 传输效率考虑)
- 八、TCP拥塞控制
-
- [1. 拥塞控制的一般原理](#1. 拥塞控制的一般原理)
- [2. 几种拥塞控制方法](#2. 几种拥塞控制方法)
- [3. 随机早期检测RED](#3. 随机早期检测RED)
- 九、TCP的运输连接管理
-
- [1. TCP连接建立(三次握手)](#1. TCP连接建立(三次握手))
- [2. TCP连接释放(四次挥手)](#2. TCP连接释放(四次挥手))
- [3. TCP有限状态机](#3. TCP有限状态机)
- 十、重要公式与数值总结
- 十一、UDP与TCP对比总结
一、运输层协议概述

1. 运输层的作用
- 端到端通信 :真正的通信端点是主机中的进程,而不是主机本身
- 复用与分用 :
- 复用:发送方多个应用进程使用同一个运输层协议传送数据
- 分用:接收方运输层将数据正确交付给目的应用进程
- 运输层向高层用户屏蔽网络核心细节
- 网络层提供主机之间的逻辑通信,运输层提供应用进程之间的端到端逻辑通信
2. 运输层的两个主要协议

| 协议 | 全称 | 特点 | 服务 |
|---|---|---|---|
| UDP | 用户数据报协议 | 无连接,不可靠,面向报文 | 尽最大努力交付 |
| TCP | 传输控制协议 | 面向连接,可靠,面向字节流 | 可靠交付,全双工 |


3. 运输层的端口
- 端口:软件端口,用于标志应用层进程(16位,0~65535)
- 端口分类 :
- 熟知端口 (0~1023):指派给重要应用程序
- FTP:21, TELNET:23, SMTP:25, DNS:53, TFTP:69, HTTP:80, SNMP:161
- 登记端口(1024~49151):需在IANA登记
- 短暂端口(49152~65535):客户端临时使用
- 熟知端口 (0~1023):指派给重要应用程序
- 套接字(Socket):IP地址 + 端口号,唯一标识一个通信端点
- TCP连接:由两个套接字唯一确定
{IP1:port1, IP2:port2}
二、用户数据报协议(UDP)

1. UDP特点
- 无连接,不建立/释放连接
- 尽最大努力交付,不保证可靠
- 面向报文:应用层交给UDP多长的报文,就原样发送(不合并不拆分)
- 无拥塞控制
- 支持一对一、一对多、多对一、多对多通信
- 首部开销小(8字节)
2. UDP首部格式(8字节)

| 字段 | 长度 | 说明 |
|---|---|---|
| 源端口 | 2字节 | 需要对方回信时使用,否则填0 |
| 目的端口 | 2字节 | 交付报文时必须使用 |
| 长度 | 2字节 | UDP用户数据报总长度(最小8字节) |
| 检验和 | 2字节 | 检测传输是否有错,有错则丢弃 |
3. UDP检验和计算
- 伪首部 (12字节):临时添加,用于计算检验和,不向下传送
- 源IP地址(4)、目的IP地址(4)、全0(1)、协议(1, 17)、UDP长度(2)
- 计算范围:伪首部 + UDP首部 + 数据(若长度为奇数则补全0字节)
- 计算方法:二进制反码求和,结果为全1表示无差错

三、传输控制协议(TCP)概述

1. TCP主要特点
- 面向连接,必须先建立连接,结束后释放
- 每条TCP连接只能有两个端点(点对点)
- 可靠交付:无差错、不丢失、不重复、按序到达
- 全双工通信,两端都有发送缓存和接收缓存
- 面向字节流 :
- TCP把应用程序交下来的数据看成无结构的字节流
- TCP不知道字节流的含义
- 接收方应用程序收到的字节流必须与发送方发出的完全一样
2. TCP连接
- 端点:套接字(Socket)= IP地址 + 端口号
- TCP连接 = {socket1, socket2} = {(IP1:port1), (IP2:port2)}
- 同一个IP地址可以有多个TCP连接,同一个端口号可以出现在多个不同连接中
四、可靠传输的工作原理
1. 停止等待协议

原理:发送方每发送一个分组,就停止等待接收方的确认;收到确认后再发下一个。
三种情况:
- 无差错:发送 → 接收 → 确认 → 发送方收到确认 → 发下一个
- 分组丢失(超时重传):发送方启动超时计时器,超时未收到确认则重传
- 确认丢失或延迟:若确认丢失,发送方超时重传,接收方收到重复分组则丢弃并重发确认

注意:
- 每发送完一个分组必须暂时保留已发送分组的副本(以备重传)
- 分组和确认都需要编号,以便识别重复分组
- 超时计时器时间应略大于平均往返时间RTT
信道利用率:U = Td / (Td + RTT + Ta)(Td为发送时间,Ta为确认发送时间),通常较低。
2. 连续ARQ协议(滑动窗口协议)

- 流水线传输:发送方可连续发送多个分组,不必每发一个就停下来等待确认
- 滑动窗口:发送窗口内的分组可以连续发送,收到确认后窗口向前滑动
- 累积确认:接收方只对按序到达的最后一个分组发送确认,表示该分组之前的所有分组都已正确收到
- Go-back-N:如果某个分组丢失,发送方重传从丢失分组开始之后的所有分组
五、TCP报文段的首部格式

TCP首部最小20字节,最大60字节(可选字段)。固定部分各字段:
| 字段 | 长度 | 说明 |
|---|---|---|
| 源端口 | 16位 | |
| 目的端口 | 16位 | |
| 序号 | 32位 | 本报文段所发送数据的第一个字节的序号(mod 2^32) |
| 确认号 | 32位 | 期望收到对方下一个报文段第一个字节的序号,且确认该序号之前所有数据已收到 |
| 数据偏移 | 4位 | TCP首部长度(单位32位字,最小5,最大15) |
| 保留 | 6位 | 保留为今后使用,应为0 |
| URG | 1位 | 紧急指针有效 |
| ACK | 1位 | 确认号有效(连接建立后所有报文段ACK=1) |
| PSH | 1位 | 推送,接收方应尽快交付应用层 |
| RST | 1位 | 复位,连接出现严重差错,释放连接 |
| SYN | 1位 | 同步,用于连接建立(SYN=1表示连接请求或接受) |
| FIN | 1位 | 终止,用于释放连接 |
| 窗口 | 16位 | 接收窗口大小(流量控制),单位字节 |
| 检验和 | 16位 | 计算范围:伪首部+TCP首部+数据 |
| 紧急指针 | 16位 | URG=1时有效,指出紧急数据的字节数 |
| 可选字段 | 可变 | 如MSS(最大报文段长度)、窗口扩大、SACK、时间戳等 |
| 填充 | 可变 | 使首部长度为4字节的整数倍 |
关键点:
- 序号:TCP是面向字节流的,序号基于字节编号(不是报文段编号)
- 确认号:期望收到的下一个序号,同时隐含确认之前所有数据(累积确认)
- 检验和:与UDP类似,需要伪首部(但协议字段=6)
六、TCP可靠传输的实现
1. 以字节为单位的滑动窗口

窗口概念:
- 发送窗口:允许发送的字节序号范围(由接收窗口和拥塞窗口共同决定)
- 接收窗口:接收方允许接收的字节数(通过TCP首部的"窗口"字段通告)
- 滑动 :收到确认后,窗口向前滑动

发送方发送窗口内的三种状态:
- 已发送并已确认(窗口外左侧)
- 已发送但未确认(窗口内)
- 允许发送但尚未发送(窗口内)
- 不允许发送(窗口外右侧)

接收方:
- 接收窗口内的数据:期望收到,收下并缓存
- 按序到达的数据交给应用层,并滑动窗口
- 失序到达的数据暂存,等待缺失部分补齐

2. 超时重传时间的选择

- RTT:报文段发出到收到确认的时间
- 加权平均RTT(平滑RTT) :
RTTs = (1-α)·RTTs + α·RTT,α推荐0.125 - RTT偏差 :
RTTd = (1-β)·RTTd + β·|RTT - RTTs|,β推荐0.25 - 超时重传时间RTO :
RTO = RTTs + 4·RTTd
Karn算法:发生重传的报文段不用于计算RTT;且当重传时,RTO加倍(指数退避)
3. 选择确认SACK
- 若接收方收到失序数据,可告知发送方哪些数据已收到(需要SACK选项)
- 发送方只重传缺失的数据,避免重复传输
七、TCP流量控制
1. 利用滑动窗口实现流量控制
- 接收方通过TCP首部的"窗口"字段告知发送方自己的接收窗口大小(rwnd)
- 发送方保证未确认数据量不超过接收窗口
- 零窗口 :接收窗口=0,发送方停止发送,并启动持续计时器
- 持续计时器超时后,发送方发送零窗口探测报文(1字节),接收方回复当前窗口

- 持续计时器超时后,发送方发送零窗口探测报文(1字节),接收方回复当前窗口
2. 传输效率考虑
- Nagle算法:减少小分组数量。在已发送数据未确认前,将后续小数据合并发送;或等到数据达到MSS再发
- 糊涂窗口综合征:接收方每次只通告很小的窗口。解决:接收方窗口小于一定值(如MSS)时通告0;发送方避免发送小数据
八、TCP拥塞控制
1. 拥塞控制的一般原理
- 拥塞:对网络资源的需求超过可用量,导致性能下降
- 拥塞控制:全局性过程,防止过多数据注入网络
- 流量控制:端到端问题,控制发送速率不压垮接收方
- TCP拥塞控制基于拥塞窗口(cwnd),实际发送窗口 = min(cwnd, rwnd)
2. 几种拥塞控制方法
慢启动(Slow Start):
- 初始cwnd=1 MSS(或2-4个MSS)
- 每收到一个ACK,cwnd加倍(指数增长)
- 直到cwnd ≥ 慢启动阈值(ssthresh)
拥塞避免(Congestion Avoidance):
- cwnd达到ssthresh后,每经过一个RTT,cwnd增加1 MSS(线性增长)
- 目的:避免网络拥塞
快重传(Fast Retransmit):
- 接收方每收到一个失序报文段,立即发送重复ACK(不等待)
- 发送方连续收到3个重复ACK ,立即重传丢失报文段(不等超时)

快恢复(Fast Recovery):
- 收到3个重复ACK时:ssthresh = cwnd/2,cwnd = ssthresh + 3 MSS(或直接设为ssthresh)
- 然后进入拥塞避免阶段
拥塞控制流程图解:
cwnd
|
慢启动 拥塞避免
指数增长 线性增长
| |
ssthresh ssthresh
超时与重复ACK的处理:
- 超时:ssthresh = cwnd/2,cwnd = 1 MSS,重新慢启动(慢启动+拥塞避免)
- 收到3个重复ACK:快重传+快恢复(不回到慢启动)
3. 随机早期检测RED
- 在路由器中实现,主动检测队列长度,提前以概率丢弃分组(避免全局同步)
- 使TCP连接在拥塞前就开始减少发送窗口
九、TCP的运输连接管理
1. TCP连接建立(三次握手)

步骤(以客户端A、服务器B为例):
- 第一次握手(A → B):A发送SYN=1, seq=x(SYN报文段,不携带数据,消耗一个序号)
- 第二次握手(B → A):B收到后,发送SYN=1, ACK=1, seq=y, ack=x+1(SYN+ACK报文段)
- 第三次握手(A → B):A收到后,发送ACK=1, seq=x+1, ack=y+1(可携带数据,若不携带则不消耗序号)
连接建立后,全双工通信。
2. TCP连接释放(四次挥手)

- 第一次挥手 (A → B):A发送FIN=1, seq=u(FIN报文段,消耗一个序号),A进入FIN-WAIT-1状态
- 第二次挥手 (B → A):B收到FIN后,发送ACK=1, seq=v, ack=u+1,B进入CLOSE-WAIT 状态。A收到后进入FIN-WAIT-2状态
- 第三次挥手 (B → A):B发送完所有数据后,发送FIN=1, ACK=1, seq=w, ack=u+1,B进入LAST-ACK状态
- 第四次挥手 (A → B):A收到FIN后,发送ACK=1, seq=u+1, ack=w+1,A进入TIME-WAIT 状态(等待2MSL),B收到后进入CLOSED状态
2MSL等待(Maximum Segment Lifetime):
- 保证A最后发送的ACK能到达B(若丢失,B会重发FIN,A可再确认)
- 防止"已失效的连接请求报文段"出现在新连接中
3. TCP有限状态机

关键状态转换:
- LISTEN → SYN-SENT(主动打开)
- LISTEN → SYN-RCVD(被动打开)
- SYN-SENT → ESTABLISHED(收到SYN+ACK)
- ESTABLISHED → FIN-WAIT-1(主动关闭)
- ESTABLISHED → CLOSE-WAIT(被动关闭)
- TIME-WAIT → CLOSED(经过2MSL)
十、重要公式与数值总结
| 公式/数值 | 说明 |
|---|---|
| UDP首部长度 | 8字节 |
| TCP首部最小长度 | 20字节 |
| TCP端口号范围 | 0~65535 |
| 熟知端口 | 0~1023 |
| TCP序号空间 | 2^32 |
| RTO = RTTs + 4·RTTd | 超时重传时间 |
| 慢启动初始cwnd | 1~4 MSS |
| 快重传阈值 | 3个重复ACK |
| 2MSL时间 | 2 × MSL(通常2分钟) |
| 持续计时器 | 防止零窗口死锁 |
十一、UDP与TCP对比总结
| 特性 | UDP | TCP |
|---|---|---|
| 连接 | 无连接 | 面向连接 |
| 可靠性 | 不可靠(尽最大努力) | 可靠(确认、重传、序号) |
| 流量控制 | 无 | 有(滑动窗口) |
| 拥塞控制 | 无 | 有(慢启动、拥塞避免等) |
| 报文边界 | 面向报文(保留) | 面向字节流(无边界) |
| 首部开销 | 8字节 | 20~60字节 |
| 通信模式 | 一对一、一对多、多对一、多对多 | 点对点 |
| 应用示例 | DNS, SNMP, 实时音视频 | HTTP, FTP, SMTP, Telnet |