这个话题网上一搜,结果早就已经汗牛充栋,我为什么还在再写一篇呢?
其实我是在写一篇总结,补充说点别人可能没有说到的点。
IPv4的报文头长度由IHL字段指出,虽然绝大多数的IP报头都没有 选项 ,但是为了统一化处理,协议栈便不能默认报头是固定大小的,也就是说需要复杂地解析和处理,而只要有if语句,就会徒增CPU指令,而且还会破坏局部性,降低cache利用收益。
注意,IHL字段是第一个要解析的,且是必须解析的,这类似于TLV机制,比如ASN.1,但是内核态并不适合处理这个。
IPv6头部固定40字节,所有的策略性选项由Next Header字段指示,这便和TLV有大不同。不再需要在一切处理之前先解析Length。固定长度的协议头非常方便利用cache。
这就是所谓的 IPv6协议端到端延时将缩短 的原因之一!
前面说过,IPv6编址类似于我们的公民身份证编址,它是层次化的。和IPv4相比,IPv6的地址空间和国家,省份,区县等地理空间建立了 有关联的映射 ,比如像IPv4地址中的15.16.x1.y1/16位于北美,而15.16.x2.y2/16却位于东南亚,这种情况在IPv6时代将不复存在。
这无疑简化了管理,降低了管理成本。
值得一提的是,IPv6的分层编址和CIDR思想并不一致。
这一点不要混淆,千万不要觉得CIDR思想以及与之对应的最长前缀匹配算法是路由查找中与生俱来的理所当然,这是不对的。
即便是IPv4协议,最初它也不是CIDR的,而是基于类别的。CIDR是为了应对地址分配不合理和混乱导致的地址浪费问题而提出的见招拆招的解法,它不是与生俱来的!
CIDR固然好,解决了地址分配不合理的问题,但是其代价就是 造成了路由表项的激增。这个问题在IPv6中得到了解决。
请注意,在IPv4中,错的不是地址分类,而是它 分类策略的生成 ,可以说,A类,B类,C类,D类,E类这些分类标准是造成问题的根源。机制是正确的,策略完败!
IPv6的层次化编址,本质上非常类似于IPv4的地址分类,不同的是,IPv6对128bit地址的解释并不仅仅针对于其高位几个bit,而是分散解释,规定了 哪几个bit分别是做什么的 。
同时,在层次化编址之外,又规定了subnet,这里便可以使用CIDR的最长前缀匹配原则了。换句话说,IPv6编址是分类IP和CIDR的某种结合。
收益是, 路由表项可以大规模汇聚,减少了表项的数量! 这直接减少了路由器转发延迟,因为查表的时间短了。
Why?怎么会有这种收益?因为路由器部署都是基于地理位置的(武汉路由器北向接入郑州的线很难想象会接入广州…),而地址分配也是基于地址位置的。
IPv6取消了逐跳的分片。
这意味着什么?
我们是不是都承认一个事实,鸡蛋不要放在一个篮子里。但是如果说只要有一个篮子里碎了蛋,就算玩完,那还是把鸡蛋都放进一个篮子吧…
我们简单算一下。
假设一条链路丢包率为 p p p,一包丢失概率为 p p p,而如果发生了分片,分成了 n n n个包,那么丢失任何一个包的概率就成了 n × p n\times p n×p,出事的概率增加了。
我们知道,对于TCP这种协议而言,只要丢失一个分片,整个包都要重传,这就意味着 IP分片大大降低了网络的利用率。
当然,IPv6取消了逐跳分片,改成了端到端分片,这遍提高了网络利用率。当然了,对于那种不Care丢包的协议,这种改变可能并没有带来其承诺的收益,但无论如何,不也节省了端主机的内存么?不然呢,等待一个已经丢失的分片,无论如何,都要徒劳消耗一些内存的吧…
如果说IPv4可以靠NAT解决地址不够用的问题,那么在5G,IoT时代,就不行了,Why?
无论如何,查表开销都会激增。
很难想象一个管理员去配置一个电子细胞的IP地址…
很难想象一个普通用户敲入像192.168.1.1这样的地址敲入IPv6地址去登录路由器…
既然128bit的地址很难记忆,那干嘛还要去记忆它?
自动配置免除了记忆IPv6地址的必要性。
这个就不多说。
IPv4地址空间保留了3块私有空间,分别是10.,172.,192.,这些,就不多说了。
IPv6中同样也定义了类似的ULA地址,参看RFC4193:https://tools.ietf.org/html/rfc4193
是不是IPv6向IPv4学习的呢?并不是!
IPv4的私有地址空间可以说是 专门用于NAT (求别抬杠,我知道有情况下并不需要NAT),事实上,IPv4私有地址空间的存在,将一维的IPv4空间分裂成了两个,成了二维的地址空间,两个维度相互正交,互不影响,这就意味着每一个IPv4公网地址都可以映射成所有的私有空间的任何一个,这就为NAT提供了唯一性依据。
那么IPv6的ULA呢?
IPv6明确的说,并不需要NAT,如果你还对NAT念念不忘,那是遗毒…
IPv6的ULA是为了让所有人都可以使用IPv6通信而不必非得有一个全球IP,这便于个人和企业使用ULA组建私有网络。
IPv4中不经运营商(比如你新买了一台电脑)随意配置一个192.168的地址已经成为常态,IPv6中也需要类似的地址,不必经过运营商分配的,你可以肆意使用的。ULA就是了。
ULA有一个特性非常值得体会:
什么?私有地址也能全球唯一?
是的!
我们不要小看这40bits的Global ID,这个空间比IPv4空间大得多,只要随机算法足够好,全球唯一根本不是事儿!
大家都用过VMWare虚拟机,它的虚拟网卡MAC地址是怎么保证唯一性的呢?毕竟这种网卡只是虚拟的,并没有任何厂商去生产它,怎么做到的呢?
答案就是 随机性生成算法。 不光虚拟机网卡的MAC地址,类似TAP,VETH这种虚拟网卡也同样。
回到IPv6的ULA Global ID,它也是靠这种机制来生成的,具体算法参见:
Unique Local IPv6 Unicast Addresses: https://tools.ietf.org/html/rfc4193
Internet Protocol Version 6 (IPv6) Addressing Architecture: https://tools.ietf.org/html/rfc3513
RFC4193 IPv6 Generator: https://cd34.com/rfc4193/
最后,请注意,ULA不是让你用来NAT的!
NAT都不需要了!
NAT是需要成本的,不管是类似Linux内核conntrack的成本,还是Cisco网关表项固化和查找的成本,都是成本!
NAT,特别是有状态NAT破坏了互联网的对等原则!成了一个C/S当道的世界。这就相当于你有一部只能打不能接的电话,是什么感觉?
IPv6让互联网变得真正互联互通,彼此对等。
网上很多人说,IPv6能将网络延迟大大降低一个数量级!
这是有点扯淡了!
如果这一个数量级的延迟是由于你在协议栈处理IPv4数据包的时候故意sleep了1000ms,那么换成IPv6,确实能有数量级的延迟降低,但是呢,哈哈。
你要明白RTT的组成和光速极限,在RTT组成中,很多时候,大头就是传播延时,这是光速极限所决定的,而IPv6能降低的只是处理延时,比如协议头的简化带来的处理延迟的降低,以及路由表项的减少带来的查表开销的降低。
但是,IPv6不能突破光速!它甚至只是一个网络层协议而已,并不涉及物理层传输,扯淡也要找准了再扯吧。
IPv6可能不再有内网的概念了,它将直接把任何可路由的公网IP地址暴露在外!
然而这将大大改变现有的互联网拓扑,所有的防火墙都要重新设计,这涉及到工业界,学术界以及政界的博弈,并不是谁能说了算的。
所以说,运营商很有可能会按照IPv4的方式运作IPv6,当你的路由器上线时,直接在地址池里捞一个动态的IPv6地址给你,注意,只有一个地址,至于说你的家用路由器后面是什么,运营商不管,你购买服务时,运营商也不会过问,因为他们根本就不会 给你的任何设备都分配一个固定的IP地址并且收取费用 ,他们放弃了这笔收入,带来的是简单。
千万不要用IPv4的思维来看IPv6,但这只是一种宗教式的教诲,事实上呢?
事实上包括BAT在内的绝大多数互联网厂商,其声称的IPv6大规模支持,都是假的,其实都是在用IPv4的思路在运作IPv6,而已!
大规模支持IPv6,并不是仅仅换一个地址那么简单的事,它复杂的多!都说自己大规模支持IPv6,响应号召,抢占先机罢了。
2006年,我在长春一家和吉大合作的公司做网络协议教学系统,我负责用Java Eclipse SWT做界面,做得还不错。当时有一个项目组做IPv6相关的。
我觉得这个产品太伟大了,它本质上就是在教你什么是IPv6的啊!只可惜,我当时并未涉入太深。
这一晃就13年了,IPv6在部署上并没有进展太多,同样,我们对它的理解上,也没有太多的新东西。文章不断写,实验也不断做,它到底什么时候能取代IPv4,真的是未知数。5G,IoT这些,到底是噱头多一些,还是实质多一些呢?
其背后的推力呢,政府是舆论导向的,运营商是利润导向的,互联网企业是流量/利润导向的,…我们没有看到一个是技术导向的,哈哈,对于这些群体而言,技术显得并不重要,更重要的,是铺在技术上面对他们而言更重要的东西。
浙江温州皮鞋湿,下雨进水不会胖。