计算机网络--传输层(1)
第五章 传输层
一、传输层基本功能
-
进程到进程的逻辑通信
- 套接字(Socket):
IP地址:端口号
- IP地址:标识主机(网络层功能)
- 端口号:16位整数(0-65535),标识进程
- 熟知端口(0-1023):如 HTTP(80)、FTP(21)
- 注册端口(1024-49151):由 IANA 分配(如 MySQL 3306)
- 动态端口(49152-65535):临时分配
- 套接字(Socket):
-
数据单元
- 传输层:报文段(TCP)/ 用户数据报(UDP)
- 对比其他层:
- 物理层:比特流
- 链路层:帧
- 网络层:IP 数据报
二、TCP与UDP协议对比
特性 | TCP | UDP |
---|---|---|
连接管理 | 三次握手、四次挥手 | 无连接 |
可靠性 | 保证交付(ACK确认、重传机制) | 不保证交付 |
有序性 | 按序交付(序列号、确认号) | 可能乱序 |
流量控制 | 滑动窗口机制 | 无流量控制 |
拥塞控制 | 慢启动、拥塞避免等算法 | 无拥塞控制 |
首部长度 | 20字节(最小)+ 选项 | 8字节 |
传输效率 | 较低(首部开销大,确认机制) | 较高(首部开销小,无确认) |
三、TCP协议深度解析
-
TCP报文段结构
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |U|A|P|R|S|F| | | Offset| Reserved |R|C|S|S|Y|I| Window | | | |G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 控制位详解:
- URG:紧急指针有效(用于紧急数据)
- ACK:确认号有效(仅当
ACK=1
时,确认号字段有效) - PSH:接收方应尽快将数据交付给应用层
- RST:重置连接(用于异常终止)
- SYN:同步序号(连接建立时使用)
- FIN:结束传输(连接释放时使用)
- 控制位详解:
-
可靠性机制
- 超时重传:若发送方未在超时时间内收到 ACK,重传数据
- 流量控制:通过滑动窗口(Window 字段)告知对方接收能力
- 拥塞控制:
- 慢启动:初始窗口小,指数增长
- 拥塞避免:窗口线性增长,避免网络拥塞
- 快速重传:连续收到 3 个重复 ACK 时,立即重传
-
三次握手
客户端 服务器 | | | SYN (seq=x) | |------------------>| | | SYN-ACK (seq=y, ack=x+1) |<------------------| | ACK (seq=x+1, ack=y+1) | |------------------>|
- 状态转换:
- 客户端:
CLOSED
→SYN_SENT
→ESTABLISHED
- 服务器:
CLOSED
→LISTEN
→SYN_RCVD
→ESTABLISHED
- 客户端:
- 状态转换:
-
四次挥手
客户端 服务器 | | | FIN (seq=u) | |------------------>| | | ACK (ack=u+1) |<------------------| | | FIN (seq=v, ack=u+1) |<------------------| | ACK (ack=v+1) | |------------------>|
- 状态转换:
- 客户端:
ESTABLISHED
→FIN_WAIT_1
→FIN_WAIT_2
→TIME_WAIT
→CLOSED
- 服务器:
ESTABLISHED
→CLOSE_WAIT
→LAST_ACK
→CLOSED
- 客户端:
- TIME_WAIT 状态:等待 2MSL(最大段寿命),确保所有报文段消失
- 状态转换:
四、UDP协议深度解析
-
UDP报文结构
0 7 8 15 16 23 24 31 +--------+--------+--------+--------+ | Source | Dest | Length | Checksum | | Port | Port | | | +--------+--------+--------+--------+ | data...
- 校验和:可选字段,覆盖首部和伪首部(包含源/目的 IP 地址)
-
校验和计算
- 发送方:将数据补全为偶数个字节,计算二进制反码和,存入校验和字段
- 接收方:重新计算校验和,若与字段值不同则丢弃
五、常见协议与端口号
协议 | 端口号 | 说明 |
---|---|---|
HTTP | 80 | 超文本传输协议(明文) |
HTTPS | 443 | 安全 HTTP(TLS/SSL 加密) |
FTP | 21(控制) | 文件传输协议(数据端口 20) |
SSH | 22 | 安全外壳协议(加密远程登录) |
DNS | 53 | 域名解析服务 |
DHCP | 67/68 | 动态主机配置协议(服务器/客户端) |
SMTP | 25 | 简单邮件传输协议(发送邮件) |
POP3 | 110 | 邮局协议版本 3(接收邮件) |
六、重点题型解析
-
TCP与UDP对比题
- 答案:均为传输层协议,提供进程间通信,但 TCP 可靠、面向连接,UDP 不可靠、无连接
-
三次握手作用
- 答案:同步双方初始序号(防止历史连接干扰),分配资源(缓存、变量)
-
TCP滑动窗口机制
- 答案:发送方根据接收方窗口大小调整发送速率,避免接收方缓冲区溢出
-
UDP适用场景
- 答案:视频通话(实时性优先)、DNS 查询(小数据量)、直播(允许丢包)
七、扩展知识
TCP状态转换图详解
TCP协议通过状态机管理连接的建立、维护和释放。状态转换图描述了TCP连接在不同阶段的状态变迁,涵盖了客户端和服务器端的主动/被动操作。以下是核心内容:
一、状态分类与含义
状态 | 描述 |
---|---|
CLOSED | 初始状态,表示连接未建立或已完全关闭。 |
LISTEN | 服务器端监听端口,等待客户端连接请求(仅服务器端可见)。 |
SYN_SENT | 客户端发送SYN后等待确认(主动打开连接)。 |
SYN_RCVD | 服务器端收到SYN后发送SYN+ACK,等待客户端ACK(被动打开连接)。 |
ESTABLISHED | 连接已建立,数据可双向传输。 |
FIN_WAIT_1 | 主动关闭方发送FIN后等待ACK(首次关闭请求)。 |
FIN_WAIT_2 | 收到对端ACK后,等待对端FIN(仅主动关闭方可见)。 |
TIME_WAIT | 主动关闭方发送最终ACK后等待2MSL(防止旧报文干扰新连接)。 |
CLOSE_WAIT | 被动关闭方收到FIN后发送ACK,等待本地应用关闭连接。 |
LAST_ACK | 被动关闭方发送FIN后等待ACK(最终关闭请求)。 |
CLOSING | 双方同时发送FIN(罕见状态,需额外处理)。 |
二、状态转换路径
1. 常规连接建立(三次握手)
- 客户端:
CLOSED → SYN_SENT → ESTABLISHED
- 服务器端:
CLOSED → LISTEN → SYN_RCVD → ESTABLISHED
2. 常规连接关闭(四次挥手)
- 主动关闭方(如客户端):
ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
- 被动关闭方(如服务器端):
ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED
3. 同时打开连接(双方主动发起)
- 客户端A:
CLOSED → SYN_SENT → SYN_RCVD → ESTABLISHED
- 客户端B:
CLOSED → SYN_SENT → SYN_RCVD → ESTABLISHED
- 触发条件:双方同时发送SYN,交换ACK后直接进入
ESTABLISHED
。
4. 同时关闭连接(双方主动关闭)
- 双方均发送FIN后进入
CLOSING
状态,最终通过交换ACK进入TIME_WAIT
和CLOSED
。
三、关键状态解析
-
TIME_WAIT(2MSL等待)
- 作用:
- 确保最后一个ACK被对端接收(若丢失,对端重传FIN,可再次发送ACK)。
- 防止旧连接的延迟报文干扰新连接(通过2MSL超时清除残留报文)。
- MSL值:通常为30秒(Linux)或2分钟(RFC建议),总等待时间为2×MSL。
- 作用:
-
CLOSE_WAIT(被动关闭等待)
- 常见问题:若服务器端长期处于此状态,可能因未调用
close()
导致连接泄漏(需检查代码逻辑)。
- 常见问题:若服务器端长期处于此状态,可能因未调用
-
SYN_RCVD(半连接状态)
- 风险:服务器端收到SYN但未完成握手时,可能遭受SYN洪水攻击(需通过SYN Cookie等机制防御)。
四、状态转换触发条件
操作/事件 | 状态变化 |
---|---|
客户端调用connect() | CLOSED → SYN_SENT |
服务器调用listen() | CLOSED → LISTEN |
收到SYN并回复SYN+ACK | LISTEN → SYN_RCVD (服务器端) |
收到ACK完成三次握手 | SYN_RCVD → ESTABLISHED (服务器端) |
主动调用close() | ESTABLISHED → FIN_WAIT_1 (主动关闭方) |
收到FIN并回复ACK | ESTABLISHED → CLOSE_WAIT (被动关闭方) |
被动方调用close() | CLOSE_WAIT → LAST_ACK |
收到最终ACK | LAST_ACK → CLOSED (被动关闭方) |
五、特殊场景与处理
-
FIN_WAIT_2持续
- 原因:对端未发送FIN(如进程崩溃)。
- 解决:系统超时机制强制关闭(默认超时时间可配置)。
-
TIME_WAIT过多
- 影响:占用端口资源,导致新连接无法绑定相同端口。
- 优化:
- 调整内核参数(如
net.ipv4.tcp_tw_reuse
)。 - 确保HTTP服务器主动关闭连接(将TIME_WAIT转移至客户端)。
- 调整内核参数(如
-
RST报文触发
- 场景:收到无效报文(如端口未监听)时,直接发送RST强制关闭连接。
六、状态转换图示例
客户端路径(主动关闭):
CLOSED → SYN_SENT → ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
服务器路径(被动关闭):
CLOSED → LISTEN → SYN_RCVD → ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED
七、调试与监控工具
- netstat命令:
netstat -ant | grep <端口号> # 查看当前TCP连接状态
- ss命令(替代netstat):
ss -tulnp # 显示所有TCP/UDP监听端口及进程
- Wireshark抓包:分析握手/挥手过程中的报文序列和状态变化。
总结:理解TCP状态转换图是排查网络问题(如连接泄漏、端口占用)的关键。需结合代码逻辑(如close()
调用位置)和系统参数调优,确保连接高效释放。
- 关键状态:
ESTABLISHED
(连接成功)、CLOSE_WAIT
(被动关闭等待)
MTU与MSS
- MTU(最大传输单元):链路层允许的最大数据帧长度(通常 1500 字节)
- MSS(最大段长度):TCP 报文段数据部分的最大长度(
MTU - IP首部 - TCP首部
)
. TCP粘包问题 - 原因:TCP 将多个小报文合并发送,导致应用层无法区分边界
- 解决方案:添加消息长度字段、使用分隔符(如 HTTP 的
Content-Length
)