UDP校验和——解释两个16位整数相加的方法?

网络工程 协议论 UDP
2022-03-02 13:37:30

有人可以向我解释如何对两个 16 位整数进行 UDP 校验和。在使用环绕、求和和校验和时?这里有一个例子......

将这两个 16 位整数相加

1110011001100110
1101010101010101

我该怎么做呢?

1个回答

您正在寻找的答案可以在这里找到

出于完成原因,我将其粘贴在这里:

“首先,校验和计算在 RFC 768 中定义,但关于如何有效计算它的提示在 RFC 1071 中。两者都值得一读,并且包含我将在这里写的更深入的描述。

基本思想是 UDP 校验和是通过 IP“伪标头”和实际 UDP 数据计算的 16 位反码和的补码。IP 伪报头是源地址、目的地址、协议(用零字节填充)和 UDP 长度。所以以这个短包为例,源IP地址是152.1.51.27,目的IP地址是152.14.94.75。分为 16 位数量,分别是 0x9801、0x331b 和 0x980e、0x5e4b。如果您使用二进制补码将它们加在一起(例如使用 Windows 计算器),您将得到 0x1c175。请注意,这会溢出 16 位数量,但我们稍后会处理。接下来是添加协议和 UDP 长度。对于这个数据包,协议是 UDP,所以协议类型字节是 17 或 0x11。我们用零填充它以获得 0x0011,然后添加 UDP 长度,即 0x000a(10 个字节)。所以0x1c175 + 0x0011 + 0x0!00a = 0x1c190。

现在我们添加整个 UDP 数据报,将其全部视为 16 位数量并跳过校验和(直到我们完成计算!)。对于这个数据报,即 0xa08f、0x2694、0x000a、0x6262,所以如果我们将所有这些加到运行总和中,我们得到 0x1c190 + 0xa08f + 0x2694 + 0x000a + 0x6262 = 0x2eb1f。

现在要转换为 16 位和的补码,我们只需将当前和 (0x2eb1f) 视为 32 位量,并将高半部分与低半部分相加。0x0002 + 0xeb1f = 0xeb21。(如果仍然有溢出,我们将再次添加高半部分和低半部分,直到不再溢出。)现在我们对这个数量进行补充(即翻转所有位,或进行 NOT 操作),我们得到一个值0x14de 这正是报告的校验和在数据包中显示的内容。”