TCP 与 UDP:从核心区别到面试必问的可靠性机制
TCP 与 UDP从核心区别到面试必问的可靠性机制一、开篇为什么面试总爱问 TCP/UDP网络传输层位于 OSI 七层模型或 TCP/IP 四层模型的中间承上启下。面试官喜欢问 TCP/UDP是因为它们能考察一个人对网络通信本质的理解是否可靠、如何控制速度、怎样建立/断开连接。一句话定义TCP面向连接的、可靠的、基于字节流的传输协议UDP无连接的、不可靠的、基于数据报的传输协议生活类比TCP 像打电话先拨号、等待对方接通、确认能听到、再开始说话UDP 像寄快递或发广播只管发出不管对方是否收到也不保证顺序二、TCP 核心机制详解1. 三次握手与四次挥手三次握手过程线性时间 大白话客户端 → 服务端我想跟你说话这是我的序列号SYN客户端进入SYN-SENT服务端 → 客户端收到我也想说这是我的序列号SYN-ACK服务端进入SYN-RCVD客户端 → 服务端收到你的确认开始说话ACK双方进入ESTABLISHED为什么是三次而不是两次或四次一次/两次无法确认双方都能收发四次浪费了一次往返三次刚好以最小次数完成双向可达确认 初始序列号同步同时还能防止历史失效的连接请求突然到达四次挥手过程线性时间 大白话主动关闭方A我说完了不会再发数据FIN进入FIN-WAIT-1被动关闭方B知道了但我可能还有话要说ACK进入CLOSE-WAITA 进入FIN-WAIT-2B我也说完了挂吧FIN进入LAST-ACKA好的确认关闭最后一个 ACK进入TIME-WAIT等待 2MSL 后彻底关闭为什么是四次而不是三次TCP 是全双工通信每一方向必须单独关闭。第二次和第三次不能合并因为 B 可能还有数据要发。TIME_WAIT 的作用2MSL确保最后一个 ACK 能到达对方如果丢失对方会重发 FIN让旧连接的所有残留报文从网络中消失不影响新连接2. 可靠性是如何实现的确认应答ACK每收到一个 TCP 包必须回复 ACK超时重传RTO发送后若超时未收到 ACK则重传序列号与去重解决网络乱序和重复包问题校验和检测数据在传输中是否损坏流量控制拥塞控制3. 流量控制滑动窗口机制接收方通过通告窗口大小告诉发送方还能收多少数据防止接收方被淹没4. 拥塞控制面试加分项TCP 不仅关心接收方能不能收还关心网络堵不堵。拥塞窗口cwnd发送方根据网络拥塞程度自己计算的控制窗口接收窗口rwnd接收方通告的窗口四大算法慢启动 → 拥塞避免 → 快重传 → 快恢复简单理解先试探网速遇到丢包就降速逐步恢复。三、UDP 核心机制详解1. UDP 特点无连接、无状态、不可靠面向报文不合并、不拆分应用层数据头部仅8 字节源端口、目的端口、长度、校验和2. 什么时候用 UDP实时性要求高视频通话、直播、在线游戏允许一定丢包DNS 查询、SNMP、TFTP广播/多播场景DHCP、组播视频3. 面试高阶追问UDP 如何实现可靠性答案应用层自己实现。典型例子QUIC 协议HTTP/3 使用基于 UDP但提供类似 TCP 的可靠性、加密、多路复用RTP、KCP、UDT 等四、TCP vs UDP 关键对比表对比维度TCPUDP连接性面向连接无连接可靠性确认、重传、排序尽最大努力交付速度慢握手、拥塞控制快头部大小20–60 字节8 字节丢包处理重传直到成功直接丢弃适用场景HTTP、SSH、FTP、SMTP音视频、DNS、游戏、SNMP五、真实场景选择指南网页浏览 / 文件下载→ TCP必须完整、有序视频直播 / 会议→ UDP容忍花屏不能卡顿游戏→ 混合位置同步用 UDP聊天/登录用 TCPDNS→ UDP一个请求一个响应超时则重试六、常见面试题盲区扫雷1. UDP 包的最大长度是多少理论 64KB实际受 MTU 限制通常小于 1500 字节否则 IP 分片。2. TCP 的 Keep-Alive 是心跳包吗是保活机制但默认 2 小时才发一次远不如应用层心跳实用。3. SYN Flood 攻击是什么大量伪造 SYN 使服务器半连接队列耗尽。防攻击方案SYN Cookie。补充问答三次握手 四次挥手关于三次握手术语含义SYN同步序列号请求建立连接SYN-ACK服务端对 SYN 的确认同时发起自己的 SYNACK确认应答SYN-SENT客户端已发 SYNSYN-RCVD服务端已收 SYN 并回复 SYN-ACKESTABLISHED连接已建立全双工 vs 其他通信方式单工收音机单向半双工对讲机轮流说全双工电话、TCP同时收发关于四次挥手术语含义FIN终止连接表示不再发送数据2MSL2 倍最大报文生存时间TIME_WAIT 持续时长最后一个 ACK四次挥手第 4 步中主动关闭方回复的确认。若丢失被动方会重发 FIN因此主动方必须等待 2MSL。写在最后这篇博客不仅是面试笔记更是一份可随时查阅的 TCP/UDP 知识地图。建议你边看边画图把“三次握手、四次挥手、滑动窗口”亲手画一遍面试时才能信手拈来。本回答由 AI 生成内容仅供参考请仔细甄别。三次握手、四次挥手的图画一下以下是三次握手和四次挥手的时序图文字版你可以直接复制到博客中或者据此画成手绘图。画图时建议用垂直方向代表时间从上到下水平方向代表客户端和服务端。一、TCP 三次握手时序图客户端 服务端 | | | -------- SYN (seqx) ------- | | | SYN-SENT | | | ---- SYN-ACK (seqy, ackx1) | | | SYN-RCVD | | | ------- ACK (acky1) ------- | | | | | ESTABLISHED | ESTABLISHED |每一步对应的状态变化步骤方向报文客户端状态服务端状态1客户端 → 服务端SYN (seqx)SYN-SENTLISTEN2服务端 → 客户端SYN-ACK (seqy, ackx1)SYN-SENT → ESTABLISHEDSYN-RCVD3客户端 → 服务端ACK (acky1)ESTABLISHEDSYN-RCVD → ESTABLISHED二、TCP 四次挥手时序图主动关闭方客户端 被动关闭方服务端 | | | --------- FIN (sequ) ------- | | | CLOSE-WAIT | | | -------- ACK (acku1) ------- | | | | FIN-WAIT-2 | | | | -------- FIN (seqv) -------- | | | LAST-ACK | | | --------- ACK (ackv1) ------- | | | | TIME-WAIT (2MSL) | CLOSED | ↓ | | CLOSED |每一步对应的状态变化步骤方向报文主动方状态被动方状态1主动方 → 被动方FINESTABLISHED → FIN-WAIT-1ESTABLISHED2被动方 → 主动方ACKFIN-WAIT-1 → FIN-WAIT-2ESTABLISHED → CLOSE-WAIT3被动方 → 主动方FINFIN-WAIT-2 → TIME-WAITCLOSE-WAIT → LAST-ACK4主动方 → 被动方ACKTIME-WAIT (等待2MSL后关闭)LAST-ACK → CLOSED三、UDP 头部结构图-------------------------------------------------------------- | 16 位源端口 | 16 位目的端口 | | (Source Port) | (Destination Port) | -------------------------------------------------------------- | 16 位长度 | 16 位校验和 | | (UDP Length) | (Checksum) | -------------------------------------------------------------- | | | 数据部分 (Data) | | 长度 UDP长度 - 8 字节 | -----------------------------------------------------------------各字段含义表字段占用空间含义说明源端口16 位2 字节发送方的端口号可选不需要回复时可填 0目的端口16 位2 字节接收方的端口号必填用于交付到正确应用UDP 长度16 位2 字节UDP 报文总长度头部 数据最小为 8 字节仅有头部校验和16 位2 字节检测数据是否损坏可选在 IPv4IPv6 下为必填数据部分可变应用层载荷例如 DNS 查询、视频流等关键点UDP 头部固定只有8 字节比 TCP 的 20–60 字节轻量得多。与 TCP 头部对比图加分项TCP 头部至少 20 字节 UDP 头部8 字节 ------------------ ------------------ | 源端口 | 目的端口 | | 源端口 | 目的端口 | ------------------ ------------------ | 序列号 | | 长度 | 校验和 | ------------------ ------------------ | 确认号 | ------------------ | 偏移 | 标志 | 窗口 | ------------------ | 校验和 | 紧急指针 | ------------------ | 选项可选 | ------------------希望这篇关于TCP 与 UDP的文章能够帮助到你。欢迎点赞、评论、收藏。