为什么 TCP/IP headers 的大小必须是 32 位的倍数?
Why must the size of TCP/IP headers be multiple of 32 bit?
我已经搜索过了,但大多数书籍只是说有填充可以使 header 成为 32 位的倍数。为什么必须是32位的倍数?
原因是memory alignment。
我将从一个类比开始——想象一个有 1000 个文件抽屉的巨大文件室。这个房间由 100 个单独的橱柜组成,每个橱柜有 10 个抽屉。每个抽屉可以放一张 sheet 的纸,你的秘书(负责处理抽屉中的数据)一次可以处理 10 sheet 秒的数据。
虽然处理的数据量是一样的,但是跟"go process drawers 5-10 in cabinet 12 and drawers 1-5 in cabinet 13"相比,告诉秘书"go process cabinet #83"更简单高效
与CPUs大致相同。 CPUs(秘书)通常不会一次处理一个字节(抽屉)。相反,他们处理 words(多个抽屉),最长可达 512 位(64 字节),因为一次处理整个单词通常比处理较小的数据块更有效率。现代 CPUs 的典型字长是 32 位或 64 位,而 64 位 CPUs 仅在最近 10 年左右才开始普及。
由于 CPU 可以在一次操作中读取整个内存行(文件柜),因此访问地址为 100-109 的十个抽屉比访问地址为 105-114 的十个抽屉花费的时间更少因为前者驻留在两个不同的机柜中,因此需要两个单独的内存访问。因此,访问地址以十的倍数开头的任意 10 个连续的抽屉速度更快。对于 CPUs,这意味着可以更快地访问 32 位或 64 位的倍数的地址。
我已经搜索过了,但大多数书籍只是说有填充可以使 header 成为 32 位的倍数。为什么必须是32位的倍数?
原因是memory alignment。
我将从一个类比开始——想象一个有 1000 个文件抽屉的巨大文件室。这个房间由 100 个单独的橱柜组成,每个橱柜有 10 个抽屉。每个抽屉可以放一张 sheet 的纸,你的秘书(负责处理抽屉中的数据)一次可以处理 10 sheet 秒的数据。
虽然处理的数据量是一样的,但是跟"go process drawers 5-10 in cabinet 12 and drawers 1-5 in cabinet 13"相比,告诉秘书"go process cabinet #83"更简单高效
与CPUs大致相同。 CPUs(秘书)通常不会一次处理一个字节(抽屉)。相反,他们处理 words(多个抽屉),最长可达 512 位(64 字节),因为一次处理整个单词通常比处理较小的数据块更有效率。现代 CPUs 的典型字长是 32 位或 64 位,而 64 位 CPUs 仅在最近 10 年左右才开始普及。
由于 CPU 可以在一次操作中读取整个内存行(文件柜),因此访问地址为 100-109 的十个抽屉比访问地址为 105-114 的十个抽屉花费的时间更少因为前者驻留在两个不同的机柜中,因此需要两个单独的内存访问。因此,访问地址以十的倍数开头的任意 10 个连续的抽屉速度更快。对于 CPUs,这意味着可以更快地访问 32 位或 64 位的倍数的地址。