我最近在System Verilog中尝试创建TCP / IP数据包生成器和检查程序。为了验证我的代码,我将生成器输出与IP Golden输出进行比较。
我能够将几乎所有字段与Golden输出匹配,但IP标头和版本字段似乎有所不同。我生成了IP版本为4,IHL为5的数据包。
以下是互联网标题的位字段摘要:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
根据上面提到的位字段位置,我们将位0:3作为版本,位4:7作为IHL。现在,通过连接两个字段形成发送的字节。因此,在生成器代码中,我将Version作为字节的LSB部分,并将IHL作为字节的MSB部分。结果形成的字节是0x54,但在黄金输出中,我看到该字节实际上是0x45,看起来相反?
以下是两个输出:
发电机输出:
0000 00 a0 12 01 01 01 00 a0 12 01 01 02 08 00 **54** 00
0010 00 38 30 39 40 00 80 06 5a c9 0a 2a 5a a9 0a 00
0020 00 eb 00 0b 00 37 00 00 00 01 00 00 00 02 50 08
0030 00 03 03 87 04 00 00 01 02 03 04 05 06 07 08 09
0040 0a 0b 0c 0d 0e 0f
黄金输出:
0000 00 a0 12 01 01 01 00 a0 12 01 01 02 08 00 **45** 00
0010 00 38 30 39 40 00 80 06 5a c9 0a 2a 5a a9 0a 00
0020 00 eb 00 0b 00 37 00 00 00 01 00 00 00 02 50 08
0030 00 03 03 87 04 00 00 01 02 03 04 05 06 07 08 09
0040 0a 0b 0c 0d 0e 0f
不确定我在这里遗失了什么?请建议。
谢谢。
答案 0 :(得分:1)
当提到由IETF协议表示的位和字节顺序时,例如, IPv4,您使用网络字节顺序(big-endian)。在您的示例中,这些位按照它们编号的顺序传输:0
到31
,这会产生网络字节顺序。因此,您将在传输IHL之前传输版本,这与您尝试执行的操作相反,并导致第一个字节传输为0x45
RFC 1700, ASSIGNED NUMBERS中解释了这一点:
数据记录
互联网协议文档中的惯例是 用十进制表示数字,用“big-endian”顺序表示数据 [COHEN]。也就是说,字段是从左到右描述的 左边最重要的八位字节和最低八位字节 右边。
此标题和数据的传输顺序 文档被解析为八位字节级别。每当图表显示一个 八位组,这些八位组的传输顺序是 用英语阅读的正常顺序。例如,在 下图中八位字节按它们的顺序传输 编号
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 1 | 2 | 3 | 4 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 5 | 6 | 7 | 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 9 | 10 | 11 | 12 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字节传输顺序
每当八位字节表示最左边的数字量时 该图是高阶或最高有效位。那就是 标记为0的位是最重要的位。例如,以下内容 图表示值170(十进制)。
0 1 2 3 4 5 6 7 +-+-+-+-+-+-+-+-+ |1 0 1 0 1 0 1 0| +-+-+-+-+-+-+-+-+
比特的意义
类似地,每当多个八位字节字段表示数字量时 整个字段的最左边位是最重要的位。 当传输多个八位字节数量时,最重要的八位字节 首先传播。