UDP
复习
- 端口:传输层用端口把数据交给正确的应用
- IPv4 数据包:网络层负责端到端的方向
- ICMP:报告差错,但不负责补救
TL;DR
- UDP 是最简单的传输协议,只做最少的事
- 它靠端口寻址,加上校验,就交给网络
- 无连接、不保证送达、不保证顺序
- 适合能容忍丢失、看重时延的场景
正文
传输层要在“交给哪个程序”之上,再决定“要不要保证送到”。有的协议选择把可靠性扛下来,有的则选择几乎什么都不管。
后者就是 UDP(用户数据报协议,User Datagram Protocol)。
只做最少的事
UDP 的工作,简单到近乎“直男”:
- 用端口号标明交给哪个程序
- 加一个长度和一个校验值
- 然后就把数据交给下面的网络层,发出去
它不建立连接,不确认收到,不重传丢失的,也不保证顺序。发出去以后,就像往邮筒里投了一封信:投了就不管了,到没到、有没有丢,它都不追问。
为什么还有人用它
你可能会问:这么“不靠谱”,怎么还有大量应用在用?
因为“可靠”不是免费的。要保证送达、顺序和重传,就得建立连接、维护状态、等待确认,这些都会带来延迟和开销。而在一些场景里,这些代价并不值得:
- 域名解析:一次问答而已,丢了就再问一次,比建立连接更划算
- 视频通话、在线游戏:偶尔丢一两帧无所谓,卡顿才要命,实时性优先
- 广播/组播:本来就适合无连接
换句话说,UDP 用的是“把可靠性交给上层,或者干脆不要求”的策略。它不试图解决所有问题,只提供一个轻快的底座。
把选择权交出去
这里其实藏着一个很重要的设计哲学:不是所有通信都需要同一种保证。
把 UDP 和后面要讲的 TCP 放在一起看,你会发现它们是同一件事的两端——用多少可靠性,换多少速度与简洁。协议设计者提供了两种选择,让应用按需取舍,而不是强塞一种方案。
那么,如果应用真的需要“一个字节都不能少、顺序也不能乱”,该怎么办?这就轮到 TCP 出场了。
思考题 1
UDP 不保证送达,为什么还有大量应用选择用它?
思考题 2
把可靠传输的职责交给应用层,会带来什么好处和代价?
小结
知识点
- UDP 只做端口寻址与简单校验
- 无连接、不保证可靠与顺序
- 开销小、延迟低,适合实时或简单问答
- 它把可靠性的选择权交给上层应用
参考资料
- Wikipedia(zh):用户数据报协议:无连接的简单传输协议
- Wikipedia(zh):传输层:负责端到端数据传输的一层
思考题答案(仅供参考)
思考题 1
因为可靠是要付出代价的,而许多场景并不需要这种保证。比如一次 DNS 查询丢了重发即可,视频通话更在意实时而非一帧不丢。用 UDP 能省去连接与重传开销,延迟更低,反而更合适。
思考题 2
好处是灵活:应用可以只为自己真正需要的部分实现可靠机制,避免不必要的开销,也能更好地控制实时性。代价是复杂度上移——应用要自己处理丢失、重复和顺序问题,实现负担更重。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪