尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

【计算机网络硬核入门 01】一文彻底搞懂 TCP 与 UDP:从通俗比喻到代码实战,面试 / 开发再也不懵

【计算机网络硬核入门 01】一文彻底搞懂 TCP 与 UDP:从通俗比喻到代码实战,面试 / 开发再也不懵 专栏定位本专栏专为计算机网络入门、面试备战、后端 / 前端 / 运维开发基础补牢打造拒绝堆砌晦涩术语用「大白话 生活实例 可运行代码」的方式把每一个核心知识点讲透、讲实。本文是专栏第 1 篇带你从零分清 TCP 与 UDP搞懂它们的本质区别与真实工业界应用场景。一、先答最基础的问题它们是同一个领域的术语吗结论先行是而且是完全同层级、同领域的核心协议。两者都属于计算机网络 → TCP/IP 四层模型 → 传输层的两大核心协议是互联网数据传输的 “底层规则”。简单说当两台电脑上的程序要互相发数据时几乎都是用 TCP 或者 UDP 来完成传输的。两者的官方标准均由互联网工程任务组IETF制定是全球互联网通用的标准UDP 官方标准RFC 768互联网标准 STD 6可在 IETF 官网验证https://datatracker.ietf.org/doc/html/rfc768TCP 最新官方标准RFC 92932022 年发布替代经典的 RFC 793互联网标准 STD 7验证地址https://datatracker.ietf.org/doc/html/rfc9293打个比方传输层就像 “物流行业”TCP 和 UDP 就是物流行业里的两种配送模式 —— 一个是 “精准送达、签字确认的顺丰快递”一个是 “追求速度、随发随走的同城闪送”都负责送货只是规则和优先级完全不同。二、UDP 是什么一句话讲透它的本质通俗定义UDP 全称用户数据报协议User Datagram Protocol是一种「无连接、不保证可靠、追求极致速度」的传输协议。你可以把它完美类比成「对讲机通话」你按下按键直接说话不需要提前拨号、问对方 “在不在、能不能听到”你说的话发出去就完事了对方有没有听到、听没听全、有没有听漏你完全不知道信号不好的时候会丢字、声音卡一下但绝对不会停下来重说一遍优先保证 “实时能对话”。核心特点对应技术术语无连接传输数据前不需要和对方建立连接知道对方的 IP 和端口直接发包就可以没有 “握手” 过程。不可靠交付不保证数据一定能送到不保证数据顺序不乱丢包了也不会自动重发。面向数据报数据是一个包一个包独立发送的有明确的边界发一次就是一个完整的包不会出现粘包。首部开销极小UDP 的首部只有 8 字节额外负担非常小。没有拥塞控制、流量控制不管网络堵不堵该发多少就发多少不会主动降速。生活 互联网实例微信 / QQ 的语音 / 视频通话网络卡的时候你只会听到对方声音卡一下、画面糊一下不会整个通话停下来等数据重传。丢半秒声音没关系总比延迟 3 秒等重传强。游戏直播 / 户外直播观众看到的画面永远是 “实时的”网络差的时候只会卡顿、降画质不会倒回去补之前丢的画面。王者荣耀 / 和平精英这类实时对战游戏你的走位、技能释放都是 UDP 传输。如果用可靠协议卡一下就要等重传操作延迟会高到没法玩。DNS 域名解析你输入网址后电脑向 DNS 服务器发查询请求发出去等回复就够了丢了大不了重发一次不需要建立连接的开销。三、TCP 是什么为什么它是互联网的 “靠谱担当”通俗定义TCP 全称传输控制协议Transmission Control Protocol是一种「面向连接、可靠交付、带流量控制和拥塞控制」的传输协议。对应的生活类比是「打电话 顺丰快递」的结合体打电话通话前必须先拨号对方接通了三次握手你们才能正式说话顺丰快递每个包裹都有单号寄出去后要等对方签收确认没签收就重发保证包裹一定送到而且按顺序送到不会乱序。核心特点对应技术术语面向连接传输数据前必须先通过「三次握手」和对方建立连接连接建好了才能发数据断开时还要走「四次挥手」。可靠交付保证数据一定能完整送到对方丢包自动重传保证数据按发送顺序到达乱序了会自动重排。面向字节流数据是像流水一样传输的没有明确的包边界可能会出现 “粘包” 现象。拥塞控制 流量控制网络堵的时候会主动降速对方处理不过来的时候也会少发保证网络稳定不把对方冲垮。首部开销大TCP 首部最少 20 字节比 UDP 大很多。生活 互联网实例浏览网页HTTP/HTTPS你打开一个网页文字、图片必须完整、准确地加载出来不能缺字少图也不能顺序乱掉所以用 TCP。下载文件 / 软件下载的文件必须完整无损少一个字节都可能打不开所以必须用 TCP 保证可靠。微信发文字消息 / 文件传输你发的文字不能缺字发的文件不能损坏必须保证对方完整收到。远程登录 SSH、远程桌面你敲的每一个命令、每一步操作都必须准确传到服务器不能丢包乱序。四、一张表讲清 TCP 与 UDP 的核心区别对比维度TCPUDP连接特性面向连接传输前必须三次握手建连接无连接知道地址直接发可靠性可靠保证送达、保证顺序、丢包重传不可靠不保证送达、不保证顺序、不重传传输形式面向字节流无明确包边界易粘包面向数据报有明确包边界不粘包拥塞 / 流量控制有网络拥堵时主动降速无不管网络状态一直发首部开销最小 20 字节最大可达 60 字节固定 8 字节开销极小传输速度较慢握手、确认、重传都有开销极快几乎没有额外开销资源占用较高需要维护连接状态极低不需要维护连接通俗总结区别TCP 是「靠谱但慢」适合对数据准确性要求高、对速度要求不极致的场景UDP 是「快但不靠谱」适合对实时性要求极高、丢一点数据没关系的场景。五、什么时候用 TCP什么时候用 UDP真实场景大盘点必须用 TCP 的场景可靠性优先网页访问HTTP/HTTPS 协议底层都是 TCP保证页面资源完整加载文件传输FTP、SFTP 文件传输保证文件无损邮件收发SMTP、POP3、IMAP 协议保证邮件内容完整远程控制SSH、远程桌面保证操作指令准确执行金融交易、订单系统每一笔交易数据都不能丢、不能错必须可靠传输。优先用 UDP 的场景实时性优先实时音视频通话微信语音、Zoom 会议、视频通话直播 / 流媒体抖音直播、B 站直播、网络电视实时多人游戏MOBA、FPS 类对战游戏DNS 解析域名查询请求小、开销低物联网设备数据上报传感器定时上报数据丢一两个数据点没关系。补充说明现在很多场景会做 “UDP 自定义可靠逻辑” 的方案比如 QUIC 协议HTTP/3 底层就是基于 UDP 改造的既保留 UDP 的低延迟又自己实现了可靠传输属于进阶用法。六、代码实战亲手写 TCP/UDP 通信程序下面用 Python 标准库socket实现最简单的 TCP、UDP 通信 Demo每行代码都加注释说明功能。代码来源基于 Python 官方 socket 库标准用法编写官方文档验证地址https://docs.python.org/3/library/socket.html6.1 UDP 通信示例UDP 是无连接的服务端不需要监听连接客户端也不需要提前连接直接发包即可。UDP 服务端代码# 导入Python标准socket库提供网络编程所需的套接字接口 import socket # 创建UDP套接字对象 # AF_INET 指定使用IPv4地址族SOCK_DGRAM 指定使用数据报类型对应UDP协议 udp_server_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定本机IP与端口号 # 空字符串表示绑定本机所有可用网卡8080为自定义监听端口 # 功能向操作系统注册端口将该端口的UDP数据转发给当前程序 udp_server_socket.bind((, 8080)) print(UDP服务端已启动等待接收数据...) # 开启无限循环持续接收客户端发来的数据 while True: # 阻塞等待接收数据单次最多接收1024字节 # 返回值为二元组(接收到的字节数据, 发送方的(IP地址, 端口号)) data, client_addr udp_server_socket.recvfrom(1024) # 将字节数据按UTF-8解码为字符串打印发送方地址与消息内容 print(f收到来自{client_addr}的消息{data.decode(utf-8)}) # 构造回复消息并编码为字节通过sendto发送回指定客户端地址 reply f服务端已收到{data.decode(utf-8)}.encode(utf-8) udp_server_socket.sendto(reply, client_addr)UDP 客户端代码# 导入Python标准socket库 import socket # 创建UDP客户端套接字参数与服务端一致IPv4 UDP协议 udp_client_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 定义目标服务端的IP地址与端口号127.0.0.1代表本机 server_addr (127.0.0.1, 8080) # 定义要发送的文本消息通过encode编码为字节格式网络传输只能传字节 message 你好UDP服务端.encode(utf-8) # 直接向目标地址发送数据报UDP无需提前建立连接 # 功能将封装好的UDP数据包发送到指定的服务端地址 udp_client_socket.sendto(message, server_addr) # 阻塞等待接收服务端的回复数据单次最多接收1024字节 data, server udp_client_socket.recvfrom(1024) # 解码并打印回复内容 print(f收到服务端回复{data.decode(utf-8)}) # 关闭套接字释放系统资源 udp_client_socket.close()6.2 TCP 通信示例TCP 是面向连接的服务端要监听等待连接客户端要先建立连接才能发数据。TCP 服务端代码# 导入Python标准socket库 import socket # 创建TCP套接字对象 # AF_INET 指定IPv4SOCK_STREAM 指定字节流类型对应TCP协议 tcp_server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定本机IP与8080端口 tcp_server_socket.bind((, 8080)) # 开启监听模式参数5为最大挂起连接数 # 功能将套接字设为被动监听状态等待客户端发起连接请求 tcp_server_socket.listen(5) print(TCP服务端已启动等待客户端连接...) # 无限循环持续接受新的客户端连接 while True: # 阻塞等待客户端连接连接建立后返回两个值 # client_socket专门用于和该客户端通信的新套接字client_addr客户端地址 # 功能完成TCP三次握手建立可靠连接 client_socket, client_addr tcp_server_socket.accept() print(f客户端{client_addr}已连接) # 通过连接套接字接收客户端发来的数据单次最多1024字节 data client_socket.recv(1024) print(f收到客户端消息{data.decode(utf-8)}) # 构造回复消息并编码通过已建立的连接发送给客户端 reply f服务端已收到{data.decode(utf-8)}.encode(utf-8) client_socket.send(reply) # 关闭与该客户端的连接触发TCP四次挥手流程 client_socket.close()TCP 客户端代码# 导入Python标准socket库 import socket # 创建TCP客户端套接字IPv4 TCP协议 tcp_client_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 向服务端发起连接请求 # 功能发起TCP三次握手连接成功前程序会阻塞等待 tcp_client_socket.connect((127.0.0.1, 8080)) # 构造发送消息并编码为字节 message 你好TCP服务端.encode(utf-8) # 通过已建立的TCP连接发送数据 tcp_client_socket.send(message) # 阻塞等待接收服务端返回的回复数据 data tcp_client_socket.recv(1024) print(f收到服务端回复{data.decode(utf-8)}) # 关闭TCP连接主动发起四次挥手释放系统资源 tcp_client_socket.close()运行说明先启动对应服务端程序再启动客户端程序即可看到通信效果可以直观感受到差异TCP 必须先连接成功才能传输数据UDP 无需连接直接发包。七、常见误区解惑误区TCP 一定比 UDP 慢答通常场景下是但不是绝对。TCP 的开销主要集中在建立连接和确认重传但在稳定长连接、大数据量传输场景下TCP 的传输效率并不低如果 UDP 在上层自己实现可靠传输逻辑整体开销也会上升。误区UDP 完全不可靠所以没用答恰恰相反。在实时性场景里“低延迟” 比 “零丢包” 重要得多。人类对语音延迟的容忍度仅几百毫秒若用 TCP 传输一丢包就重传延迟会高到无法正常通话。误区TCP 能保证数据一定送到对方应用程序里答TCP 只能保证数据送达对方操作系统的内核缓冲区无法保证对方的应用程序一定会读取处理。比如对方程序卡死数据已到系统缓冲区但未被读取不属于 TCP 协议的责任范围。八、全文总结TCP 和 UDP 同属 TCP/IP 模型的传输层协议是互联网数据传输的两大核心基石TCP 面向连接、可靠、传输开销大适合对数据准确性要求高的场景UDP 无连接、不可靠、传输速度快适合对实时性要求极高的场景协议没有绝对的优劣只有是否匹配业务场景。下一篇预告《拆解 TCP 三次握手与四次挥手为什么是三次不是两次为什么挥手要四次》带你从底层原理搞懂 TCP 连接的完整生命周期。来源说明TCP/UDP 的定义、所属层级、核心特性、标准协议属于计算机网络领域公认的基础核心知识有明确的 IETF RFC 标准文档支撑行业无争议。应用场景分类与行业实践基于互联网行业通用的技术选型共识是开发、运维、技术面试领域的通用结论。代码示例与功能说明基于 Python 官方标准库socket的标准用法可直接运行验证。可验证来源UDP 标准 RFC 768https://datatracker.ietf.org/doc/html/rfc768TCP 标准 RFC 9293https://datatracker.ietf.org/doc/html/rfc9293Python socket 官方文档https://docs.python.org/3/library/socket.html
返回列表