我的编程空间,编程开发者的网络收藏夹
学习永远不晚

IPv6的NAT原理是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

IPv6的NAT原理是什么

IPv6的NAT原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在亿万互联网用户享受着Internet带来便利的同时,IPv4地址即将耗尽的问题却早在20年前就被网络专家们意识到了,并采取了措施延缓IPv4的消耗,这项措施就是NAT(网络地址转换)技术。NAT主要作用在于节约IP地址,而非所谓的增加IP的方向性以及隐藏私有IP,且IPv4的NAT打破了互联网本身的“互联”特性,使得一部分IP地址不再双向可达,NAT为无方向的IP协议增加了一个方向,特别是stateful的NAT类型。此时,IPv6时代已逐渐到来。

而IPv6的标准中不建议使用NAT,这是何缘由呢?我们已知IPv6地址数量巨大,只要在地球上,都可为蚂蚁配置IP设备,因此IPv4的一些修补手段将不再需要,为了保持协议本身以及相关标准的纯洁性,在IPv6中几乎不再建议使用NAT。虽然不再建议使用,但在某些必要情况下,还是可能需要实现IPv6的NAT。在RFC6296的标题是IPv6-to-IPv6 Network Prefix Translation中,描述了IPv6下的NAT的实现要点,给出了一个合理的建议,既保持了IP的无方向性,又可以满足NAT的语义,这就是IPv6之NAT stateless的缘由。

IPv6地址有将近128个可随意调配的位,其庞大的地址空间,一般的单位都会被分配到一个拥有很大量地址的网段,此网段拥有足够多的地址来和内网主机进行映射,即可用于映射的IP地址池容量巨大,且既然不想再使用非IP层的信息来保持信息,又要保持映射,那就要用纯IP层的信息,这样对上层影响最小。对于IPv6而言,NAT利用checksum算法来保持流标识信息,丝毫不管这个checksum是谁的checksum,因为它根本就不改变数据包的checksum...

接下来给大家讲解一下checksum无关性和自动转换,就是考虑a+b+c+d=X。其中X就是checksum,我们把a,b当成源IP地址的两部分,c,d当成目的IP地址的两部分,我们作源地址转换,将a和b都改变,比如a改变成了A,那么将b改成多少才能保持checksum的值X不变,求解即可。IPv6的建议NAT实现亦是上文这个原理,只是将其换为计算机布尔数域求解。既然可以不触动第四层的checksum值,那么NAT对第四层协议的影响也就减小了,虽然它还是解决不了诸如ESP/AH等穿越NAT的问题。基于以上算法,IPv6在做NAT的时候,在给定的子网网段内,可以自动生成一个新的IP地址供映射之用,从算法本身来看,冲突的可能性非常之小致于0。

既然IPv6的NAT机制“自动”为一个连接选择了一个IP地址,那么当返回包到来的时候,如何把地址转换为原地址呢?IPv6的NAT把地址“转换回去”这件事完全靠算法本身,而算法本身就能将转换后的地址再转回原来的,具有解的唯一性,在IPv6的NAT实现中,算法只针对IP地址中16位的地址信息进行自动生成,而其它的则需要手工显式配置,由于内网IPv6地址可以使用MAC地址映射成唯一的地址,且转换后的地址是唯一的,将这一切反过来,最后还是能映射回原始的IP地址的。

如果抛开地址转换这一说,仅仅考虑算法本身,那还是可以给出一个实际可以运行的代码的,该代码使用了计算checksum的算法:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

//以下2个函数就是计算校验码的,具体的原理请参RFC1071/RFC1624/RFC1141。

static inline u_int16_t add16(

    u_int16_t a,

    u_int16_t b)

{

    a += b;

    return a + (a < b);

}

static inline u_int16_t csum16(const u_int16_t *buf, int len)

{

    u_int16_t csum = 0;

    while(len--) csum = add16(csum, *buf++);

    return csum;

}

int main(int argc, char **argv)

{

    u_int16_t buf[18] = {0};

    int i = 0;

    memcpy(buf, "efghhijk", 8);

    memcpy(buf+4, "12345678", 8);

    memcpy(buf+8, "xxyywert", 8);

    memcpy(buf+12, "zxcvkljh", 8);

    //正确做法是打印16进制数据,此处为了简单,打印了字符串

    printf("原始数据:%s  长度:%d\n", (char*)buf, strlen((char*)buf));    

    printf("原始数据的校验码:%X\n", csum16(buf, 16));    

    u_int16_t tip[3] = {0};

    memcpy(tip, "#$!%", 4);

    u_int16_t tip_sum = csum16(tip, 2);

    printf("\nNAT规则: efghhijk1234/12 -〉efghhijk#$!%/12\n\n");

    printf("固定从第9个字节开始修改4个字节为:%s 其校验码为:%X\n", (char*)tip, tip_sum);

    //定位固定修改后的动态修改的初始地址,注意,我们仅仅修改16位信息

    u_int16_t* pcsum = buf + 4+2;  

    //计算动态修改的值

    *pcsum = ~add16(

        add16(

            ~(*pcsum),

            ~csum16(buf+4, 2)

        ),

        tip_sum

    );

    printf("动态修改的值为:%X\n", *pcsum);

    memcpy(buf+4, tip, 4); //完成修改

    printf("当前数据:%s  长度:%d\n", buf, strlen((char*)buf));    

    printf("当前校验码:%X\n", csum16(buf, 16));    

    printf("-------------以下是还原操作-------------\n");

    printf("\n反向NAT规则: efghhijk#$!%/12 -〉efghhijk1234/12\n\n");

    u_int16_t tip2[3] = {0};

        memcpy(tip2, "1234", 4);

    printf("我们只需要记住原始数据被固定修改前的:%s\n", tip2);

    u_int16_t tip_sum2 = csum16(tip2, 2);

    u_int16_t* pcsum2 = buf+6;

    *pcsum2 = ~add16(

        add16(

            ~(*pcsum2),

            ~csum16(buf+4, 2)

        ),

        tip_sum2

    );

    //还原

    memcpy(buf+4, tip2, 4);

    printf("原始数据:%s\n", (char *)buf);

    printf("原始校验码:%X\n", csum16(buf, 16));    

}

运行结果如下:

IPv6的NAT原理是什么

把以上的原理套用在IPv6的NAT上,就是一种实现。

关于IPv6的NAT原理是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

IPv6的NAT原理是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

IPv6的NAT原理是什么

IPv6的NAT原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在亿万互联网用户享受着Internet带来便利的同时,IPv4地址即将耗尽的问题却早在20年前就被网
2023-06-03
2024-04-02

ipv6是什么

今天小编给大家分享一下ipv6是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。ipv6是什么意思答:ipv6是互联网协议
2023-07-02

IPv6是什么?你期待IPv6的降临?

  现有的互联网是基于Ipv4协议的,这一协议的成功促成了互联网的迅速发展。但是,随着互联网数量不断增长以及对互联网应用的要求不断提高,面对Ipv4地址的匮乏,启用Ipv6,推动Ipv6网络的应用,已成为互联网发展的必然趋势。  IP地址是互联网协议的重要组成部分,它可以识别接入互联网中的任意一台设备。而Ipv4和和I
IPv6是什么?你期待IPv6的降临?
2024-04-18

如何理解IPv6过渡技术中的NAT-PT技术

这篇文章将为大家详细讲解有关如何理解IPv6过渡技术中的NAT-PT技术,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 IPv6的应用是一个循序渐进的过程,IPv4“海洋”与IP
2023-06-03

webservice的原理是什么

Web服务的原理是通过使用HTTP协议进行通信,提供一组标准化的接口和方法,使不同的应用程序能够相互交互和通信。以下是Web服务的基本原理:服务描述:Web服务通过WSDL(Web Services Description Language
webservice的原理是什么
2024-02-29

CAS的原理是什么

本篇内容介绍了“CAS的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在并发编程中我们都知道i++操作是非线程安全的,这是因为 i
2023-06-15

AOP的原理是什么

这篇文章主要讲解了“AOP的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“AOP的原理是什么”吧!AOP的原理对哪些对象在什么位置拦截做什么 <=>
2023-06-03

redis的原理是什么

redis 是一款内存数据库,使用单线程架构和复杂的数据结构,实现了高性能和可扩展性。它支持数据持久化和复制,以确保数据安全性和可用性。Redis 的原理Redis 是一款开源的高性能键值对数据库,它以其快速、可靠和可扩展性而闻名。它的工
redis的原理是什么
2024-04-20

Drupal的原理是什么

小编今天带大家了解Drupal的原理是什么,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“Drupal的原理是什么”的知识吧。Drup
2023-06-04

ShutdownHook的原理是什么

这篇文章主要讲解了“ShutdownHook的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ShutdownHook的原理是什么”吧!ShutdownHook介绍在java程序中,
2023-06-15

Elasticsearch的原理是什么

本篇内容主要讲解“Elasticsearch的原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Elasticsearch的原理是什么”吧!Lucene 和 ESLuceneLucene
2023-06-16

JSONP的原理是什么

JSONP的原理是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是JSONP首先提一下JSON这个概念,JSON是一种轻量级的数据传输格式,被广泛应用于当前Web应用中
2023-06-14

java.util.Random的原理是什么

这篇文章给大家介绍java.util.Random的原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。java.util.Random可以产生int、long、float、double以及Goussian等类型的
2023-05-31

HTTP代理的原理是什么

这篇文章主要讲解了“HTTP代理的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HTTP代理的原理是什么”吧!这种情况在爬行动物的制作过程中经常发生。一开始,爬行动物正常工作,数据
2023-06-20

Golang原生rpc的原理是什么

这篇文章主要讲解了“Golang原生rpc的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang原生rpc的原理是什么”吧!创建rpc接口,需要几个条件方法的类型是可输出的方
2023-06-29

android leakcanary的原理是什么

Android LeakCanary是一个用于检测内存泄漏的开源库。它的原理主要包括以下几个步骤:1. 监测对象的引用关系:LeakCanary会监测应用中所有的对象引用关系,包括Activity、Fragment、View等。它会跟踪对象
2023-09-23

jvm的SystemGC原理是什么

这篇文章主要介绍了jvm的SystemGC原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇jvm的SystemGC原理是什么文章都会有所收获,下面我们一起来看看吧。概述JVM的GC一般情况下是JVM本身
2023-06-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录