TCP/UDP协议
内容
-
TCP三次握手、四次挥手
-
TCP可靠传输机制(确认应答、重传、华东窗口)
-
UDP特点(快、不可靠、适合音视频)
-
端口号的作用(如80、443、3306)
一、TCP协议
1. 基本特点
-
面向连接
-
可靠传输
-
字节流
-
全双工通信
-
流量控制
-
拥塞控制
2. TCP三次握手
建立可靠的链接,确保双方都能发送和接收数据
握手流程
客户端 → SYN(seq=x) → 服务器
服务器 → SYN-ACK(seq=y,ack=x+1) → 客户端
客户端 → ACK(ack=y+1) → 服务器
-
SYN:同步标志位,表示请求建立链接
-
SYN-ACK:服务器回应同步,并确认收到客户端的请求
-
ACK:客户端确认收到服务器的响应,连接建立完成
原理和意义
-
确保双方都能发送和接收数据
-
防止已失效的连接请求突然传入造成资源浪费
常见问题
-
SYN Flood攻击:攻击者伪造大量
SYN
请求,耗尽服务器资源 -
半连接队列满:服务器维护
SYN_RCVD
状态的连接过多导致拒绝服务
3. TCP四次挥手
断开链接,释放资源
挥手流程
客户端 → FIN → 服务器
服务器 → ACK → 客户端
服务器 → FIN → 客户端
客户端 → ACK → 服务器
-
FIN:一方提出关闭连接请求
-
ACK:另一方确认收到关闭请求
-
最终双方都发送
FIN
并受到ACK
后,连接彻底断开
原理
-
TCP是全双工通信,每一方都需要独立地关闭自己的发送通道
-
最后一次ACK可能丢失,所以客户端进入
FIN-WAIT-1
、CLOSE-WAIT
、LAST-ACK
、TIME-WAIT
等状态
常见问题
-
大量 TIME_WAIT 状态:占用本地端口资源,影响新连接建立
-
FIN 不回复 ACK 导致连接无法释放
4.TCP连接状态机
状态 | 含义 |
---|---|
CLOSED | 初始状态 |
LISTEN | 服务器监听 |
SYN_SENT | 客户端发送 SYN |
SYN_RCVD | 服务器收到 SYN 并发送 SYN-ACK |
ESTABLISHED | 连接建立成功 |
FIN_WAIT_1 | 客户端发送 FIN |
CLOSE_WAIT | 服务器收到 FIN,等待应用层关闭 |
LAST_ACK | 服务器发送 FIN,等待最后 ACK |
FIN_WAIT_2 | 客户端等待对方发送 FIN |
TIME_WAIT | 客户端收到对方 FIN 并发送 ACK 后的状态 |
CLOSING | 同时关闭连接 |
TIME_WAIT的作用
-
确保最后一个ACK能被对方收到
-
防止旧连接的报文段干扰新连接
5. TCP可靠传输机制
TCP能够保证数据“有序、无差错、不丢失”,这得益于以下三大机制:
-
确认应答机制(ACK)
每收到一段数据后,接收方会发送一个确认报文(ACK),告诉发送方“我已收到”
-
重传机制(Retransmission)
如果发送发在一定时间内没有收到ACK,就会重新发送该段数据
-
超时重传
-
快速重传(收到三个重复的ACK就触发)
-
-
滑动窗口机制(Sliding Window)
控制一次可以发送的数据量,提高效率并避免接收方缓冲区溢出
-
窗口大小=接收方剩余缓冲区大小
-
发送方可连接发送多个数据包,无需等待每个ACK
-
-
流量控制(Flow Control)
-
接收方通过通告窗口大小来控制发送速率
-
-
拥塞控制(Congestion Control)
-
慢启动(Slow Start)
-
拥塞避免(Congestion Avoidance)
-
快重传 & 快恢复(Fast Recovery)
-
二、UDP协议
1.基本特点
-
无连接
-
不可靠传输
-
数据可能乱序或丢失
-
无拥塞控制
-
报文面向消息
2.适用场景
-
实时音视频童话(容忍少量丢包,延迟敏感)
-
DNS查询
-
DHCP分配IP地址
-
在线游戏
三、TCP和UDP对比总结
特性 | TCP | UDP |
---|---|---|
是否连接 | 面向连接 | 无连接 |
是否可靠 | 可靠传输 | 不可靠传输 |
是否有序 | 有序到达 | 无序到达 |
是否拥塞控制 | 有 | 无 |
是否流量控制 | 有 | 无 |
数据形式 | 字节流 | 报文 |
速度 | 较慢 | 快 |
开销 | 头部较大,开销多 | 头部小,开销低 |
应用场景 | HTTP、FTP、SMTP | 视频会议、直播、DNS |
四、端口号的作用和分类
1.端口号的意义
-
标识主机上的某个应用程序
-
区分不同的服务(如Web、数据库、SSH)
2. 端口号的分类
类别 | 范围 | 用途 |
---|---|---|
系统端口(Well-known Ports) | 0 - 1023 | IANA 分配给标准服务(如 HTTP:80、HTTPS:443) |
注册端口(Registered Ports) | 1024 - 49151 | 由第三方注册使用的端口(如 MySQL:3306) |
动态/私有端口(Dynamic/Private Ports) | 49152 - 65535 | 临时分配,常用于客户端连接 |
3.常见端口
常见端口 | 对应服务 |
---|---|
21 | FTP(文件传输) |
22 | SSH(远程登录) |
25 | SMTP(邮件发送) |
53 | DNS(域名解析) |
80 | HTTP(网页访问) |
443 | HTTPS(安全网页) |
3306 | MySQL(数据库) |
6379 | Redis(缓存服务) |
五、具体问题
场景 1:前端调用后端接口提示“连接超时”
-
使用
telnet ip port
检查端口是否通 -
如果不通,可能是防火墙限制或服务未启动
-
如果通但没响应,可能是应用逻辑卡住或 TCP 握手失败
场景 2:运维发现服务器上存在大量 TIME_WAIT
连接
-
说明连接频繁创建又关闭
-
可优化内核参数(如
tcp_tw_reuse
、tcp_tw_recycle
)
场景 3:在线游戏使用 TCP 出现卡顿
-
TCP 重传机制导致延迟增加
-
改为 UDP + 自定义重传机制,提升实时性
场景 4:开发人员部署服务在 8080 端口,浏览器访问失败
-
检查服务是否正常运行
-
使用
netstat -tulnp | grep 8080
查看端口监听情况 -
使用
curl http://localhost:8080
本地测试
TCP 是可靠的、面向连接的协议,适用于需要数据完整性与顺序性的场景;UDP 是快速、不可靠的协议,适用于对延迟敏感的应用。掌握它们的工作机制、状态转换、抓包分析技巧,是网络编程和故障排查的基础能力。