前言
TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)都是 TCP/IP 协议栈中传输层的核心协议,负责在主机之间为应用层提供端到端的通信。下面我将从相同点、是否面向连接、数据传输方式、是否可靠、传输效率、应用场景这六个方面展开详细讲解。
一、相同点
虽然 TCP 和 UDP 差异很大,但它们也有一些本质上的共同特性:
- 都属于传输层协议:位于 IP 层之上、应用层之下,负责进程到进程(端到端)的通信,而不是主机到主机(那是 IP 层的职责)。
- 都基于 IP 协议提供服务:两者都依赖底层 IP 协议进行数据包的路由和转发,IP 提供"尽力而为"(best-effort)的交付,本身不可靠。
- 都使用端口号实现多路复用/解复用:源端口号 + 目的端口号 + 源 IP + 目的 IP 共同组成"套接字"(socket),允许多个应用程序同时使用网络。
- 都提供校验和(Checksum)机制:在首部计算校验和,覆盖首部 + 数据(伪首部也参与计算),用于检测数据在传输过程中是否出错。
- 都不保证带宽、时延或抖动:底层 IP 是无连接的,两者都不提供 QoS 保障。
这些相同点决定了它们都是传输层的"通用工具",区别在于对可靠性和连接管理的不同取舍。
二、是否面向连接
这是两者最根本的区别之一。
1.TCP:面向连接
在数据正式传输前,必须建立连接(三次握手),传输完毕后必须释放连接(四次挥手)。
-
三次握手(SYN → SYN-ACK → ACK)目的:
- 确认双方收发能力正常;
- 协商初始序列号(ISN),防止历史报文干扰(序列号随机化防序列号攻击);
- 分配资源(如缓冲区、滑动窗口参数)。
-
四次挥手(FIN → ACK → FIN → ACK)目的:实现全双工的有序关闭,防止单方关闭导致数据丢失(半关闭状态允许一方继续发送)。
-
连接的意义:为后续可靠传输提供状态信息(序列号、确认号、窗口大小、定时器等),这些状态都保存在 TCB(Transmission Control Block)中。
2.UDP:无连接
发送数据前无需建立连接,直接封装数据报发送,接收方收到后直接处理。
- 无需握手/挥手,所以没有连接状态维护,没有 TCB。
- 每一次发送都是独立的,发送方不关心接收方是否准备好、是否在线。
- 这导致 UDP 启动更快,但也无法感知对端状态。
要点:面试官常追问"为什么 TCP 要三次而不是两次?"------两次无法防止历史延迟报文干扰,也无法确认客户端的接收能力。
三、数据传输方式
1.TCP:面向字节流(Stream)
数据被视为无边界的连续字节流,应用层交给 TCP 的数据可能被拆分或合并成段(Segment)发送。
- 无消息边界:即使应用发送两条 100 字节的消息,接收方可能一次收到 200 字节,或分多次收到。
- 通过序列号和确认号实现有序交付,接收方按序重组后上交应用。
- 适合传输"整体性"数据(如文件、网页),但应用层需要自己定义消息边界(常见做法:长度前缀、定界符)。
2.UDP:面向数据报(Datagram)
每一次发送是一个独立的数据报,保留消息边界。
- 应用层一次 sendto() 对应一个完整的 UDP 数据报,接收方一次 recvfrom() 收到完整的消息(或丢失)。
- 最大长度受限于 IP 分片(IPv4 下通常 65507 字节),超过会分片但不重组(重组靠 IP 层)。
- 适合"一次性"消息,如查询请求/响应。
要点:常被问"TCP 是可靠的字节流,那怎么实现消息队列的可靠传输?"------需要在应用层加长度字段或协议(如 protobuf、JSON 分帧)。
四、是否可靠
1.TCP:可靠传输
提供 100% 可靠的有序交付(在网络正常情况下)。
- 确认与重传:每个段都有序列号,接收方发送 ACK 确认已收到最大连续序列号;超时未确认则重传(RTO 通过 RTT 动态计算)。
- 快速重传:基于 3 次重复 ACK(duplicate ACK)立即重传,而不等待超时(解决单个包丢失导致的长时间等待)。
- 流量控制:滑动窗口(RWND)防止发送方淹没接收方缓冲区。
- 拥塞控制:慢启动、拥塞避免、快速恢复、快速重传(四大算法),通过 CWND 自适应网络状况,防止网络崩溃。
- 有序交付:乱序段缓存等待,缺口触发重复 ACK。
即使底层 IP 丢包、乱序、重复,TCP 都能处理。
2.UDP:不可靠
只提供校验和检测错误,错误直接丢弃,不重传、不确认、不排序。
- 丢失、乱序、重复完全由应用层处理。
- 优点是简单,缺点是不可靠。
- 实际中若需要可靠传输,可在应用层实现(如 QUIC 在 UDP 上实现了类似 TCP 的可靠机制)。
要点:常问"TCP 如何保证可靠?"------要答出四大机制:确认重传、流量控制、拥塞控制、有序交付。
五、传输效率
1.TCP:传输效率较低
TCP的可靠机制带来了额外的开销,导致传输效率低于UDP:
- 协议头开销:TCP报文段的头部长度可变(最小20字节,最大60字节),包含序列号、确认号、窗口大小等大量控制字段,协议头开销较大。
- 连接与重传开销:三次握手和四次挥手需要额外的报文交互;超时重传和拥塞控制会降低实际数据传输速率。
- 数据合并与延迟:Nagle算法会合并小数据包,可能导致延迟确认,增加数据传输的延迟。
2.UDP:传输效率较高
UDP的无连接、无可靠机制设计,使其传输效率远高于TCP:
- 协议头开销小:UDP数据报的头部长度固定为8字节,仅包含源端口、目的端口、数据长度、校验和四个字段,协议头开销极小。
- 无额外交互开销:无需建立和释放连接,数据报发送后无需等待确认,减少了网络交互次数。
- 无延迟合并:UDP不会合并数据包,数据从应用层到达传输层后立即发送,延迟极低。
延伸:UDP的传输效率优势在实时性要求高的场景中尤为明显,如语音通话、视频直播------允许少量数据丢失,但不允许延迟过高。
要点:可补充量化对比:相同 payload 下,UDP 有效载荷占比更高;TCP 在网络拥塞时会主动降速保公平,而 UDP 会"抢占"带宽。
六、 应用场景
1.TCP的应用场景:对可靠性要求高,实时性要求低
TCP的可靠传输特性,适合传输不允许数据丢失、乱序的业务数据,典型场景包括:
- 文件传输:如FTP(文件传输协议)、HTTP(超文本传输协议)、SMTP(邮件传输协议),文件传输要求数据100%准确,不允许丢失或错误。
- 远程登录:如SSH(安全外壳协议)、Telnet,远程控制需要可靠的指令传输,否则可能导致操作失误。
- 金融交易:如银行转账、电商支付,交易数据的可靠性直接关系到资金安全,必须使用TCP。
- 大数据传输:如Hadoop分布式计算,海量数据传输需要保证完整性,TCP的流量控制和拥塞控制可避免网络拥塞。
2.UDP的应用场景:对实时性要求高,允许少量数据丢失
UDP的高效传输特性,适合传输对延迟敏感,允许少量丢包的实时数据,典型场景包括:
- 实时音视频通信:如微信语音、抖音直播、视频会议,这类场景允许少量数据丢失(丢失一个数据包只会导致短暂的花屏或卡顿),但延迟超过200ms就会影响体验。
- 游戏数据传输:如王者荣耀、和平精英,游戏指令需要低延迟传输,UDP的传输延迟远低于TCP,少量丢包可通过游戏引擎补全。
- DNS查询:域名解析需要快速获取IP地址,UDP的无连接特性可减少查询时间,若查询失败,应用层可重新发送请求。
- 物联网通信:如传感器数据采集,传感器设备通常带宽低、功耗小,UDP的低开销特性适合这类场景。
延伸:部分场景会结合TCP和UDP,如直播平台使用UDP传输视频流,使用TCP传输弹幕和控制指令------兼顾实时性和可靠性。
总结
TCP 提供可靠、有序、面向连接的字节流传输,适合对数据完整性要求高的场景,但开销大、延迟高;UDP 提供无连接、不可靠的数据报传输,首部小、速度快,适合实时性要求高、可容忍丢包的场景。实际选择取决于应用对可靠性、实时性、吞吐量的权衡。