TCP 和 UDP 的区别是什么?三次握手、四次挥手为什么不能只背次数?
先理解原理和示例,再练习完整口述与追问。
回答要点
TCP 有序可靠字节流;UDP 数据报且不保证交付顺序;可靠性有代价;握手确认双方收发与序列号;关闭两个方向可合并报文。
原理拆解
TCP 提供面向连接、有序可靠的字节流,利用序列号、确认、重传、流量控制和拥塞控制等机制处理传输,不保留应用消息边界,所以应用需要自己定义消息长度或分隔协议。UDP 保留数据报边界,协议本身不保证交付、顺序与去重,开销较小、应用可自行设计恢复策略;不能因此断言所有 UDP 应用都不可靠,QUIC 就在其上实现了可靠流。
典型 TCP 建连为客户端 SYN、服务端 SYN+ACK、客户端 ACK,交换初始序列号,并确认双方的发送和接收路径。第三次确认也有助于避免旧的连接请求直接形成有效连接,实际还有 SYN 重传、半连接队列等状态,不应只背“三次更安全”。
TCP 是全双工,关闭一个发送方向后,另一个方向可能仍有数据,所以常见关闭流程是 FIN、ACK、反向 FIN、ACK,称为四次挥手。但 ACK 和 FIN 可以合并,因此并非每次抓包都恰好四个报文。主动关闭一方通常经历 TIME_WAIT,以处理延迟报文并允许最后确认重传。前端实际定位时可结合连接复用、握手耗时、失败阶段、代理和服务端日志,而不是仅凭请求慢就判断 TCP 出错。
示例与推演
TCP 读到的两次应用消息可能合在一次读取,也可能一条消息分多次读取,因此自定义协议需要长度字段或分隔。UDP 每次保留数据报边界,但丢失、乱序与重复需由应用或上层协议处理。关闭连接时 ACK 与 FIN 可能合并,抓到三段也不能直接判定错误。
易错点
“粘包”是字节流与应用消息边界不一致的描述,不是 TCP 把消息弄坏。大包、小包和实时性不能只按协议名字简单判断。
参考回答可直接练习口述
TCP 提供面向连接、有序可靠的字节流,利用序列号、确认、重传、流量控制和拥塞控制等机制处理传输,不保留应用消息边界,所以应用需要自己定义消息长度或分隔协议。UDP 保留数据报边界,协议本身不保证交付、顺序与去重,开销较小、应用可自行设计恢复策略;不能因此断言所有 UDP 应用都不可靠,QUIC 就在其上实现了可靠流。