上网时你有没有遇到过视频通话卡成幻灯片,或者下载文件中途断掉?这些问题背后,往往跟TCP和UDP这两个传输协议有关。它们都负责把数据从一台设备送到另一台,但做事风格完全不同。
TCP:靠谱的快递员
TCP就像一个特别较真的快递小哥。他送包裹一定会让你签收,如果路上丢了件,他会马上回去补发。这种“保证送达”的机制叫面向连接。比如你打开网页、收邮件、下载安装包,这些操作都不能出错,用的就是TCP。
它的工作流程是这样的:先打电话确认对方在不在(三次握手),然后一条条发数据,每收到一段对方就得回个“已读”(确认应答),中间漏了哪块立刻重传。虽然稳,但也慢,因为来回确认太费时间。
UDP:随性的邮递员
UDP则像扔明信片——写完地址就投进邮箱,管它到没到。它不建立连接,不确认接收,也不重传丢失的数据。这种“尽力而为”的方式叫无连接。听起来很不靠谱?但在某些场景反而更合适。
比如直播打游戏,主播说话延迟1秒,你听着就嘴型对不上。这时候宁可丢几帧画面,也不能等重传。语音通话、在线会议、视频流媒体大多用UDP,牺牲一点完整性换速度。
关键差异对比
TCP有顺序控制,数据一定按发送顺序到达;UDP不管顺序,先到先处理。TCP有流量控制和拥塞控制,网络堵了会自动降速;UDP一路狂奔,可能加剧拥堵。TCP首部至少20字节,UDP只有8字节,头部开销小得多。
举个例子:你在家点外卖用APP下单,这过程走TCP,必须确保订单准确送达餐馆;但你同时在看直播做饭教程,这个视频流大概率走UDP,偶尔花屏一下不影响整体观看。
代码里怎么选
写网络程序时,选哪个协议直接体现在代码中:
// 使用TCP(Python示例)
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('example.com', 80))
// 使用UDP
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b'Hello', ('example.com', 53))
看到SOCK_STREAM和SOCK_DGRAM了吗?这就是告诉系统要用TCP还是UDP。DNS查询通常用UDP,因为请求响应短小,但万一没回来,客户端会自动重试,自己补上可靠性。
再比如多人射击游戏,玩家位置实时同步,每秒发几十次状态更新。用TCP的话,一个数据包卡住,后面全排队等着,角色就会瞬移。改用UDP,即使丢几个包,靠预测算法也能让动作看起来连贯。