UDP 首部

文章目录

  • [1 源端口(Source Port)](#1 源端口(Source Port))
  • [2 目标端口号(Destination Port)](#2 目标端口号(Destination Port))
  • [3 包长度(Length)](#3 包长度(Length))
  • [4 校验和(Checksum)](#4 校验和(Checksum))
  • [5 校验和计算中计算 UDP 伪首部的理由](#5 校验和计算中计算 UDP 伪首部的理由)

下图展示了 UDP 首部的格式。UDP 数据报由首部和数据部分组成,其中首部位于数据部分之前。

UDP 首部包含以下四个字段:源端口号、目标端口号、包长度和校验和。

1 源端口(Source Port)

源端口号用于表示发送端的端口号(用于标识应用程序或进程),字段长度为 16 位。

在某些情况下,源端口号是可选的,可能不会被设置为具体值。

例如:当不需要返回通信时,源端口号字段可以设置为 0。

需要注意的是,这种设置通常用于单向通信场景,且并非所有协议都支持源端口号为 0。

2 目标端口号(Destination Port)

目标端口号表示接收端端口号,字段长度为 16 位,用于将数据报交付给相应的本地应用或服务。

3 包长度(Length)

该字段表示整个 UDP 数据报的长度,单位为字节(即 8 位),包括 UDP 的首部和数据部分。

4 校验和(Checksum)

校验和是为了检测 UDP 首部和数据在传输过程中是否发生了错误而设计的。

在计算校验和时,需要先将下图所示的 UDP 伪首部附加到 UDP 数据报之前。

若数据部分的长度不是 16 位的倍数(偶数字节),则在末尾补 0 以对齐。

此时应将 UDP 首部中的校验和字段置为 0,然后以 16 位为单位进行 1 的补码和计算,并将所得到的 1 的补码和填入校验和字段。

将伪首部、UDP 首部和数据拼接到一起,按 16 位(两字节)划分并相加(发生溢出时将高位进位加回到低 16 位),然后对结果取反(one's complement),所得 16 位结果即为校验和。

若取反结果为 0x0000,则应发送 0xFFFF(all-ones),因为 0x0000 在 IPv4 中用于表示"未计算校验和"。

接收端主机在收到 UDP 数据报以后,会通过 IP 首部获知 IP 地址信息,进而构造出 UDP 伪首部,然后重新进行校验和计算。

校验和字段的值等于除该字段外其余部分的 1 的补码和。因此,包括校验和字段在内的所有数据之和为"16"位全部为"1"时,才会被认为所收到的数据是正确的。

另外,UDP 中有可能不使用校验和。此时,校验和字段中填入 0 。在这种情况下,由于不进行校验和计算,因此协议处理的开销会降低,从而提高数据转发的速率。

然而,如果 UDP 首部的端口号或 IP 首部的 IP 地址在传输过程中遇到损坏,那么可能会对其他通信造成不好的影响。

因此,在互联网中推荐使用校验和检查。

5 校验和计算中计算 UDP 伪首部的理由

在 TCP/IP 中,识别一个进行通信的应用程序需要 5 项信息,它们分别为"源 IP 地址"、"目标 IP 地址"、"源端口号"、"目标端口号"、"协议编号"。

然而,在 UDP 首部中,只包含它们当中的 2 项(源端口号和目标端口号),剩下的三项都包含在 IP 首部中。

假设其他 3 项信息被破坏会产生怎样的后果呢?很显然,这极有可能会导致应该接收数据包的应用程序收不到数据包,不该收到数据包的应用程序却收到了数据包。

为了避免这类问题的发生,有必要验证一个通信中必要的 5 项信息是否正确。为此,在校验和的计算中,引入了伪首部的概念。

此外,IPv6 的 IP 首部中已取消校验和字段。TCP 和 UDP 通过引入伪首部机制,对这 5 项信息进行校验,从而在 IP 层不再提供校验的情况下,仍能保证端到端的数据完整性。

相关推荐
chian-ocean8 小时前
深入 CANN:使用 `tbe-op` 构建自定义高性能算子
网络
中议视控8 小时前
可编程网络中央控制系统主机通过红外发射棒控制空调电视等红外设备
网络·物联网·5g
数据安全科普王9 小时前
打破中心枷锁:P2P网络如何用“去中心化”重构互联网通信
网络·去中心化·p2p
爱吃烤鸡翅的酸菜鱼10 小时前
CANN ops-nn激活函数与池化算子深度解析
网络·开源·aigc
saber_andlibert11 小时前
TCMalloc底层实现
java·前端·网络
飞凌嵌入式12 小时前
用「EN 18031认证」通关欧盟,这张 “网络安全护照” 已就位
网络·安全·能源
Trouvaille ~13 小时前
TCP Socket编程实战(三):线程池优化与TCP编程最佳实践
linux·运维·服务器·网络·c++·网络协议·tcp/ip
JoySSLLian14 小时前
手把手教你安装免费SSL证书(附宝塔/Nginx/Apache配置教程)
网络·人工智能·网络协议·tcp/ip·nginx·apache·ssl
Zach_yuan14 小时前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络
猫头虎14 小时前
如何解决 OpenClaw “Pairing required” 报错:两种官方解决方案详解
网络·windows·网络协议·macos·智能路由器·pip·scipy