两者到底差在哪
核心差别是可靠性由谁负责:TCP 在内核里完成握手、确认重传、有序交付与拥塞控制,对应用暴露的是一条字节流;UDP 只做数据报投递,重传、排序、限速都由应用自己决定。所以选型的真正问题是「你要字节流还是报文、愿不愿意自己承担可靠性」。
基本信息
| 规范 | RFC 9293(TCP)、RFC 768(UDP) |
|---|---|
| 头部开销 | TCP 20–60 字节;UDP 固定 8 字节 |
| 连接状态 | TCP 三次握手/四次挥手;UDP 无连接 |
| 数据边界 | TCP 是字节流,UDP 保留报文边界 |
| 拥塞控制 | TCP 内核内置;UDP 默认没有 |
| 平台差异 | Linux/Windows/网络设备行为一致,仅内核参数与默认值不同 |
逐项对比
| 对比项 | TCP | UDP |
|---|---|---|
| 可靠性 | 确认 + 重传 + 去重 | 尽力而为,可能丢包乱序 |
| 有序性 | 保证按序交付 | 不保证顺序 |
| 传输效率 | 首部大、有握手与慢启动开销 | 首部小、无连接建立成本 |
| 多播/广播 | 不支持 | 支持 |
| 典型协议 | HTTP、SSH、MySQL、SMTP | DNS、DHCP、QUIC、音视频、游戏 |
什么时候选 UDP
- 延迟敏感且丢包可容忍:实时语音、视频会议、游戏状态同步
- 极短的请求-应答且应用自己会重试:DNS 查询、SNMP 轮询
- 要在用户态自建可靠层与拥塞控制:QUIC、自研传输协议
- 需要广播或组播:DHCP 发现、mDNS 这类 TCP 无法表达的场景
- 高频小消息、允许少量丢失:指标上报、日志直推
两种协议怎么测
两种协议怎么测
nc -vz -w 3 10.0.0.9 53 # TCP 探测:能明确得到 refused 或 succeeded
nc -vzu -w 3 10.0.0.9 53 # UDP 探测:无响应只说明没收到回复,参考价值低
tcping 10.0.0.9 53 # 连 TCP 也能看出时延与丢包
ss -lntup # 同时看本机 TCP/UDP 监听
curl -s --http3 -o /dev/null -w '%{http_version}\n' https://example.com # 对端支持 HTTP/3 时才走得通「UDP 更快」是常见误解:QUIC 在 UDP 之上重建了可靠性、拥塞控制与 TLS 1.3,收益来自多路复用和无队头阻塞,而不是「不做重传」。
选型判断顺序
- 先问丢一个包能否接受:不能,就选 TCP 或自己在 UDP 上实现重传与排序
- 再问是否真的需要广播、组播或极短的握手延迟:需要,才轮到 UDP
- 接着问中间设备是否友好:企业网、云安全组与 CDN 对 UDP 的放行通常更保守
- 最后问运维成本:UDP 没有连接状态,监控、限流与排障都要单独造轮子