为什么Go net.IPv4在内部创建一个16字节的地址

时间:2018-03-06 23:07:45

标签: go

我注意到Go在使用时创建了一个4字节IPv4地址的16字节内部表示:

(i1 < i2 ? i3 : i4) += 3

https://golang.org/src/net/ip.go

是否有最初使用16字节创建IPv4的原因?我正在为广播和网络地址做一些计算,我直接访问了内部字节[]并且混淆了我必须调用// IPv4 returns the IP address (in 16-byte form) of the // IPv4 address a.b.c.d. func IPv4(a, b, c, d byte) IP { p := make(IP, IPv6len) copy(p, v4InV6Prefix) p[12] = a p[13] = b p[14] = c p[15] = d return p } 做类似的事情

To4()

实际上将IPv4地址作为uint32。

1 个答案:

答案 0 :(得分:6)

看起来他们正在使用一种表示,允许他们使用相同的代码轻松处理IPv4和IPv6地址。他们对任何一种IP使用单个16字节表示。

代码顶部的注释(您链接到的)非常清楚地解释了:

// IPv4 addresses are 4 bytes; IPv6 addresses are 16 bytes.
// An IPv4 address can be converted to an IPv6 address by
// adding a canonical prefix (10 zeros, 2 0xFFs).
// This library accepts either size of byte slice but always
// returns 16-byte addresses.

您可以传入IPv4地址的4字节或16字节表示,但库内部将使用16字节的表示,并始终返回这些。