真实面经题目 · 原创解析
TCP 和 UDP 有什么区别?
TCP 和 UDP 的核心区别在于是否提供面向连接、可靠传输、有序交付、流量控制和拥塞控制。TCP 更像一条可靠的字节流通道,适合对完整性和顺序要求高的场景;UDP 更像一次次独立投递的数据报,协议本身不保证到达、不保证顺序,但开销小、时延低、应用层可自由定制可靠性策略。
真实面经题目 · 原创解析
TCP 和 UDP 的核心区别在于是否提供面向连接、可靠传输、有序交付、流量控制和拥塞控制。TCP 更像一条可靠的字节流通道,适合对完整性和顺序要求高的场景;UDP 更像一次次独立投递的数据报,协议本身不保证到达、不保证顺序,但开销小、时延低、应用层可自由定制可靠性策略。
面试里我会从连接模型、可靠性、传输单位、控制机制和适用场景来回答。TCP 是面向连接的传输层协议,通信前需要建立连接,传输过程中通过序号、确认、重传、滑动窗口、流量控制和拥塞控制来尽量保证数据可靠、有序、不重复地交给应用层。它提供的是字节流服务,所以应用层还要自己处理粘包、拆包这类消息边界问题。UDP 是无连接的,发送前不需要握手,每个报文都是独立的数据报,协议本身不保证可靠到达、不保证顺序,也没有 TCP 那套复杂的拥塞和流量控制机制,因此头部更小、延迟更低、实现更简单。实际选择时,如果业务强调准确完整,比如文件传输、数据库连接、网页请求,通常选 TCP;如果业务强调实时性、能容忍少量丢包,或者希望应用层自己控制重传和纠错,比如音视频、直播、游戏、DNS 查询等,通常会考虑 UDP。总结来说,TCP 用协议复杂性换可靠性和顺序,UDP 用更少机制换低开销和灵活性。
TCP 是面向连接的,双方在真正传输数据前需要先建立通信状态,典型过程包括协商初始序号、确认彼此收发能力,并在连接结束时释放状态。这个连接不是物理线路,而是两端内核维护的一组状态。UDP 是无连接的,发送方只要知道目标地址和端口就可以直接发送数据报,接收方也不需要提前为某个会话建立完整状态。因此 TCP 更适合长时间、连续、可靠的数据交换,UDP 更适合短请求、广播式、实时式或应用层自定义会话的场景。
TCP 的可靠性不是靠网络本身保证,而是靠协议层补出来的。它会给字节流编号,接收端返回确认,发送端发现超时或重复确认后进行重传,并通过校验和发现部分传输错误。TCP 还能处理丢包、乱序、重复包等常见网络问题,最终尽量让应用层看到连续有序的数据。UDP 只有基本校验能力,数据报发出后协议层不负责确认和重传,也不保证接收顺序。若业务基于 UDP 仍然需要可靠性,就必须在应用层实现确认、重试、去重、排序或前向纠错等机制。
TCP 提供的是字节流服务,不保留应用层一次 write 或 send 的消息边界。发送端连续写入的多段数据,接收端可能一次读到一部分,也可能一次读到多段合并后的内容,所以应用协议通常需要长度字段、分隔符或固定长度格式来解决粘包和拆包问题。UDP 提供的是数据报服务,一次发送对应一个独立报文,接收时仍以报文为单位交付;但如果报文过大导致 IP 分片,任意分片丢失都可能造成整个数据报不可用。因此 UDP 常需要控制单个报文大小,避免过度依赖分片。
TCP 内置流量控制和拥塞控制。流量控制关注接收端是否来得及处理,通过接收窗口限制发送方速度,避免把接收缓冲区打满。拥塞控制关注网络路径是否承受得住,通过慢启动、拥塞避免、快速重传等策略动态调节发送速率。UDP 协议本身没有这些机制,发送方可以按应用节奏直接发包,延迟更可控,但也更容易在高负载下造成丢包或加剧网络拥塞。因此工程上使用 UDP 做高频传输时,通常仍要在应用层设计限速、探测、丢包反馈和降级策略。
TCP 的头部和状态管理成本更高,还需要握手、确认、窗口维护、重传和拥塞控制,整体机制复杂,但换来的是通用可靠传输能力。UDP 头部更小,不需要连接建立和连接维护,收发路径更直接,特别适合请求很短、实时性强或连接数量巨大的场景。不过不能简单说 UDP 一定比 TCP 快,因为如果应用层为了可靠性重新实现大量确认、重传、排序,复杂度和时延可能又会上升。真正的选择要看业务更怕数据错误、顺序错乱,还是更怕等待和阻塞。
TCP 常用于对数据完整性和顺序敏感的业务,例如网页访问、文件传输、邮件、远程登录、数据库连接等。这些场景中,少一个字节或顺序错乱都可能导致严重错误,等待重传通常是可接受的。UDP 常用于 DNS 查询、实时音视频、在线游戏、直播、部分监控采集和自定义传输协议。这些场景往往更关注实时性,旧数据即使重传回来也可能已经失去价值,业务宁愿丢掉一小部分数据,也不希望因为可靠传输阻塞后续内容。
因为 TCP 面向字节流,它只保证字节按顺序到达,不记录应用层每次发送的边界。接收端读到多少数据取决于缓冲区、网络和读取时机。UDP 面向数据报,一次发送通常对应一次接收边界。
不是。UDP 只是协议层不提供可靠性,应用层仍然可以实现确认、重传、序号、去重、纠错和限速。很多实时系统选择 UDP,是因为它允许业务按自己的时延目标定制可靠性。
三次握手的核心是让双方确认彼此的发送和接收能力,并同步初始序号。如果只进行两次确认,一方可能无法确认自己的确认信息是否被对方收到,连接状态更容易受到历史报文干扰。
实时音视频通常更怕延迟累积,而不是怕少量帧丢失。旧的音频或视频包即使重传成功,也可能已经过了播放时机。UDP 允许应用选择丢弃、补偿或降级,而不是被传输层重传阻塞。
是的,两者都通过端口把网络数据交给具体进程或服务。区别不在于是否有端口,而在于 TCP 维护连接状态并提供可靠字节流,UDP 则以独立数据报方式进行无连接传输。