TCP与UDP对比

TCP 与 UDP 特性对比

特性TCPUDP
连接面向连接(三次握手)无连接
可靠性保证送达(重传机制)尽力而为,不保证
顺序保证有序到达不保证顺序
差错校验校验和 + 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