当前位置: 首页 > news >正文

端到端的“两极对话”:TCP和UDP,你天天用却未必懂

面试官:“TCP和UDP有什么区别?”
我:“TCP是面向连接的可靠传输,UDP是无连接的不可靠传输……”
面试官:“那你在项目里什么时候用TCP,什么时候用UDP?”
我:“呃……好像都没用过?”

写在前面

这是很多人真实的内心戏。包括我自己,日常写Java业务代码,一个HTTP走天下,好像根本不需要纠结什么TCP还是UDP。

直到有一天,我在“知识汇”教育平台里搞高并发秒杀,用Redis+Lua做库存扣减的时候,忽然意识到:SpringCloud的Feign调用是HTTP→TCP,WebSocket是TCP长连接,DNS解析用的是UDP——原来TCP和UDP一直藏在我写的每一行“远程调用”背后,只是我没看见。

今天,我们就从后端开发者的视角出发,把传输层的这两个“灵魂人物”彻底捋清楚:它们是谁?区别在哪?你在开发中到底和它们打过多少次照面?以及,下次自己设计通信方案时,到底该怎么选?

一、开篇一张图:TCP vs UDP 核心对比

核心差异速览

二、TCP:那个永远要确认的“老实人”

2.1 TCP 的“三大规矩”

TCP的设计哲学只有一个字:。它通过三大机制保证数据万无一失:

  1. 三次握手 → 四次挥手:通信前先确认双方都在线,结束后体面告别,绝不“不告而别”。

  2. 确认+重传:发出去的数据必须等对方说“收到了”,没听到就重发。

  3. 流量控制+拥塞控制:根据网络状况和对方接收能力动态调整发送速度,不会“把对方撑死”也不会“把网络堵死”。

2.2 为什么是“字节流”而不是“消息”?

TCP是面向字节流的——应用层交给TCP一个100字节的数据,TCP可能拆成两个50字节的包发出去,也可能和后面的数据合并。接收方拿到的是没有边界的一串字节,需要自己想办法“切回原来的消息”。这就是开发中常说的“TCP粘包问题”

面试官常问:TCP粘包怎么解决?
答:固定消息长度、使用分隔符(比如换行符)、在消息头里加长度字段。

2.3 开发中的TCP:你每天都在用它

你以为你在用HTTP,其实你在用TCP。HTTP是应用层协议,底层跑的正是TCP。

  • Feign/SpringCloud微服务调用:你在Controller里写@GetMapping,Feign帮你生成动态代理,底层通过HttpClient发送HTTP请求,HTTP基于TCP传输。

  • WebSocket:先在TCP上完成HTTP Upgrade握手,升级成WebSocket协议,之后保持TCP长连接,适合实时推送。

  • 数据库连接:MySQL默认端口3306,Redis默认6379——底层全是TCP长连接。

  • SSH登录服务器:基于TCP,保证你敲的每一条命令都完整到达。

2.4 Java中怎么玩TCP?

JDK原生提供了SocketServerSocket

// 服务端 ServerSocket server = new ServerSocket(8080); Socket client = server.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); String msg = in.readLine(); System.out.println("收到: " + msg); // 客户端 Socket socket = new Socket("localhost", 8080); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println("Hello TCP!");

但高并发场景下,传统的BIO模式(一个连接一个线程)撑不住。这时候就要请出Netty——一个异步事件驱动的NIO框架,被Dubbo、Elasticsearch等众多知名项目采用,轻松支持数万并发连接。

三、UDP:那个“爱谁谁”的快递员

3.1 UDP 的“三大特点”

UDP的设计哲学是:快,就完事了

  1. 无连接:发之前不打招呼,收之后不回确认。

  2. 不可靠:丢包了不重传,乱序了不重排。

  3. 轻量:头部只有8字节,比TCP的20字节省了不少。

3.2 什么场景用UDP?

对丢包不敏感、但对延迟敏感的场景,UDP是王者:

  • 视频通话/直播:画面偶尔花一下没关系,但要等重传就卡成PPT了。

  • 在线游戏:CSGO里你开了一枪,宁可丢一发子弹数据,也不能等重传——等到了你人可能已经死了。

  • DNS查询:发一个几十字节的请求,收一个几十字节的响应,建TCP连接的开销比查询本身还大。

  • IoT传感器上报:每秒上报上千个温度数据,丢一两个无所谓,实时性更重要。

3.3 Java中怎么玩UDP?
// UDP 服务端 DatagramSocket socket = new DatagramSocket(9090); byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); String msg = new String(packet.getData(), 0, packet.getLength()); System.out.println("收到: " + msg); // UDP 客户端 DatagramSocket socket = new DatagramSocket(); byte[] buf = "Hello UDP!".getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName("localhost"), 9090); socket.send(packet);

和TCP相比,UDP的API更简单,但你也失去了TCP提供的一切“保姆级服务”。

四、那么问题来了:我到底该用TCP还是UDP?

4.1 从零设计通信方案时,怎么选?

做技术选型,问自己三个问题:

Q1:数据丢了能不能忍?

  • 不能忍(转账、订单、文件传输)→TCP

  • 能忍(视频帧、传感器数据、游戏坐标)→ 考虑UDP

Q2:顺序乱了行不行?

  • 不行(聊天消息、命令执行)→TCP

  • 行(视频解码、多路径上报)→ 考虑UDP

Q3:延迟敏感还是完整性敏感?

  • 完整性优先 →TCP

  • 延迟优先 →UDP

4.2 一个万能话术:混合使用

面试官问:“视频会议系统怎么设计通信协议?”

标准答案:“视频流和音频流用UDP,保证低延迟;控制信令(加入房间、静音、踢人)用TCP,保证可靠性。

4.3 进阶:在UDP上“模拟”TCP

如果既要UDP的低延迟,又要TCP的可靠性,怎么办?自己实现。

  • QUIC协议(HTTP/3底层):Google在UDP上实现了类似TCP的可靠性机制。

  • WebRTC:视频通话底层用UDP,但自己做了丢包重传、拥塞控制。

  • 游戏同步协议:比如守望先锋的“回滚式同步”,就是在UDP上做的。

4.4 开发中一个容易犯的错

在公司写一个实时数据推送服务,技术选型时选了WebSocket(基于TCP)。上线后发现延迟高,排查半天,原来用户量一大,TCP的拥塞控制自动降速了。后来换成UDP+应用层丢包容忍,流畅度明显提升。

所以选TCP还是UDP,没有绝对的好坏,只有适配的场景。

五、总结:把八股变成肌肉记忆

这次在知识汇教育平台里做高并发秒杀,缓存数据一致性用Redis(TCP),用户行为日志上报用UDP——丢几条日志不影响业务,但能减轻服务器压力。

下次面试官再问“TCP和UDP的区别”,别只背八股,扔出你的项目经验,告诉他:“我在知识汇的秒杀系统里,核心数据走TCP保证可靠性,日志埋点走UDP提升吞吐量。”

这,才是面试官想听到的答案。

http://www.jsqmd.com/news/653095/

相关文章:

  • 逆向某多Anti-Content参数:从定位到环境补全的实战解析
  • 3分钟快速汉化:Axure RP中文语言包终极指南
  • 如何用 performance.navigation 判断页面刷新并清理缓存
  • 有什么好用的AI来辅助写代码吗
  • 软件聊天机器人中的意图识别技术
  • 强化学习的实战演进:从虚拟博弈到实体操控
  • Agent Marketplace:未来的AI应用商店长什么样?
  • 3步解锁:Nucleus Co-Op带你体验单机游戏多人同屏的魔法
  • 从石墨烯芯片到简历微调:2026奇点大会硬核披露AI简历优化器底层架构(含3类Transformer轻量化部署路径)
  • STM32CubeIDE HAL库实战:MPU9250传感器数据读取全流程(附避坑指南)
  • Bootstrap制作后台管理系统布局 Bootstrap如何搭建Dashboard框架.txt
  • SITS2026正式发布:2024年唯一经Gartner交叉验证的生成式AI应用成熟度评估框架
  • 《SAP FICO系统配置从入门到精通共40篇》019、内部订单(IO)管理:订单类型与结算规则
  • 雀魂Mod Plus终极教程:三步解锁全角色皮肤的免费指南
  • 新加坡榜鹅:从蛮荒之地到AI创新热土,自动驾驶与智慧小镇共筑科技新篇
  • C++ vs PHP vs Python:三大编程语言终极对比
  • 国泰君安国际荣获2025年度离岸中资基金大奖“货币市场基金 - 港币(1年)”冠军
  • 逆向工程实战:解码大众奥迪碟盒通信协议,打造个性化车载音频中枢
  • 被n整除的n位数
  • HBA卡深度解析:从基础原理到企业级应用实战
  • 走了弯路的捷径——V5 Q-Learning的诱惑与反思
  • 2026 - 解决Typora文档内快捷键失效(与其他软件快捷键冲突)
  • 用好 Semantic Scholar API:一条更聪明的学术检索路径
  • 如何突破Cursor免费限制:3步解锁AI编程无限使用
  • 微服务配置中心 Apollo-Nacos 实战
  • 猫抓插件:三步搞定网页视频音频下载的终极解决方案
  • 高企管理成熟度评价(四):分类分级——从“大水漫灌”到“精准滴灌”,让每一分培育经费都用在刀刃上
  • 阿里云机器翻译API调用避坑:手把手解决.NET开发中的SignatureDoesNotMatch错误
  • 用OpenCV给不规则零件‘量体裁衣’:Python实战最小外接矩形,搞定工件尺寸与倾斜角测量
  • 口碑管理化技术中的社交媒体监控舆情分析与口碑营销