装完一台 Linux 服务器,第一件事往往是开放防火墙端口。可你有没有想过,同样是放行一个端口,为什么 SSH 走的是 TCP,DNS 查询却默认用 UDP?为什么视频会议卡顿掉帧,而下载文件却几乎不会出错?
这背后就是传输层的两种协议:TCP 和 UDP。它们同属 TCP/IP 协议栈的第四层,却走了两条完全相反的设计路线。这篇文章把两者的机制讲清楚,给出头部结构、对比表格和典型业务选型建议,让你在排查网络问题、配置防火墙、设计服务时,能准确判断某个服务到底该用哪种协议。文章面向运维新手和中小企业 IT,所有命令在 RHEL/CentOS/Rocky 与 Debian/Ubuntu 上都能直接跑。
一、先搞懂"传输层"在干什么
网络通信可以粗分为四层:链路层负责同一个局域网内的帧传输,网络层(IP)负责把数据包从一台主机送到另一台主机,传输层(TCP/UDP)负责"进程到进程"的通信,应用层则是 HTTP、DNS 这些具体协议。
注意一个关键点:IP 层只认 IP 地址,它把数据送到主机就完事了,但一台服务器上跑着几十上百个进程,数据到底该给谁?这就需要传输层用"端口号"来区分。所以 TCP 和 UDP 都要携带端口号,区别在于它们如何对待可靠性。
TCP 的全称是传输控制协议,它的设计目标是"可靠、有序、面向连接"。UDP 的全称是用户数据报协议,设计目标是"简单、快速、不保证可靠"。这不是谁好谁坏的问题,而是针对不同业务做的不同取舍。
二、TCP:面向连接的可靠传输
TCP 在正式传数据之前,必须先"握手"建立连接,双方确认彼此在线、序号从哪开始,这个过程就是著名的三次握手。连接建立后,TCP 保证四件事:
可靠交付。每个字节都有序号,接收方收到后要回 ACK 确认。发送方在一定时间内没收到确认,就重传。所以丢包对应用层是透明的,底层的重传会把它补上。
按序到达。数据被切成一段段报文,网络可能乱序,TCP 会在接收端按序号重新排好,再交给应用。
流量控制。接收方通过窗口字段告诉发送方"我还能接多少",防止发得太快把对方缓冲区撑爆。
拥塞控制。TCP 会根据网络状况动态调整发送速率,慢启动、拥塞避免、快速重传这些算法,都是为了不在网络拥堵时火上浇油。
代价是什么?头部大(20 字节起步)、握手有延迟、有状态(双方要维护连接状态表)、发生丢包时会等待重传。所以 TCP 适合"数据不能错、可以慢一点"的场景。
TCP 头部大约 20 字节(不含选项),关键字段包括源端口、目的端口、序号(Seq)、确认号(Ack)、标志位(SYN/ACK/FIN/RST/PSH/URG)、窗口大小、校验和。你可以用抓包看到这些字段。
三、UDP:无连接的轻量选手
UDP 干脆得多:想发就发,不问对方在不在,不建立连接,不保证送达,不保证顺序。它的头部只有 8 字节,四个字段:源端口、目的端口、长度、校验和。
因为省掉了握手、确认、重传、排序这些机制,UDP 的开销极小、延迟极低。代价是:丢包了应用层自己负责,乱序了应用层自己排,重复了应用层自己去重。换句话说,UDP 把可靠性这件事完全甩给了上层。
这也带来一个常被忽略的好处:UDP 天然适合"广播"和"组播",也天然适合需要自己控制重传策略的场景。比如实时音视频,丢一帧画面比等一秒重传来的体验更好,与其让协议层死等重传,不如上层直接丢掉、继续播下一帧。
四、TCP 与 UDP 全面对比
| 对比项 | TCP | UDP |
|---|---|---|
| 连接方式 | 面向连接,需三次握手 | 无连接,直接发送 |
| 可靠性 | 确认、重传,保证不丢 | 不保证,可能丢包 |
| 顺序 | 保证按序到达 | 不保证顺序 |
| 头部大小 | 20 字节起(含选项更长) | 固定 8 字节 |
| 传输方式 | 字节流 | 数据报(保留消息边界) |
| 速度/延迟 | 相对慢,握手+确认有开销 | 快,延迟低 |
| 流量/拥塞控制 | 有 | 无 |
| 广播/组播 | 不支持 | 支持 |
| 连接状态 | 双方维护状态,占资源 | 无状态 |
| 典型端口 | 22、80、443、3306 | 53、123、67/68 |
| 典型应用 | HTTP、HTTPS、SSH、MySQL | DNS、QUIC、视频、游戏、VoIP |
这张表建议背下来。你在看防火墙规则、排查连接数、分析抓包时,判断服务用哪种协议是最基础的一步。
五、典型应用场景与选型
用 TCP 的场景
凡是"数据完整性优先"的业务,都选 TCP:
- Web 服务:HTTP/1.1 和 HTTP/2 都基于 TCP,端口 80/443。浏览器加载页面时少一个字节都可能出错,必须可靠。
- 远程登录:SSH 走 TCP 22 端口,传输的命令不能丢不能乱。
- 数据库:MySQL 默认 TCP 3306,Redis 6379。事务数据错一个字节都是灾难。
- 邮件传输:SMTP 25、IMAP 143、POP3 110 都基于 TCP。
- 文件传输:FTP、SFTP 依赖 TCP 保证文件完整。
用 UDP 的场景
凡是"实时性优先、能容忍少量丢失"的业务,都选 UDP:
- DNS 查询:默认 UDP 53 端口,一次一问一答,追求快。响应超过 512 字节(或启用 EDNS0 后更大)时才回退到 TCP。
- 实时音视频:VoIP、视频会议用 UDP,宁可有杂音、卡一帧,也不要因重传导致整体延迟飙升。
- 在线游戏:玩家位置、动作指令用 UDP,几十毫秒的延迟就可能影响操作手感。
- DHCP:67/68 端口,客户端还没 IP 地址时用广播获取,UDP 更合适。
- NTP 时间同步:123 端口,本身就是"取个大致时间"。
- QUIC(HTTP/3):在 UDP 之上自己实现了可靠传输与拥塞控制,兼顾低延迟和可靠性。
选型决策的小口诀
需要"完整、有序、可重传"选 TCP;需要"低延迟、可容忍丢失、自己控制重传"选 UDP。拿不准时,先问一句:这个业务丢一条数据,用户能接受吗?能接受就 UDP,不能就 TCP。
六、用命令验证:你到底在用哪个协议
在服务器上确认服务监听的协议,最直接的工具是 ss。
# 列出所有 TCP 监听端口
ss -lnt
# 列出所有 UDP 监听端口
ss -lnu
# 一起看,并显示进程
sudo ss -lntup
# 查 DNS 服务(通常是 UDP 53 + TCP 53 都在听)
sudo ss -lnup | grep ':53'
参数含义:-l 只看监听状态,-n 不做域名/服务名解析(更快、更准),-t TCP,-u UDP,-p 显示进程。
如果你发现某个服务"客户端连不上",先确认服务监听的是 TCP 还是 UDP,再看防火墙是否放行了对应协议——很多"端口开了还是不通"的问题,就是因为只在防火墙里放了 TCP,而客户端用的是 UDP。
在防火墙层面,两种协议要分别放行:
# RHEL/CentOS/Rocky 8/9(firewalld)
sudo firewall-cmd --permanent --add-port=53/udp
sudo firewall-cmd --permanent --add-port=53/tcp
sudo firewall-cmd --reload
# Debian/Ubuntu(ufw)
sudo ufw allow 53/udp
sudo ufw allow 53/tcp
sudo ufw reload
风险提示:开放端口前务必确认业务确实需要,生产环境建议只放行必要来源 IP。误加规则可用
firewall-cmd --permanent --remove-port=53/udp && firewall-cmd --reload回滚;ufw 用ufw delete allow 53/udp删除。
七、常见误区
误区一:UDP 就是"不安全的协议"。安全性是 TLS、IPsec 这些上层机制负责的,和 TCP/UDP 无关。QUIC 跑在 UDP 上,照样是加密的。
误区二:UDP 一定比 TCP 快。在丢包严重的网络里,UDP 因为不做重传反而会出现大量空洞,应用层补救的成本可能更高。UDP 的优势在于"可控和低延迟",不在于绝对速度。
误区三:TCP 保证送达,所以应用层不用管。TCP 只保证"我发出去的字节最终会到达并且有序",不保证对方应用正确处理。业务层的幂等、超时、重试依然要自己做。
常见问题
Q:为什么 DNS 用 UDP,但有时候又用 TCP?
A:常规查询用 UDP 53 追求速度;当响应数据超过 512 字节(老限制),或启用 EDNS0 后仍超出,以及区域传送(AXFR)必须用 TCP,保证大数据块可靠传输。
Q:同一个端口能同时监听 TCP 和 UDP 吗?
A:可以。TCP 和 UDP 是两个独立的协议空间,53/tcp 和 53/udp 互不冲突,DNS 服务通常两者都监听。
Q:怎么快速判断某个连接用的是哪种协议?
A:用 ss -antp 看 TCP 连接,ss -anup 看 UDP 连接。抓包时 tcpdump -nn tcp 只抓 TCP,tcpdump -nn udp 只抓 UDP。
Q:TCP 三次握手会不会拖慢访问速度?
A:会有一次往返延迟(RTT),但现代内核普遍启用 TCP Fast Open、连接复用等技术来缓解。UDP 无握手,首包延迟更低,这是 QUIC 选 UDP 的原因之一。
Q:视频直播到底用 TCP 还是 UDP?
A:取决于延迟要求。低延迟直播(连麦、会议)用 UDP 类方案(如 WebRTC、SRT);点播和普通推流常用基于 TCP 的 HLS/RTMP,因为可容忍几秒延迟,更看重稳定。
总结
- TCP 面向连接、可靠、有序,有流量控制和拥塞控制,头部 20 字节起,适合 HTTP/HTTPS/SSH/MySQL 这类"不能错"的业务。
- UDP 无连接、不保证可靠、头部仅 8 字节、无拥塞控制,延迟低、开销小,适合 DNS/QUIC/视频/游戏/VoIP 这类"要快"的业务。
- 选型口诀:丢数据能否接受。不能接受用 TCP,能接受且要求低延迟用 UDP。
- 用
ss -lntup确认服务监听的协议,防火墙必须按协议分别放行,别只放 TCP 漏了 UDP。 - 安全性、可靠性是可以叠加的,UDP 之上也能做加密和可靠传输,别把协议特性和安全混为一谈。
企业QQ咨询




