TCP与UDP对比
TCP 与 UDP 特性对比
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 保证送达(重传机制) | 尽力而为,不保证 |
| 顺序 | 保证有序到达 | 不保证顺序 |
| 差错校验 | 校验和 + ACK + 重传 | 仅校验和(可选) |
| 流量控制 | 有(滑动窗口) | 无 |
| 拥塞控制 | 有(CUBIC、BBR 等) | 无 |
| 头部大小 | 20–60 字节 | 8 字节 |
| 速度 | 较慢(开销大) | 较快(低开销) |
| 广播/组播 | 不支持 | 支持 |
TCP 三次握手
客户端 服务端
| |
|-------- SYN (seq=x) ------>| 客户端发起连接
| |
|<-- SYN-ACK (seq=y,ack=x+1) -- 服务端确认
| |
|---- ACK (ack=y+1) -------->| 连接建立
| |
# 断开连接:FIN-ACK-FIN-ACK
适用场景
| 协议 | 最适合 | 典型应用 |
|---|---|---|
| TCP | 数据完整性要求高 | HTTP/HTTPS、SSH、FTP、邮件、数据库 |
| UDP | 低延迟、可容忍丢包 | DNS、DHCP、VoIP、视频流、游戏、QUIC |
Go 示例代码
// TCP 服务器
ln, err := net.Listen("tcp", ":8080")
if err != nil { log.Fatal(err) }
for {
conn, err := ln.Accept()
if err != nil { continue }
go func(c net.Conn) {
defer c.Close()
buf := make([]byte, 1024)
n, _ := c.Read(buf)
c.Write(buf[:n]) // 回显
}(conn)
}
// UDP 服务器
addr, _ := net.ResolveUDPAddr("udp", ":9090")
conn, _ := net.ListenUDP("udp", addr)
defer conn.Close()
buf := make([]byte, 1024)
for {
n, remoteAddr, _ := conn.ReadFromUDP(buf)
conn.WriteToUDP(buf[:n], remoteAddr)
}
QUIC — 现代替代方案
| 方面 | 说明 |
|---|---|
| 传输层 | 基于 UDP,在用户空间实现可靠性 |
| 握手 | 0-RTT 或 1-RTT(vs TCP+TLS 的 2-3 RTT) |
| 多路复用 | 无队头阻塞(解决 HTTP/2+TCP 的问题) |
| 连接迁移 | IP 变化后连接不中断(移动漫游) |
| 使用者 | HTTP/3、Google 服务、Cloudflare |