ipV6-程序员宅基地

技术标签: 网络层  

前言

众所周知,32位的IPv4地址已经基本耗尽(这里的耗尽只是说的分配完了,实际上有相当一部分并没有投入到使用中),新一代的网络协议--IPv6采用128位的地址长度拥有更大的地址空间,如此大的地址空间,可以给地球上的每粒沙子分配一个IPv6地址。IPv6网络普及的声音喊了很多年,在国内由于受限于各种因素却一直没有推广开。2017年11月开始中共中央办公厅和国务院办公厅印发了《推荐互联网协议第六版(IPv6)规模部署行动计划》http://www.xinhuanet.com/politics/2017-11/26/c_1122012631.htm,并发出通知,要求各地区各部门结合实际认真贯彻落实。这条新闻传达了一个很重要的信息:这个是推进中国IPv6发展的战略总动员令。2018年6月份,网信办对三大运营商和国内头部的50家互联网公司发出红头文件,要求各大运营商和头部互联网公司给出各自的实施方案和排期,并定下目标:在2018年年底国内IPv6活跃用户数上升一个阶段。所以从2018年6月份开始,各大公司的IPv6改造才紧锣密鼓改造起来,并且在2018年底取得了相当的成果。

由于IPv6网络协议相对来说还是一个比较新的协议,在推广过程中,很多人对这个网络协议缺乏必备的知识,所以在这里写一篇简单的文章对该协议进行简单介绍和应用。

基础概念

软件支持

当前大部分操作系统和硬件都比较好地支持IPv6了,简单列举如下:

  • Windows:windows 7、windows 8.x、windows 10,默认开启IPv6;

  • Linux:内核2.6.x、内核3.x、内核4.x已经支持IPv6(需要手动开启);

  • iOS:IOS9开始已经支持IPv6 Only,2016年苹果已经强制要求app必须支持IPv6;

  • Android也已经支持IPv6(但是不支持DHCPv6)。

如何查看手机或者电脑的网络是否支持IPv6呢,在手机或者电脑上的浏览器中打开:Ipv6-test.com,显示如下说明你的手机网络已经支持IPv6,并已经分配了IPv6地址。

图一:查看当前网络是否支持IPv6

从上述截图中我们可以看到,当前大部分支持IPv6的网络环境中都是双栈环境,即同时支持IPv4和IPv6,也就是当我们连接运营商LTE网络的时候,它一般会分配一个IPv4地址(一般是10.开头的内网地址),和一个IPv6地址(全球单播地址,相当于ipv4里面的公网地址)。双栈环境下,用户自动选择使用什么IPv6或者IPv4协议去连接远端服务,如果服务端域名支持IPv6(域名解析中存在AAAA记录),客户端则会优先使用IPv6协议去连接服务端(特殊情况下除外);当服务端域名只支持IPv4(DNS解析中只有A记录),客户端则会使用IPv4协议去连接服务端,完成请求。

IPv6协议简介

先看一个简单的IPv6报文抓包图:

图二:ipv6数据报文

从WireShark的报文信息来看,IPv6报文的报文类型字段、头部字段和IPv4报文存在较大的差异。RFC2460定义了IPv6数据报格式。总体结构上,IPv6数据报格式与IPv4数据报格式是一样的,也是由IP报头和数据(在IPv6中称为有效载荷)这两个部分组成的,但在IPv6数据报数据部分还可以包括0个或者多个IPv6扩展报头(Extension header),如下图所示。IP报头部分固定为40字节长度,而有效载荷部分最长不得超过65535字节。

图三:IPv6头部字段

简单介绍下IPv6报文中的各个头部字段:

  • Version(版本):该字段表示IP版本,值为6。

  • Traffic class(流量类别):该字段及其功能类似于IPv4的业务类型字段。该字段以区分业务编码点(DSCP)标记一个IPv6数据包,以此指明数据包应当如何处理。

  • Flow label(流标签):该字段用来标记IP数据包的一个流,当前的标准中没有定义如何管理和处理流标签的细节。

  • Payload length(有效载荷长度):该字段表示有效载荷的长度,有效载荷是指紧跟IPv6基本报头的数据包,包含IPv6扩展报头。

  • Next header(下一报头):该字段指明了跟随在IPv6基本报头后的扩展报头的信息类型。

更多详细比较可以参考这篇文章:

IPV6报文头部格式:(http://support.huawei.com/hedex/pages/EDOC10000256133118G231/08/EDOC10000256133118G231/08/resources/fea_des/topics/fea_ipv6_00014.html)

>>>>

IPv6地址表示方法

IPv6地址由八组、每组四位16进制数字组成,每组之间由":"来分隔,看个简单的例子:

2001:cdba:0000:0000:0000:0000:3257:9652,每个:前后都是4位16进制的数字,共分隔成8组)

根据简写规则,上述地址可以简写成如下表示:

1.省略前导零,上述ip地址可以表示为:

2001:cdba:0:0:0:0:3257:9652(4个0简写成1个0)

2.通过使用双冒号(::)代替一系列零来指定Ipv6地址,上述地址可以表示为:
2001:cdba::3257:9652(:0:0:0:0:简写成::,即省略所有的0,需要注意(一个IP地址中只可使用一次双冒号)

>>>>

IPv6地址分类

IPv6地址是单个或一组接口的128位标识符。在IPv4中,ip地址分为A、B、C、D、E五类,而IPv6突破了IPv4类别划分,主要划分为三种地址类型:单播地址、组播地址和任意播地址,各类地址的介绍如下:

  • 单播(Unicast)地址:单播地址作为一个单一的接口标识符。IPv6数据包发送到一个单播地址被传递到由该地址标识的接口。对应于IPv4的普通公网和私网地址;

  • 多播(MultiCast)地址:多播地址作为一组标识符,多播地址的行为/接口可能属于不同的节点集合。IPv6数据包发送到多播地址被传递到多个接口;

  • 任播(AnyCast)地址:一组接口(一般属于不同节点)的标识符。发往任播地址的包被送给该地址标识的接口之一(路由协议度量距离最近的)。

单播地址是使用最为广泛的一类地址,单播地址中包含了多种地址类型,包括:

1-1.单播地址

1-1-1全球单播地址

前缀2000::/3,指的是在IPv6的前3bit,必须为二进制的001。而二进制换化为十六进制,需要4bit的二进制数,所以IPv6全球单播地址的从左到右的第一字段的变化范围为“0010”到“0011”,换化为十六进制变化范围就为2到3。那么如下图4所示,表示IPv6全球单播地址的范围。相当于IPv4的公网地址(IPv6的诞生根本上就是为了解决IPv4公网地址耗尽的问题)。这种地址在全球的路由器间可以路由。

图四. IPv6全球单播地址的范围

1-1-2链路本地地址

前缀FE80::/10,顾名思义,此类地址用于同一链路上的节点间的通信,主要用于自动配置地址和邻居节点发现过程。Windows和Linux开启IPv6后,默认会给网卡接口自动配置一个链路本地地址。也就是说,一个接口一定有一个链路本地地址。如下图:

图五.IPv6链路本地地址

每个接口必须至少有一个链路本地地址;每个接口可以配置1个以上的单播地址,例如一个接口可以配置一个链路本地地址,同时也可以配置一个全球单播地址。

注意:很容易会把链路本地地址和IPv4的私网/内网地址对应起来,其实链路本地地址对应于IPv4的APIPA地址,也就是169.254开头的地址(典型场景就是windows开启自动获取地址而获取失败后自动分配一个169.254的地址)。而IPv4私网对应于IPv6的唯一本地地址。

1-1-3唯一本地地址

前缀FC00::/7,相当于IPv4的私网地址(10.0.0.0、172.16.0.0、192.168.0.0),在RFC4193中新定义的一种解决私网需求的单播地址类型。

在IPv4中,利用NAT技术私网内的网络节点可以使用统一的公网出口访问互联网资源,大大节省了IPv4公网地址的消耗(IPv6推进缓慢的原因之一)。另一方面,由于默认情况下私网内节点与外界通信的发起是单向的,网络访问仅仅能从私网内发起,外部发起的请求会被统一网关或者防火墙阻隔掉,这样的网络架构很好的保护了私网内的节点安全性和私密性。因此,在安全性和私密性要求下,IPv6中同样需要支持私网,并且也需要支持NAT。在Linux内核3.7版本开始加入对IPv6 NAT的支持,实现的方式和IPv4下的差别不大(Linux内核代码中变量和函数的命名几乎就是ctrl+c和ctrl+v过来的)。IPv6唯一本地地址配置如下图:

图六.IPv6唯一本地地址

1-1-4特殊地址

除了上述那些常见的单播地址,IPv6中还有一些特殊地址,简单列举如下:

  • 全0的地址::/128为未定义地址,大家不要去使用

  • 除了最后一位是1,其它都是0的地址::1/128为本地环回地址,同IPv4里面的127.0.0.1

  • FF00::/8这个网段的地址都是多播地址

IPv6相关网络工具

>>>>

dig

dns解析,查看一个域名是否具有AAAA记录

图七.dig获取域名的AAAA记录

>>>>

curl

通过IPv6网络协议进行请求响应,获取服务端数据

图八.curl通过IPv6获取接口数据

>>>>

ping6

查看IPv6网络的连通性和域名解析的正确性

图九.ping6测试IPv6网络连通性

>>>>

telnet

查看对应IPv6地址端口是否开放

图十.telnet查看端口可用性

>>>>

mtr

IPv6网络连通性判断工具

图十一.mtr查看IPv6网络连通性

>>>>

traceroute6

IPv6网络测试、评估和管理工具

图十二.traceroute6查看IPv6路由节点情况

>>>>

ip&route

查看本机IPv6路由表

图十三.查看本机IPv6路由表

关于移动应用在IPv6和IPv4网络环境中自动降级机制的研究

由于最近在帮助业务上线IPv6,所以简单使用安卓手机(小米5S+MIUI10+浏览器)验证了下手机在双栈环境中如何自动选择合适的协议向服务端请求数据。具体过程如下:

第一步需要对服务端的域名进行DNS解析。客户端获取域名的DNS解析时,会先请求域名的AAAA记录,等DNS服务器返回域名的AAAA记录解析后,然后再请求域名的A记录。具体过程如下抓包截图:

图十四.DNS解析抓包

第二步根据获取到的域名的AAAA记录和A记录情况,执行不同的操作:

1.如果AAAA记录中存在有效的IPv6地址,且本地网络支持IPv6,则会优先使用AAAA记录里面对应IPv6地址通过IPv6网络协议去连接服务端,当通过域名的AAAA记录无法连接上服务端,客户端一般会重试4次(重试过程大概总计会耗费300ms左右,视具体网络环境而定),如果四次都无法通过IPV6地址连接上服务端,客户端会自动降级使用IPV4协议连接服务端,具体过程如下图。

图十五.IPv6和IPv4自动降级机制

2.如果域名的AAAA记录中存在有效的IPv6地址,但是本地网络不支持IPv6,则会直接使用A记录中的IPv4地址通过IPv4网络协议去连接服务端;

3.如果DNS服务器返回的AAAA记录解析中没有包含有效的IPv6地址,只有有效的A记录,则会直接使用A记录中的IPv4地址通过IPV4网络协议去连接服务端。

总结

本篇文章仅仅只是对IPv6协议做了简单介绍,涉及的知识方面较少。更多写的是在业务上线IPv6过程中学习到的或者使用过的一些知识、工具。很多IPv6的基本概念并没有介绍到,比如说邻居发现协议、DHCPv6、ICMPv6、PMTU、EUI-64计算链路本地地址等,这些协议在网络上已经有很多比较好的文章或者权威协议对这些知识点进行了介绍,大家不妨多动手谷歌下。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ation_work/article/details/103177184

智能推荐

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

SDUT OJ逆置正整数-程序员宅基地

文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.

年终奖盲区_年终奖盲区表-程序员宅基地

文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表

matlab 提取struct结构体中某个字段所有变量的值_matlab读取struct类型数据中的值-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值

Android fragment的用法_android reader fragment-程序员宅基地

文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment

FFT of waveIn audio signals-程序员宅基地

文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals

随便推点

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点

原生JS 与 VUE获取父级、子级、兄弟节点的方法 及一些DOM对象的获取_获取子节点的路径 vue-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue