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
相关推荐
仲南音9 小时前
Xilinx FPGA——时钟IP核MMCM、PLL
fpga开发
I'm a winner1 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20201 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
Eloudy1 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
Rambo.xia1 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
upper20201 天前
FPGA部署卷积神经网络识别MINST图片
fpga开发·卷积神经网络·minst·minst识别·部署神经网络·神经网络识别图片
你是我的解忧王子2 天前
嵌入式 ADC采样 原始数据分析上层(平均值 波动率 正态分布 线性补偿 系统误差)
fpga开发·数据挖掘·数据分析
9527华安2 天前
FPGA纯verilog代码ISP图像处理培训教程,基于IMX214,提供工程源码+视频教程+FPGA开发板
图像处理·fpga开发·isp·imx214·mipi
千寻xun3 天前
二、实战篇-NVME SSD控制之ZYNQ实现(六)-读写NVME SSD硬盘数据
fpga开发·nvme·nvme ssd
千寻xun3 天前
二、实战篇-NVME SSD控制之ZYNQ实现(三)
fpga开发·nvme ssd·nvme协议