想象这样一个场景:你想给远方的朋友寄一张明信片。你没有打电话确认对方在不在家,没有用挂号信,也没有买运输保险。你只是写好地址,贴上邮票,往邮筒里一扔,然后转身就走。邮局会尽量帮你送到,但如果半路上明信片丢了、淋湿了、或者和另一封信的顺序颠倒了,你既不会收到通知,也没法要求重寄——而你最初图的就是这份“快”和“省”。UDP 协议,就是计算机网络世界里的“平信”。它把数据往网络里一扔就不管了,不建立连接、不确认收没收到、不重传丢失的报文。正是这种“不管不顾”的洒脱,让 UDP 成了实时视频、在线游戏、DNS 查询这些对速度极度敏感、能容忍少量丢失的业务的最爱。这篇文章,我们就从寄平信的视角,把 UDP 从信封格式到工程选型一探究竟。

岗位关联

对 AI 从业者而言,理解 UDP 是理解实时 AI 应用(如语音交互、视频流推理)延迟预算的基石,也是区分“算法调得好”与“系统跑得稳”的关键一环。

目录
  1. 可视化演示
  2. 无连接特性
  3. 数据报格式
  4. 可靠性弱项
  5. 端口复用
  6. TCP对比
  7. 应用场景
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

无连接特性

寄平信的过程,和打电话形成鲜明对比。打电话前要先拨号、等待对方接听,还常常要寒暄“喂,你在吗?”——这就是一次握手。而寄平信呢?你把信扔进邮筒的那一刻,事情就结束了,对方是否在家、邮局是否愿意接单,你一概不管。UDP 就是这种“扔下就走”的风格:发送方调一次发送接口,数据报就被丢进网络,双方之间不存在任何事先约定的会话状态。

在计算机网络里,这种风格被称为“无连接”。TCP 在通信前需要经历三次握手来同步双方状态,而 UDP 零握手,connect() 甚至都不是必须的。对于程序员来说,UDP 的 socket 编程模型极其简单:每个报文都是独立的快递包裹,发完即忘。也正因如此,一台服务器用 UDP 可以同时“服务”成千上万个客户端,因为服务器根本不需要记住“谁是谁”,来一单处理一单。

从系统开销的角度看,这个差距可以用一个最朴素的公式刻画:

平信的洒脱,换来的是速度;UDP 的“无连接”,换来的是极低的启动延迟。在 AI 语音助手这类需要“张嘴就说”的场景里,省掉三次握手就意味着省掉了大半个往返时延,用户听到的“叮咚”声能快上几十毫秒——这体验差距,就像你明明已经把明信片写好,却还要等邮局先打个电话确认一样令人着急。

CUDP=0,CTCP=3C_{\text{UDP}} = 0, \quad C_{\text{TCP}} = 3
UDP 建立连接的开销是 0 次报文交换,而 TCP 至少要 3 次(SYN、SYN+ACK、ACK)。没有握手,就没有等待,这就是“平信直投”的速度来源。
  1. UDP 连接开销UDP 不建立连接,所以握手次数为 0,发送方想发就发,不需要对方应答。
    CUDP=0C_{\text{UDP}} = 0
  2. TCP 连接开销TCP 面向连接,三次握手需要交换三个控制报文才能进入数据传输阶段。
    CTCP=3C_{\text{TCP}} = 3

数据报格式

明信片的背面,有固定的书写格式:收件人地址、寄件人地址、邮票。UDP 报文也有自己的固定“信封格式”——8 字节的头部。别看它小,每一块都各司其职:源端口像寄件人房间号,目的端口像收件人房间号,长度标明整封信有多厚,校验和则是信封上的防伪标记。

这 8 个字节精确划分为四个 2 字节字段。源端口和目的端口各占 2 字节,用于标识通信两端的进程;长度字段占 2 字节,表示 UDP 头部加上数据部分的总长度,最小为 8(即只有头部没有数据);校验和字段也占 2 字节,用于检测报文在传输中是否被篡改或损坏。

UDP 另一个容易被忽视的特点是“面向报文”。应用程序每次调用发送接口写入多少数据,接收方就会一次性按同样的边界读出多少数据——邮局不会把两封信拆开混成一封再送。这与 TCP 的“字节流”截然不同:TCP 像一条连续流淌的河,信封的边界会消失;UDP 则坚持每一封信独立完整地送到。

回到平信的比喻:8 字节的头部,就像一张明信片上最精简的地址栏——没有多余的回执联,没有保险单,没有挂号条码。正是这种极简设计,让 UDP 能把几乎全部带宽都留给真正要传的数据,一个 65507 字节的“巨型明信片”,信封成本只占 0.01%。

LUDP头部=2+2+2+2=8 字节L_{\text{UDP头部}} = 2 + 2 + 2 + 2 = 8\ \text{字节}
UDP 头部固定 8 字节,由四个 16 位字段拼接而成。相比 TCP 动辄 20 字节起步的头部,UDP 的“信封”轻便得多。
  1. 源端口占 2 字节记录发送方进程所绑定的端口号,供接收方回信时使用。
    2 字节2\ \text{字节}
  2. 目的端口占 2 字节指明接收方主机上的哪个进程应该收到这份数据。
    2 字节2\ \text{字节}
  3. 长度字段占 2 字节表示 UDP 报文总长(头部 + 数据),范围从 8 到 65535。
    2 字节2\ \text{字节}
  4. 校验和占 2 字节对“伪头部 + UDP 头 + 数据”做反码求和,用于检错。
    2 字节2\ \text{字节}

可靠性弱项

平信最大的痛点是什么?丢了没处查,坏了自己扛。UDP 同样如此。它提供了校验和机制,能发现数据在传输中是否被破坏,但它不做任何补救——不会重传,不会通知发送方“你的信丢了”。就像邮局在分拣机上发现一封被雨水浸湿的信,只会默默把它放进废纸篓,绝不会打电话告诉你“请重寄一次”。

UDP 的校验和基于 RFC 1071 的“16 位反码求和”算法,计算范围除了 UDP 自身头部和数据,还包括一个“伪头部”——它从 IP 头里借来源 IP、目的 IP 和协议号。这个设计是让 UDP 在运输途中能发现“送错城市”的情况。值得注意的是,IPv4 中 UDP 的校验和是可选的(可以置 0 表示不校验),而 IPv6 中则是强制的。

更残酷的现实是 IP 分片:当一个 UDP 报文超过链路 MTU(如 1500 字节)时,IP 层会把数据报切成多个分片分别发送。只要其中任何一个分片丢失,整个数据报都无法在接收端重组,等于整封信作废。UDP 自己对此毫无感知,更不会对某个分片单独重传。因此,一个超过 MTU 的 UDP“大包裹”,在网络质量不佳时反而比几个小包裹更容易“全军覆没”。

“不保证送达”听起来很可怕,但换个角度想:平信之所以便宜,正是因为它放弃了回执和保险。UDP 把“可靠性”这顶帽子摘下来,甩给了应用层。如果你真的在乎那封信,可以自己买保险(应用层重传)、自己抄送一份(冗余发送)、自己编个号(序号检测乱序)——但这些是“用户”的责任,不是“邮局”的义务。

Smax=65535−20−8=65507 字节S_{\text{max}} = 65535 - 20 - 8 = 65507\ \text{字节}
在 IPv4 下,IP 数据报总长上限为 65535 字节,减去 20 字节 IP 头部和 8 字节 UDP 头部,UDP 载荷理论最大值为 65507 字节。注意这只是理论值,实际传输中还需考虑 MTU 分片。
  1. 65535 是 IP 总长上限整个 IP 数据报的长度字段为 16 位,最大表示 65535 字节。
    65535 字节65535\ \text{字节}
  2. 减去 IP 头部 20 字节IPv4 标准头部固定 20 字节,留给上层协议的空间被压缩。
    65535−2065535 - 20
  3. 再减 UDP 头部 8 字节UDP 自身头部占 8 字节,剩余才是应用层真正可以用的数据区。
    65535−20−8=6550765535 - 20 - 8 = 65507

端口复用

一栋写字楼(IP 地址)里有成百上千个房间(端口),邮局送信只认房间号,从不关心房间里住的是谁、有没有人回信。UDP 的端口机制,就是网络层的“房间号系统”。源端口和目的端口各 16 位,意味着每台主机最多可以同时开放 65536 个“房间”供不同的网络应用使用。

端口进一步划分出三个区域:0-1023 是知名端口,好比酒店大堂、前台、保安室这类固定工位,DNS 占 53,DHCP 占 67/68;1024-49151 是注册端口,供普通应用申请“固定工位”;49152-65535 是动态端口,像临时会议室,用完即弃。当 UDP 报文到达主机时,操作系统根据目的端口号,把报文投递到绑定在该端口上的 socket 队列——这个过程叫多路复用分发。

一个有趣的细节是:UDP 允许多个进程通过 SO_REUSEPORT 绑定同一个端口,内核会在这些进程之间做负载均衡。这就像一栋楼的前台(内核)把送到“101 房间”的信轮流分给两个秘书处理。接收缓冲区也值得一提:每个 UDP socket 都有固定大小的接收队列,如果应用层来不及取走报文,不断涌入的新报文会被直接丢弃——信太多了,前台只能把后到的信丢进回收站,而不是无限堆在桌上。

平信时代,一栋楼里上百户人家靠房间号收信;现代网络时代,一台服务器上同时跑着 Web、DNS、视频流,全靠端口号让数据准确敲门。UDP 的端口复用机制,让“平信”可以精准投递到每一个进程手中,而不会因为收件人太多而乱成一团。

N端口=216=65536N_{\text{端口}} = 2^{16} = 65536
16 位端口号理论上有 65536 个取值(0-65535),其中 0 号保留,实际可用约 65535 个。这个数字决定了单台主机能同时维持的 UDP 通信进程上限。
  1. 端口号位数UDP 头部中的源端口和目的端口各占 16 位二进制。
    16 位16\ \text{位}
  2. 端口总数16 位能表示的状态数为 2 的 16 次方,即 65536 种。
    216=655362^{16} = 65536

TCP对比

如果说 UDP 是平信,TCP 就是挂号信加保价快递:寄件时先电话确认(三次握手),运输途中每个中转站都有签收记录(确认号),丢了免费重寄(超时重传),到件后按编号整理好顺序(序号和滑动窗口)。这一切服务都有代价——更贵的邮费(更大的头部)、更长的等待(RTT 翻倍)、更复杂的流程(状态机)。

两者的核心差异集中在三个方面。连接管理上,TCP 有三次握手和四次挥手,UDP 始终“裸奔”;可靠性上,TCP 提供确认、重传、去重、保序,UDP 一概不提供;拥塞控制上,TCP 有慢启动、拥塞避免、快重传,UDP 则是“想发多少发多少”,网络堵了也照发不误——这也是为什么大量 UDP 流量会挤占 TCP 的带宽,被称为“网络公害”。

头部开销的差异在公式里一目了然。TCP 最小头部 20 字节,UDP 固定 8 字节。在传输大块数据时,两者效率差距看起来不大,但在高频小报文场景(如每秒发送 1000 条游戏状态更新)下,多出的 12 字节每包累计起来,就是可观的带宽消耗:

平信与挂号信之争,没有绝对的对错,只有合适与否。传一份合同、一笔转账,你必然选挂号信;直播一场游戏、开一场视频会议,你宁可接受偶尔花屏,也绝不允许画面卡顿三秒。TCP 与 UDP 的取舍,正是“确定性”与“实时性”之间永恒的商业权衡。

ηUDP=DD+8=6550765515≈99.88%\eta_{\text{UDP}} = \frac{D}{D + 8} = \frac{65507}{65515} \approx 99.88\%
当 UDP 传输一个理论最大载荷的数据报时,头部开销占比仅约 0.12%;TCP 在同量级数据下头部占比约 0.03%,但 TCP 还需额外的确认报文反向占用带宽。更关键的是:UDP 不需要等 ACK 就能连续发射,窗口天然无上限。
  1. D 表示数据载荷这里取 UDP 理论最大载荷 65507 字节。
    D=65507D = 65507
  2. D + 8 表示总长度数据加上 8 字节 UDP 头部,构成完整报文。
    D+8=65515D + 8 = 65515
  3. 效率比值载荷占总报文的比重,反映头部开销对带宽的挤占程度。
    DD+8≈99.88%\frac{D}{D + 8} \approx 99.88\%

应用场景

哪些场合该寄平信?答案是“对方丢了也不心痛”的场合。实时音视频通话就是最典型的例子:视频通话偶尔丢一帧画面,人眼几乎无感;但如果为了等重传而卡住半秒,体验瞬间崩塌。这类业务的真实需求是“到了就用,不到就算”,UDP 的“尽力而为”恰好是最优解。微信电话、Zoom、WebRTC 的媒体流,全部跑在 UDP(RTP)之上。

另一个经典场景是 DNS 查询。你访问一个网站时,域名解析往往只是一问一答:客户端发一个查询报文,DNS 服务器回一个应答报文。极少有超过 512 字节的情况(现代 DNS 用 EDNS 扩展后通常也不大)。用“平信”一次往返就能搞定,何必用 TCP 先建个连接、再发请求、再挥手?只有区域传送(zone transfer)或响应特别大时,DNS 才会切换到 TCP。此外,在线游戏中的玩家位置同步、物联网设备的传感器数据上报,也都是 UDP 的主场——前者丢一帧坐标下一帧就补上,后者丢一个温度数据点几乎无影响。

性能调优的要点随之浮出水面:一是把报文长度控制在 MTU 以内(如 1400 字节左右),避免 IP 分片导致“一封崩溃,全信作废”;二是增大 socket 收发缓冲区,扛住瞬时流量洪峰;三是在应用层实现自己的可靠性补偿——前向纠错(FEC)、冗余发送、丢包重传,就像给平信自己加贴保险;四是可以考虑 UDP-Lite 这类变种,只对关键字节做校验,允许非关键数据出错。整体时延模型可以概括为:

选型时记住一句话:能容忍少量丢失、但不能容忍延迟的业务,交给平信;绝不允许丢失的业务,再贵的挂号信也得上。AI 应用的实时推理、语音交互、视频流分析,几乎都能在 UDP 的“快”中找到自己的位置,而模型训练的数据传输、日志上报,则安心交给 TCP。

TUDP=T发送+T排队,TTCP=T握手+T发送+T排队T_{\text{UDP}} = T_{\text{发送}} + T_{\text{排队}}, \quad T_{\text{TCP}} = T_{\text{握手}} + T_{\text{发送}} + T_{\text{排队}}
TCP 的时延账单里永远多出一项“握手税”(约 1.5 个 RTT,跨地域可达上百毫秒),而 UDP 没有这项固定成本。在云计算和边缘 AI 时代,这一差距直接决定了交互式 AI 服务是否“跟手”。
  1. UDP 时延组成只有发送时间和网络排队时间两项,报文嵌入网络即完成交给传输层的任务。
    TUDP=T发送+T排队T_{\text{UDP}} = T_{\text{发送}} + T_{\text{排队}}
  2. TCP 额外握手项TCP 必须在数据发送前完成三次握手,引入额外 1.5 个往返时延。
    TTCP=T握手+T发送+T排队T_{\text{TCP}} = T_{\text{握手}} + T_{\text{发送}} + T_{\text{排队}}

AI 应用场景

实时语音 AI 助手

阶段:实时音频流推理与交互

解决的问题:传统语音 AI 若基于 TCP 传输音频流,一旦网络抖动触发重传,用户会感到应答“断续、延迟”。而语音识别允许少量帧丢失(可通过上下文补全),UDP 能保证音频帧以最低延迟送达模型服务端。

具体案例:某智能音箱语音助手,麦克风采集的 20ms 音频帧通过 UDP 实时上传到云端 ASR 引擎。某帧丢包时,解码器用前后帧插值填补,用户几乎无感知;而交互延迟从 TCP 方案的 800ms 降到 UDP 方案的 350ms。

在线游戏状态同步

阶段:多玩家实时对战的状态广播

解决的问题:游戏服务器每帧要广播所有玩家的坐标、操作、血量。TCP 的确认重传机制会导致“堵车”——一个丢包引发的重传会让后续所有状态更新排队,玩家看到的就是“瞬移”。UDP 丢弃旧状态、只传最新状态,天然契合“以最新为准”的游戏逻辑。

具体案例:某 MOBA 手游的帧同步服务,服务器以 30Hz 频率通过 UDP 向客户端广播战斗状态。当某客户端丢失一帧,下一帧到达后直接覆盖旧状态,画面流畅度由“每秒 5 次瞬移”改善为“平稳 30FPS”。

DNS 域名解析

阶段:AI 应用的首次域名解析和边缘节点发现

解决的问题:AI 服务经常需要快速切换边缘节点(如容灾、就近接入),每次切换都要做 DNS 解析。TCP 查询需要连接建立 + 查询 + 释放,耗时约 2 个 RTT;UDP 查询仅需 1 个 RTT,对毫秒级切换决策至关重要。

具体案例:某 AI 视觉边缘计算平台,端侧设备通过 UDP DNS 查询最近的计算节点 IP。解析耗时从 TCP 方案的平均 210ms 降到 UDP 方案的 95ms,设备切换节点时业务中断时间显著缩短。

Python 演示

python44 行
import socketimport struct def checksum16(data: bytes) -> int:    """RFC 1071 16位反码求和校验算法"""    if len(data) % 2 == 1:        data += b'\x00'    total = 0    for i in range(0, len(data), 2):        total += (data[i] << 8) | data[i + 1]    total = (total & 0xffff) + (total >> 16)    total = (total & 0xffff) + (total >> 16)    return (~total) & 0xffff def build_udp_packet(src_ip: str, dst_ip: str,                     src_port: int, dst_port: int,                     payload: bytes) -> bytes:    """构造一个带伪头部校验和的 UDP 报文"""    udp_len = 8 + len(payload)    src = socket.inet_aton(src_ip)    dst = socket.inet_aton(dst_ip)    pseudo_header = src + dst + struct.pack('!BBH', 0, 17, udp_len)    udp_header_zero = struct.pack('!HHHH', src_port, dst_port, udp_len, 0)    cksum = checksum16(pseudo_header + udp_header_zero + payload)    udp_header = struct.pack('!HHHH', src_port, dst_port, udp_len, cksum)    return udp_header + payload def udp_echo_client(server_ip: str, port: int, message: bytes) -> str:    """演示 UDP 无连接特性:不握手,直接 send"""    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)    sock.settimeout(2)    sock.sendto(message, (server_ip, port))    data, _ = sock.recvfrom(1024)    sock.close()    return data.decode() if __name__ == '__main__':    packet = build_udp_packet(        '192.168.1.5', '8.8.8.8',        50000, 53,        b'Hello UDP'    )    print('UDP 报文总长:', len(packet), '字节')    print('校验和字段: 0x%04x' % ((packet[6] << 8) | packet[7]))
目的:演示 UDP 报文构造的核心环节——伪头部拼接与 16 位反码校验和计算,并附带一个无连接的 UDP 客户端发送样例。
  1. pseudo_header = src + dst + struct.pack('!BBH', 0, 17, udp_len)伪头部把 IP 层的源地址、目的地址和协议号“借”进来,让校验和能发现报文投递错误。
  2. struct.pack('!HHHH', src_port, dst_port, udp_len, 0)先用校验和为 0 的头部参与计算,! 表示网络字节序(大端)。
  3. checksum16(...)对伪头部与报文做 16 位反码求和:每 16 位叠加,溢出回卷,最后取反码。
  4. udp_header = struct.pack('!HHHH', src_port, dst_port, udp_len, cksum)将算出的校验和填回头部第 6-7 字节,得到完整 UDP 报文。
  5. sock.sendto(message, (server_ip, port))无连接的核心体现:不需要 connect(),直接指定目标地址发送,扔进邮筒就是成功。
  6. sock.settimeout(2)如果服务器没有回应(平信丢了),2 秒后抛出超时异常,应用层自行决定是否重发。

常见误区

误区很多初学者认为,既然 TCP 既能保证可靠传输,又能高效利用带宽,那 UDP 还有什么存在的必要?网络协议迟早会统一到 TCP 上。

正解UDP 并非“劣质版 TCP”,而是“没有可靠性负担的极速通道”。实时视频、在线游戏这类业务,最怕的不是丢包,而是延迟和卡顿。TCP 的重传机制在丢包时会“停下来等”,这种确定性对实时业务反而是灾难。UDP 的不可靠,恰恰是它存在了四十多年仍不可替代的理由。

为何常见:教材通常先用大量篇幅讲 TCP 的可靠性机制,让学习者形成“可靠 = 好”的思维定式,忽略了“实时性”同样是一种重要的性能指标。

误区刚接触 UDP 时,觉得它既然没有连接、没有确认,那是不是意味着可以随便往网络里塞数据,根本不需要遵守任何格式?

正解UDP 有自己的协议格式和规则:固定 8 字节头部、16 位端口、长度字段、校验和(IPv6 强制)。它只是“不做可靠性保障”,但仍然负责“正确编址、基本检错、端口分发”。就像平信也得写地址、贴邮票,不能把纸团扔进邮筒就完事。

为何常见:教学时强调“无连接、不可靠”的特点,容易让人忽略 UDP 本身依然是一个结构严密的传输层协议,头部字段和报文边界都是硬性规则。

误区面试中常见回答“UDP 没有握手和确认,所以速度一定碾压 TCP”,进而得出“所有性能问题都可以用 UDP 解决”的结论。

正解UDP 的“无连接”只保证省去握手和 ACK 等待,但传输速度还取决于网络拥塞状况。当网络出现拥塞时,TCP 会主动降速避免丢包,UDP 却继续盲目发送,导致大量丢包、重传(应用层自己做的)反而拖垮整体体验。在公网不稳定环境下,精心调优的 TCP 吞吐可能远超“裸奔”的 UDP。

为何常见:入门者常把“协议开销”与“端到端性能”混为一谈,忽略了拥塞、丢包、队列延迟这些真实网络中最占时间的因素。

误区看到 UDP 有校验和字段,就认为它可以和 TCP 一样,错误检测失败后会自动处理。

正解校验和只能“发现”错误,不能“纠正”错误。UDP 检测到校验失败会直接丢弃报文,且不会通知发送方重传。IPv4 下甚至允许校验和置 0(不校验)。要做到可靠传输,必须在应用层实现确认、重传、排序逻辑,或者干脆改用 TCP。

为何常见:人们容易把“检错能力”等同于“纠错能力”,忽略了协议栈里“发现后丢弃”和“发现后重传”是完全不同的机制。

面试题

Q1. UDP 头部固定占多少字节?

单选题 · easy

  • A.8 字节← 正确答案
  • B.20 字节
  • C.32 字节
  • D.64 字节

答案:A。UDP 头部由源端口、目的端口、长度、校验和四个 2 字节字段组成,共 8 字节。20 字节是 TCP 最小头部长度,32 字节是 IPv6 固定头部长度,64 字节没有协议依据。就像平信信封只需写四个小格子,不需要挂号联和保险单。

Q2. UDP 头部中的目的端口字段占多少位?

单选题 · easy

  • A.8 位
  • B.16 位← 正确答案
  • C.24 位
  • D.32 位

答案:B。UDP 源端口和目的端口各占 16 位,取值范围 0-65535。8 位最多只能表示 256 个端口,无法满足一台服务器上成百上千个进程的寻址需求;16 位对应 65536 个“房间号”,是端口复用的数学基础。

Q3. 在 IPv4 网络中,UDP 报文数据载荷的理论最大值是多少字节?

单选题 · mid

  • A.65535 字节
  • B.65507 字节← 正确答案
  • C.65515 字节
  • D.65527 字节

答案:B。IP 数据报总长上限 65535 字节,其中包含 20 字节 IPv4 头部和 8 字节 UDP 头部,因此 UDP 载荷上限为 65535 - 20 - 8 = 65507 字节。65535 是 IP 总长上限而非 UDP 载荷;65515 只减去了 UDP 头;65527 只减去了 IP 头。

Q4. 以下哪项是 UDP 协议提供的核心能力?

单选题 · easy

  • A.可靠有序传输
  • B.流量控制
  • C.尽力而为交付← 正确答案
  • D.连接状态管理

答案:C。UDP 只保证“尽力而为”——尽力发送、尽力路由,但不承诺送达。可靠有序传输和流量控制是 TCP 的职责,连接状态管理 TCP 才有。UDP 像平信,邮局会尽量送,但丢了不负责。

Q5. IPv4 下,UDP 校验和字段置为 0 表示什么?

单选题 · mid

  • A.校验和计算结果恰好为 0
  • B.报文已损坏
  • C.发送端未计算校验和← 正确答案
  • D.接收端应丢弃该报文

答案:C。IPv4 中 UDP 校验和是可选的,发送端将校验和置 0 表示“我没有算校验”,接收端此时不做完整性检查。若计算结果恰好为 0,发送端会将其设为 0xFFFF 以免混淆。IPv6 中校验和强制启用,不能置 0。

Q6. 以下哪种业务场景最适合使用 UDP?

单选题 · mid

  • A.银行转账交易
  • B.大文件断点续传
  • C.在线实时对战游戏← 正确答案
  • D.邮件附件发送

答案:C。在线游戏的状态更新“以最新为准”,旧状态丢失可用新状态覆盖,且对延迟极敏感,UDP 是天然选择。银行转账、大文件传输、邮件附件都要求绝对可靠,必须用 TCP 的确认重传机制保证数据完整。

Q7. UDP 协议不提供哪些机制?(多选)

多选题 · hard

  • A.可靠重传← 正确答案
  • B.拥塞控制← 正确答案
  • C.错误恢复← 正确答案
  • D.端口复用

答案:ABC。UDP 没有确认和重传机制,谈不上可靠;没有拥塞窗口,网络拥堵时依旧按原速发送;校验失败后直接丢弃,不做恢复。端口复用恰恰是 UDP 提供的核心能力之一,所以 D 是正确项。

Q8. 当一个 UDP 报文大小超过链路 MTU 时,会发生什么?(多选)

多选题 · mid

  • A.交由 IP 层进行分片← 正确答案
  • B.UDP 自动拆分并重传
  • C.若禁止分片则丢弃该报文← 正确答案
  • D.在传输层完成重组

答案:AC。UDP 报文超过 MTU 后由 IP 层分片,接收端重组也在 IP 层(网络层)完成,所以 A 正确、D 错误。UDP 本身不重传,B 错误。如果 IP 头设置 DF(禁止分片)标志且报文超长,路由器会丢弃并返回 ICMP 错误,C 正确。

Q9. UDP-Lite 协议与标准 UDP 的最大区别是什么?

单选题 · hard

  • A.提供数据加密
  • B.支持部分校验和← 正确答案
  • C.增加多路复用通道
  • D.内置压缩算法

答案:B。UDP-Lite 允许应用层指定“校验覆盖范围”,只对关键字节(如 RTP 头部)做校验,非关键数据(如视频帧中的低优先级像素)允许出错。加密、多路复用通道、压缩都不是 UDP-Lite 的核心特性。

Q10. 与 TCP 相比,UDP 的优势有哪些?(多选)

多选题 · mid

  • A.头部开销小← 正确答案
  • B.传输延迟低← 正确答案
  • C.数据严格保序
  • D.无连接建立开销← 正确答案

答案:ABD。UDP 头部只有 8 字节,小于 TCP 的 20 字节,A 对;没有握手和 ACK 等待,报文即时进入网络,延迟更低,B 对;无连接意味着省去三次握手,D 对。UDP 完全不保证报文顺序,C 是 TCP 的特性,不能选。