所以有几个网站会为你计算你的链接本地ipv6地址,就像这里的这个。
尽管如此,它并没有给出任何有用的关于这个地址是如何计算的,也没有输入参数是什么。那么,如果一个人知道自己的ipv4地址、子网掩码和网关地址,计算链路本地ipv6地址的过程(或算法)是什么?我正在使用SCTP套接字做一个项目,该项目使用ISATAP网络隧道和LL ipv6地址用于构建ISATAP地址。
前面的回答没有注意到,在使用ISATAP时,有一个定义的过程用于从IPv4地址生成链路本地IPv6地址,并且有一个不同的过程用于从MAC地址生成链路本地IPv6地址。这两件事无关。
对于ISATAP,32位IPv4地址前面加上fe80::200:5efe或fe80::200:5efe的96位,以获得128位IPv6链路本地地址。
对于MAC到IPv6,将48位MAC地址一分为二,中间插入16位,这些位为ff:fe,然后用64位链路本地前缀fe80::将其前置,最后翻转第5个IPv6段中的第7位,以获得128位IPv6链路本地地址。
下面的代码提供了一些示例,展示了如何使用IPAddress库在Java或Go中进行转换。免责声明:我是这些库的项目经理。
这些示例还有助于可视化上述转换。
开始:
func convertToIsatap(ipv4Str string, isGlobal bool) string {
ipv4Address := ipaddr.NewIPAddressString(ipv4Str).GetAddress().ToIPv4()
zero := &ipaddr.IPv6AddressSegment{}
segments := make([]*ipaddr.IPv6AddressSegment, ipaddr.IPv6SegmentCount)
segments[1], segments[2], segments[3], segments[4] = zero, zero, zero, zero
segments[0] = ipaddr.NewIPv6Segment(0xfe80)
segments[5] = ipaddr.NewIPv6Segment(0x5efe)
if isGlobal {
segments[4] = ipaddr.NewIPv6Segment(0x200)
}
ipv6Address, _ := ipv4Address.GetIPv6Address(ipaddr.NewIPv6Section(segments))
return ipv6Address.String()
}
func convertToLinkLocalIPv6(macAddr string) string {
macAddress := ipaddr.NewMACAddressString(macAddr).GetAddress()
ipv6LinkLocal, _ := macAddress.ToLinkLocalIPv6()
return ipv6LinkLocal.String()
}
fmt.Println("1.2.3.4 becomes ISATAP " +
convertToIsatap("1.2.3.4", true))
fmt.Println("aa:bb:cc:11:22:33 becomes " +
convertToLinkLocalIPv6("aa:bb:cc:11:22:33"))
爪哇:
static String convertToIsatap(String ipv4Str, boolean isGlobal) {
IPv4Address ipv4Address = new IPAddressString(ipv4Str).getAddress().toIPv4();
IPv6AddressSegment zeroSeg = new IPv6AddressSegment(0);
IPv6AddressSegment segments[] =
new IPv6AddressSegment[IPv6Address.SEGMENT_COUNT - 2];
segments[1] = segments[2] = segments[3] = segments[4] = zeroSeg;
segments[0] = new IPv6AddressSegment(0xfe80);
segments[5] = new IPv6AddressSegment(0x5efe);
if(isGlobal) {
segments[4] = new IPv6AddressSegment(0x200);
}
return ipv4Address.getIPv6Address(
new IPv6AddressSection(segments)).toString();
}
static String convertToLinkLocalIPv6(String macStr) {
MACAddress macAddress = new MACAddressString(macStr).getAddress();
return macAddress.toLinkLocalIPv6().toString();
}
System.out.println("1.2.3.4 becomes ISATAP " +
convertToIsatap("1.2.3.4", true));
System.out.println("aa:bb:cc:11:22:33 becomes " +
convertToLinkLocalIPv6("aa:bb:cc:11:22:33"));
两个示例的输出相同:
1.2.3.4 becomes ISATAP fe80::200:5efe:102:304
aa:bb:cc:11:22:33 becomes fe80::a8bb:ccff:fe11:2233
链路本地地址可以根据RFC 4862基于MAC地址,也可以根据RFC 4941随机生成。
通常情况下,这应该限制在全局范围内,但一些系统会将这种隐私扩展实现扩展到本地范围。按照serverfault上的问题进行讨论。
RFC 4291的附录A描述了从MAC地址计算修改后的EUI-64的方法。一旦修改了EUI-64,只需将其放在地址的低64位,并将fe80::放在高64位。
基本上,你翻转MAC地址的第7位,然后打包它的前24位(包括翻转的位),然后是fffe,然后是MAC地址的较低24位,总共64位。
话虽如此,您的问题是如何从IPv4地址和子网掩码派生链路本地地址。你不能这么做。IPv4地址和子网掩码(如果确实存在的话——IPv6不要求IPv4在同一接口上运行)与IPv6地址无关,二者没有任何关联。IPv4网关地址(同样,如果有)的相关性更低。
我检查了下面的代码以获取ipv6地址,这段代码返回了全局单播地址,比如“2001:x:x…”。但我想获得链接本地地址,比如“fe80:…”。如何使用以下代码获取链接本地地址?
问题内容: 我有使用地址的应用程序(它存储它们的时间很长),因此它只了解地址。 可以将地址转换为with 吗? 问题答案: 尽管IPv4地址范围具有等效的IPv6,但是您不能将所有IPv6地址都转换为IPv4-IPv6地址比IPv4地址更多。 解决此问题的唯一明智的方法是更新您的应用程序,以便能够理解和存储IPv6地址。
我无法理解为什么这个命令不起作用: 注意:我已经用把上面的链接本地地址弄错了,但我有一些有效的链接本地ipv6地址是端口号。 我得到了一个错误: 我也试着放单引号/双引号,但结果是同样的错误: 我使用的是OpenSSL 1.1.0f版本,它应该支持IPv6。 使用IPv4地址,它可以工作。
此函数创建sockaddr_in6: 基本上,如果地址是IPv4地址,我会在它前面加上,并将该族设置为af_inet。 这有可能做到。如果是,我做错了什么?
如何在cmd上运行csr生成命令。exe openssl req-节点-newkey rsa: 2048-keyoutwww_mydomain_com.key-outwww_mydomain_com.csr-subj"/C=BB/ST=CCC/L=DDD/O=EEE。/OU=IT/CN=mydomain.com"
以下是托管Web服务器的机器的ipconfig输出: 以太网适配器局域网连接: 特定于连接的DNS后缀:链接本地IPv6地址…:fe80::f85b:4256:ee76:24a4∗IPv4地址………:10.213.254.119子网掩码………:255.255.255.0默认网关……:10.213.254.252 我可以使用以下方式访问该网站:http://10.213.254.119/test“现