ipv4和ipv6的兼容性问题

ipv4和ipv6的兼容

现今大多知名网站都是同时支持ipv6和ipv4,这种可以分为两种情况讨论:

  1. 一个IPv4的网络和一个IPv6的网络通信;
  2. 一个IPv6的网络和一一个IPv6的网络通信,但是中间需要经过一一个IPv4的网络。

先以第一种为例:

若一个ipv6服务器想要访问一个ipv4服务器,具体步骤如下:

  1. 客户端通过DNS64服务器查询AAAA记录:IPv6客户端向DNS64服务器查询目标域名的AAAA记录。DNS64是一种将IPv6地址和IPv4地址兼容的DNS服务。当目标域名只有IPv4地址时,DNS64服务器会合成一个伪造的AAAA记录。
  2. DNS64服务器返回含IPv4地址的AAAA记录:如果目标域名只有IPv4地址,DNS64服务器会查询该域名的A记录,然后将其转换为IPv6地址(通常以特定前缀,例如64:ff9b::/96 开头),并返回给客户端一个伪造的AAAA记录。如果目标域名本身有AAAA记录,DNS64服务器会直接返回这些记录。
  3. 客户端将请求发送给NAT64路由器:客户端接收到伪造的AAAA记录后,将其作为目标地址,并根据此地址生成IPv6报文。这个报文被发送到NAT64路由器。
  4. NAT64路由器将IPv6地址转换为IPv4地址,并访问IPv4网络:NAT64路由器识别出伪造的IPv6地址中的IPv4部分,将该地址转换为真实的IPv4地址,并将IPv6报文转换为IPv4报文。然后,NAT64路由器将IPv4报文发送到目标IPv4服务器。
  5. 消息返回到客户端:目标IPv4服务器处理请求并返回响应,响应报文到达NAT64路由器后,NAT64路由器将其转换回IPv6报文,然后将其转发给IPv6客户端。

整个过程的关键是DNS64和NAT64的协调工作,确保IPv6客户端能够通过伪造的AAAA记录访问仅有IPv4地址的服务器。这样,客户端对目标服务器的访问是透明的,无需知道其实际的IPv4地址。

(在这个过程中,其实dns64就相当于提前转换及生成ipv6,nat64相当于双方在进行数据交换过程中的转换)

image-20240711142416116

问题

大家可能在阅读中唯一的疑问就是,当客户端先前往dns64进行目标ipv4转假ipv6的过程中,并未事先通知nat64,为什么nat64能直接从假ipv6中获取到真ipv4呢?这是因为这个转换是可逆的。

具体规则如下(由IETF制定的 RFC 6146(NAT64)和 RFC 6147(DNS64)标准):

  1. IPv4 嵌入 IPv6 地址
    • 当 DNS64 服务器将 IPv4 地址转换为 IPv6 地址时,它会使用一个特定的前缀(例如 64:ff9b::/96)。这个前缀是预定义的,用于标识这些地址。
    • IPv4 地址的32位部分被嵌入到 IPv6 地址的后32位中。例如,一个 IPv4 地址 192.0.2.33 被转换为 IPv6 地址 64:ff9b::c000:0221。
  2. IPv6 地址中的 IPv4 提取
    • 当 IPv6 客户端向伪造的 IPv6 地址(例如 64:ff9b::c000:0221)发送请求时,NAT64 路由器会识别这个前缀(64:ff9b::/96)。
    • NAT64 路由器提取 IPv6 地址的后32位,将其转换回原始的 IPv4 地址(192.0.2.33)。
示例:

假设 IPv4 地址是 203.0.113.1,它在 DNS64 的转换下会变成如下的 IPv6 地址:

  • 原始 IPv4 地址:203.0.113.1
  • IPv6 地址前缀:64:ff9b::
  • 转换后的 IPv6 地址:64:ff9b::cb00:7101

当 NAT64 路由器接收到这个 IPv6 地址时,它会识别前缀 64:ff9b::,然后将后32位 cb00:7101 转换回 IPv4 地址 203.0.113.1。

是不是瞬间清醒了。

另一种:一个IPv6的网络和一个IPv6的网络通信,但是中间需要经过一个IPv4的网络。

这个时候需要用到隧道(tunnel)技术,隧道技术有很多种,但原理基本差不多,就选一种方式详细讲一下:

6to4 隧道工作流程

  1. 生成 6to4 地址
    • 每个 IPv6 节点使用其 IPv4 地址(公共ipv4地址)生成一个 6to4 地址。
    • 6to4 地址的前缀为 2002::/16,IPv4 地址嵌入在地址的后部分。
  2. 封装 IPv6 报文
    • 当节点 A 发送一个 IPv6 报文时,它将报文封装在 IPv4 报文中。封装后的 IPv4 报文包含 IPv6 报文数据。
  3. 通过 IPv4 网络传输
    • 封装后的 IPv4 报文通过 IPv4 网络传输到节点 B。
  4. 解封装 IPv6 报文
    • 节点 B 接收到 IPv4 报文后,将其解封装,提取出原始的 IPv6 报文。
示例详细步骤

假设节点 A 和 B 的具体情况如下:

  • 节点 A
    • 公共 IPv4 地址:192.0.2.1
    • 生成的 6to4 地址:2002:c000:0201::/48
  • 节点 B
    • 公共 IPv4 地址:198.51.100.1
    • 生成的 6to4 地址:2002:c633:6401::/48
  1. 节点 A 向节点 B 发送数据
  • IPv6 报文
    • 源地址:2002:c000:0201::
    • 目的地址:2002:c633:6401::
    • 数据:Hello
  • 封装为 IPv4 报文
    • IPv4 源地址:192.0.2.1
    • IPv4 目的地址:198.51.100.1

封装后的 IPv4 报文通过 IPv4 网络传输到节点 B。

  1. 节点 B 接收并解封装
  • IPv4 报文
    • IPv4 源地址:192.0.2.1
    • IPv4 目的地址:198.51.100.1
    • 包含封装的 IPv6 报文数据
  • 解封装
    • 节点 B 提取出原始的 IPv6 报文:
      • 源地址:2002:c000:0201::
      • 目的地址:2002:c633:6401::
      • 数据:Hello
  1. 节点 B 发送响应
  • IPv6 报文
    • 源地址:2002:c633:6401::
    • 目的地址:2002:c000:0201::
    • 数据:Hi
  • 封装为 IPv4 报文
    • IPv4 源地址:198.51.100.1
    • IPv4 目的地址:192.0.2.1

封装后的 IPv4 报文通过 IPv4 网络传输回节点 A。

  1. 节点 A 接收并解封装
  • IPv4 报文
    • IPv4 源地址:198.51.100.1
    • IPv4 目的地址:192.0.2.1
    • 包含封装的 IPv6 报文数据
  • 解封装
    • 节点 A 提取出原始的 IPv6 报文:
      • 源地址:2002:c633:6401::
      • 目的地址:2002:c000:0201::
      • 数据:Hi

是不是很神奇,这个已经说的很清楚了,如果还是没有看懂,不妨下去再查一查相关的知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/870489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思大模型——MindFormers的使用----从零开始安装配置环境

MindSpore Transformers套件的目标是构建一个大模型训练、微调、评估、推理、部署的全流程开发套件,提供业内主流的Transformer类预训练模型和SOTA下游任务应用,涵盖丰富的并行特性。期望帮助用户轻松的实现大模型训练和创新研发。 MindSpore Transform…

LeetCode 算法:实现 Trie (前缀树) c++

原题链接🔗:实现 Trie (前缀树) 难度:中等⭐️⭐️ 题目 Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0…

关于C# 开发Winfrom事后总结

一:要求能读取文件夹中视频及图片并判断 private void Form1_Load(object sender, EventArgs e){string foldPath "路径";//获取该目录下的文件 string[] files Directory.GetFiles(foldPath "\\", "*.*", System.IO.SearchOption…

Linux编程第三篇:Linux简介,开源软件简介(Linux是否安全?参考TESEC指标)

业精于勤荒于嬉,行成于思毁于随。 今天这篇算是Linux的正式学习,废话不多说,我们开始吧 第三篇 一、UNIX与Linux发展史1.1、UNIX发展历史和发行版本1.2、UNIX主要发行版本1.3、Linux发展历史1.4、Linux内核版本1.5、Linux主要发行版本 二、开…

渐变且描边文字

效果: 用 background-image:linear-gradient实现渐变、 text-shadow实现描边 元素同时添加: background-image: linear-gradient(to bottom, rgba(255, 255, 255, 1), rgba(143, 180, 253, 1));-webkit-background-clip: text;background-…

大整数加法C++

大整数加法C 方法代码 方法 小的数在前,大数在后加数、被加数进行翻转,从低位开始加起,因为数组是从0位开始,与正常手工加法不同。设置进位符carry_flag先对小的数进行控制,做加法再对大的数剩下的部分,做…

Spring支持人工智能应用框架-SpringAi

简介 人工智能技术和日益成熟,开发企业级人工智能的应用已成为一个热门的趋势。Spring AI 是一个用于 AI 工程的应用框架,目的是为了简化AI应用的对接、部署、维护和扩展。 SpringAi的灵感来自LangChain和LlamaIndex,但是SpringAi并不是直接…

Python实现动态迷宫生成:自动生成迷宫的动画

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame定义迷宫生成类主循环 完整代码 引言 迷宫生成算法在游戏开发和图形学中有着广泛的应用。它不仅可以用于创建迷宫游戏,还可以用于生成有趣的图案。在这篇博客中,我们将使用Python…

一文了解java中Optional

文章目录 1. Optional简介2. 常用的接口2.1 常用接口简单使用2.1.1 创建的常用方法2.1.2 获取值的常用方法2.1.3 判定的常用方法2.1.4 判定后的操作方法2.2 map方法介绍 2.2 其他方法2.2.1 Filter 方法2.2.2 FlatMap 方法 3. 常用的实例4. 总结 1. Optional简介 Optional是在ja…

基于Java的校园交友网站系统

你好,我是专注于计算机技术研究的学姐码农小野。如果你对校园交友网站系统的构建或者相关技术感兴趣,欢迎私信交流。 开发语言 Java 数据库 MySQL 技术 Java语言、SpringBoot框架、B/S结构 工具 MyEclipse、Navicat、Maven 系统展示 首页 个人…

Postman:Body类型中的x-www-from-urlencoded参数可以接受GET请求吗?

不可以 今天学习Spring Web MVC,在借助Postman学习 RequestMapping 注解时,发现Body类型中的x-www-from-urlencoded参数不支持GET请求。 按理说 RequestMapping 注解可以支持全部类型的请求,但为何在这里不能支持GET请求呢? 以下是…

Diffusion 加速系列之三 | LCM

0. 资源链接 论文: LCM:https://arxiv.org/abs/2310.04378 项目: https://github.com/luosiallen/latent-consistency-model 1. 背景动机 现有的高分辨率的 diffusion 模型推理存在的问题: Diffusion 模型推理过程包含多步去噪的流程,这会…

VMware虚拟机使用标准分区后对分区进行扩容

前言: 使用虚拟机创建系统后,/ 盘 想要扩容需要几步才能实现,下面将介绍具体流程 确定根分区磁盘以及分区号,和起始扇区和结束扇区 # 查看磁盘名称和分区 # 如下可看出根分区为 /dev/sda2 ,磁盘为sda [root192 ~]# ls…

【鸿蒙学习笔记】元服务

官方文档:元服务规格 目录标题 什么是元服务特征第一个元服务-案例介绍创建项目源码启动模拟器启动entry创建卡片出发元服务 什么是元服务 特征 免安装分包预加载老化和更新机制 第一个元服务-案例介绍 创建项目 源码 Entry Component struct WidgetCard {buil…

qt 线程举例

qt 线程举例 在Qt中,使用线程的一个常见方式是通过QThread类。下面是一个简单的例子,展示了如何创建一个线程并在其中执行任务。 步骤 1: 创建一个Worker类 首先,创建一个继承自QObject的Worker类,这个类将包含要在线程中执行的…

three完全开源扩展案例02-跳动的音乐

更多案例尽在https://threelab.cn/ 演示地址 import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";let mediaElement; let analyser; let scene; let camera; let renderer; let controls; …

RabbitMQ中常用的三种交换机【Fanout、Direct、Topic】

目录 1、引入 2、Fanout交换机 案例:利用SpringAMQP演示Fanout交换机的使用 3、Direct交换机 案例:利用SpringAMQP演示Direct交换机的使用 4、Topic交换机 案例:利用SpringAMQP演示Topic交换机的使用 1、引入 真实的生产环境都会经过e…

1. openstack

openstack 一、云的简介1、优势2、类型2.1 根据提供的服务范围2.2 根据提供服务不同 二、openstack核心组件1、核心组件2、nova组件2.1 nova核心进程 3、glance组件4、cinder组件5、neutron组件6、swift组件7、cellometer组件8、keystone组件9、heat组件10、dashboard 一、云的…

大模型/NLP/算法面试题总结9——从普通注意力换成多头注意力会导致参数暴涨吗?

从普通注意力换成多头注意力(Multi-Head Attention),通常不会导致参数总量暴涨。相反,在某些实现和配置下,参数量的增加可能相对可控,甚至在某些情况下,通过优化可以实现参数量的有效控制。 参…

韦东山嵌入式linux系列-LED 驱动程序框架

1 回顾字符设备驱动程序框架 图中驱动层访问硬件外设寄存器依靠的是 ioremap 函数去映射到寄存器地址,然后开始控制寄存器。 那么该如何编写驱动程序? ① 确定主设备号,也可以让内核分配;② 定义自己的 file_operations 结构体&…