UDP协议

UDP协议

    • 一、UDP协议诞生背景与作用
      • [1.1 为什么需要UDP?](#1.1 为什么需要UDP?)
      • [1.2 UDP与TCP的对比](#1.2 UDP与TCP的对比)
    • 二、UDP报文格式
      • [2.1 UDP结构](#2.1 UDP结构)
      • [2.2 IP 首部](#2.2 IP 首部)
      • [2.3 UDP 字段](#2.3 UDP 字段)
      • [2.4 UDP伪头部(校验和计算)](#2.4 UDP伪头部(校验和计算))
      • [2.5 抓包分析](#2.5 抓包分析)
    • 三、UDP的端口号
      • [3.1 端口号范围](#3.1 端口号范围)
      • [3.2 常见UDP端口](#3.2 常见UDP端口)
    • 四、常见基于UDP的协议
      • [4.1 DNS(域名系统,端口53)](#4.1 DNS(域名系统,端口53))
      • [4.2 DHCP(动态主机配置协议,端口67/68)](#4.2 DHCP(动态主机配置协议,端口67/68))
      • [4.3 TFTP(简单文件传输协议,端口69)](#4.3 TFTP(简单文件传输协议,端口69))
      • [4.4 NTP(网络时间协议,端口123)](#4.4 NTP(网络时间协议,端口123))
      • [4.5 RTP(实时传输协议)](#4.5 RTP(实时传输协议))
      • [4.6 QUIC(Quick UDP Internet Connections)](#4.6 QUIC(Quick UDP Internet Connections))

一、UDP协议诞生背景与作用

1.1 为什么需要UDP?

在TCP/IP协议栈中,TCP提供了可靠的、面向连接的传输服务,但它带来了额外的开销:

  • 三次握手建立连接
  • 确认和重传机制
  • 流量控制和拥塞控制
  • 顺序保证

这些特性在某些场景下是不必要的负担

场景 为什么TCP不适用
实时音视频 重传会导致卡顿,宁可丢包也不等重传
DNS查询 一个请求一个响应,不需要建立连接
网络游戏 延迟比可靠性更重要,旧数据无意义
SNMP监控 少量数据,丢包可由应用层处理
DHCP 广播请求,TCP不支持广播

UDP(User Datagram Protocol,用户数据报协议) 的定位是:

提供一种无连接、不可靠、基于数据报的传输服务,最小化协议开销。

1.2 UDP与TCP的对比

特性 TCP UDP
连接性 面向连接(三次握手) 无连接
可靠性 确认、重传、序列号 不保证,丢包不重传
顺序保证 按序交付 不保证,可能乱序
流量控制 ✅ 滑动窗口
拥塞控制
校验和 可选(IPv4)/ 强制(IPv6) 强制
报文边界 字节流,无边界 数据报,保留边界
广播/组播
头部开销 20-60字节 8字节
适用场景 文件传输、Web、邮件 实时通信、DNS、DHCP、SNMP

核心差异:TCP是"电话"(建立连接、可靠传输),UDP是"明信片"(扔出去不管,可能丢失)。

二、UDP报文格式

2.1 UDP结构

2.2 IP 首部

  • 版本 :4位IP版本号(Version),这个值设置为二进制的 "0100" 时表示 IPv4,设置为 "0110" 时表示 IPv6,目前使用比较多的IP协议版本号是 4
  • 首部长度 : 4位首部长度(IHL,Internet Header Length),表示IP首部一共有多少个 32bits(4个字节)。最大可表示15个 32 bits,因此 IP 的首部长度最大值为 60 字节
  • 服务类型 :8位服务类型(TOS,Type of service),该字段被划分成两个子字段:3位优先级字段(现在已经基本忽略掉了)和4位TOS字段,最后一位固定为0。服务类型为0时表示一般服务
  • 总长度 :16位IP数据报总长度(Total Length),包括IP首部和IP数据部分,以字节为单位。我们利用IP首部长度和IP数据报总长度,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长16bit,所以IP数据报最长可达65535字节。尽管理论上可以传输长达65535字节的IP数据报,但实际上还要考虑网络的最大承载能力等因素
  • 标识 :16位标识(Identification)字段,用来标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1
  • 标志 :3位标志(Flags)字段
    • 最高位为保留位
    • 中间位是 DF (Don't Fragment),表示禁止分片,只有 DF = 0 时才允许分片
    • 最低位是 MF (More Fragment),MF = 1 表示后面还有分片,MF = 0 表示最后一个分片
  • 片偏移 :13位片偏移字段,指较长的分组在分片后某片在原分组中的相对位置,以 8 字节为偏移单位,也就是说每个分片的长度一定是 8 字节的整数倍
  • 生存时间 :8位生存时间字段TTL(Time To Live),设置了数据报可以经过的最多路由器数,表示数据报在网络上生存多久,防止丢失的数据包在无休止的传播TTL的初始值由源主机设置,一般为32、64或者128,一旦经过一个路由器,它的值就减 1,减到 0 时,数据报就丢弃,并发送 ICMP 消息通知源主机
  • 协议 :8位协议(Protocol)类型,指出此数据报携带的数据使用何种协议以便目的主机的 IP 层将数据部分上交给哪个处理过程。 0x01 表示为 ICMP 协议, 0x02 表示为 IGMP 协议, 0x06 表示为 TCP 协议, 0x11 表示为 UDP 协议
  • 首部校验和 :16位首部校验和(Header Checksum),该字段只校验数据报的首部,不包含数据部分;校验IP数据报头部是否被破坏、篡改和丢失等。
  • 源 IP 地址 :32位源IP地址(Source Address),即发送端的IP地址,如192.168.1.123
  • 目的 IP 地址 :32位目的IP地址(Destination Address),即接收端的IP地址,如192.168.1.102
  • 可选字段 :是数据报中的一个可变长度的可选信息,选项字段以32bit为界,不足时插入值为0的填充字节,保证IP首部始终是32bit的整数倍,没有的话长度可以为 0 。

IP首部校验和的计算方法:

复制代码
1、将16位检验和字段置为0,然后将IP首部按照16位分成多个单元;
2、对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位);
3、此时仍然可能出现进位的情况,将得到的和再次分成高16位和低16位进行累加;
4、最后将得到的和的反码填入校验和字段。

2.3 UDP 字段

字段 长度 含义 说明
源端口 2字节 发送方的端口号 可选,不需要时可填0
目的端口 2字节 接收方的端口号 必须,用于区分应用层协议
长度 2字节 UDP头部+数据的总长度 最小值8(无数据),最大值65535
校验和 2字节 检测数据完整性 强制(IPv4可选,IPv6强制),覆盖UDP头部+数据+伪头部

注意

  • UDP长度字段是冗余的,因为IP头部也有总长度字段,但UDP自己保留一份
  • 最大UDP数据报长度 = 65535 - 8(UDP头) - 20(IP头) = 65507字节
  • 实际以太网MTU为1500,超过需要分片

2.4 UDP伪头部(校验和计算)

UDP校验和不仅覆盖UDP头部和数据,还覆盖一个伪头部(Pseudo Header),用于验证数据是否正确到达目标。

伪头部结构(IPv4):

伪头部的作用

  • 确保UDP数据报正确到达目标IP和端口
  • 如果IP地址不匹配,校验和会失败
  • 伪头部不传输,只在计算校验和时临时构造

校验和计算规则

  1. 将伪头部 + UDP头部 + UDP数据(如果UDP数据长度为奇数,在计算校验和时,末尾追加一个0字节作为填充。)按16位为单位进行求和
  2. 每16个bit(即2个字节)组成一个数,相加,如果超过16个bit,把超过的高位值加到这16个bit值上,得到的新值再和下一个值相加
  3. 如果最后还剩8个bit值,不能简单的加到低位,要把这8个bit当成高位值,再用0填充一个16个bit值,相加
  4. 最后取反,填充到校验和字段

2.5 抓包分析

三、UDP的端口号

3.1 端口号范围

范围 分类 说明
0-1023 知名端口(Well-Known Ports) 系统占用,需要root/admin权限
1024-49151 注册端口(Registered Ports) 应用注册使用
49152-65535 动态/私有端口(Dynamic/Private) 临时分配,客户端使用

3.2 常见UDP端口

端口 协议 用途
53 DNS 域名解析
67/68 DHCP 动态主机配置
69 TFTP 简单文件传输
123 NTP 网络时间同步
161 SNMP 网络管理
514 Syslog 系统日志
520 RIP 路由信息协议
1900 SSDP 简单服务发现(UPnP)
5353 mDNS 组播DNS
33434-33500 traceroute 经典UDP traceroute使用

四、常见基于UDP的协议

4.1 DNS(域名系统,端口53)

工作流程

  1. 客户端发送UDP DNS查询(域名→IP)
  2. DNS服务器响应(通常UDP,超过512字节可能用TCP)
  3. 一次查询一个响应,无连接

为什么用UDP

  • 请求响应模式,不需要建立连接
  • 数据量小(通常)
  • 延迟敏感

4.2 DHCP(动态主机配置协议,端口67/68)

工作流程

  1. 客户端广播DHCP Discover(UDP)
  2. 服务器响应DHCP Offer
  3. 客户端请求DHCP Request
  4. 服务器确认DHCP ACK

为什么用UDP

  • 需要广播(客户端不知道服务器IP)
  • 基于事务,不需要长期连接
  • 简单高效

4.3 TFTP(简单文件传输协议,端口69)

  • 基于UDP的可靠文件传输
  • 应用层实现:ACK确认、超时重传
  • 每个数据块(512字节)都需要确认
  • 用于网络设备配置上传/下载、PXE网络启动

4.4 NTP(网络时间协议,端口123)

  • 高精度时间同步
  • UDP低延迟,适合时间戳传输
  • 客户端-服务器模式

4.5 RTP(实时传输协议)

  • 音视频实时传输
  • 容忍丢包,不能容忍重传延迟
  • 常用于VoIP、视频会议、直播

4.6 QUIC(Quick UDP Internet Connections)

  • 基于UDP的可靠传输协议(由Google开发,现为IETF标准)
  • 在UDP之上实现了TCP的可靠性 + TLS加密
  • 解决TCP的队头阻塞问题
  • HTTP/3底层使用QUIC
相关推荐
LCMICRO-1331084774612 小时前
长芯微LPS123完全P2P替代ADP123,高性能、低压差的线性稳压器
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·线性稳压器
fei_sun14 小时前
面经、笔试(持续更新中)
fpga开发·面试
xixixi7777714 小时前
通信领域的“中国速度”:从5G-A到6G,从地面到星空
人工智能·5g·安全·ai·fpga开发·多模态
Nobody3316 小时前
Verilog always语句详解:从组合逻辑到时序逻辑
fpga开发
李嘉图Ricado18 小时前
FPGA 时序约束与分析
fpga开发
白又白、21 小时前
时序优化和上板调试小结
fpga开发
Z22ZHaoGGGG1 天前
verilog实现采样电流有效值的计算
fpga开发
fei_sun1 天前
牛客Verilog刷题篇
fpga开发
my_daling1 天前
DSMC通信协议理解,以及如何在FPGA上实现DSMC从设备(1)
学习·fpga开发