热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

闲谈IPv6-IPv6地址聚类分配原则于源地址选择的关系

:mans_shoe::mans_shoe::mans_shoe:昨晚又把光头刮了一把,更光了,用疯

:mans_shoe::mans_shoe::mans_shoe:

昨晚又把光头刮了一把,更光了,用疯子的刮眉刀刮头是给弄流血了,悲哀,以及谢特!

我一向喜欢对比两类相似的东西或者同类的两个版本,然后褒一个贬另一个,我不太喜欢中庸,也不太善于一分为二看问题,近期在做IPv6相关的事情,所以自然要和IPv4做对比,那么,哪怕一个细节上,我都忍不住要吐槽IPv4,但这并不意味着IPv4真的就那么挫,这只是我的特色而已。

还是以一个实际例子入手,先吐槽一顿IPv4,然后再说说IPv6怎么怎么好。

看以下的拓扑,一个有钱的用户从三大运营商同时接入互联网:

闲谈IPv6-IPv6地址聚类分配原则于源地址选择的关系

他要么是为了备份线路,要么是为了负载均衡,要么是为了实现访问联通的服务走联通的线路,访问电信的服务走电信的线路…无所谓,不管怎样,显然,它获得了三个IP地址。

此时它发起一个连接,想访问一个服务器,请问:

该连接的源IP地址如何选择?是ip1,ip2还是ip3?

无疑,这个服务器的IP地址肯定是接入三大运营商之一的,DNS会用发起请求的用户IP来给用户返回相同运营商的IP地址,答案似乎很简单,用相同运营商的呗。

是的,这是正确答案,走同运营商的线路可以避免冷土豆跨运营商转交,服务质量更能得到保证,走同运营商当然要用同运营商地址。

这一切都是在路由选择算法中完成的, 源地址选择和下一跳属于同一网段的地址!

我们只要知道了路由,就能决定选择哪个地址作为源IP地址。至于路由嘛,肯定是事先已经配置好的咯。或者说,随便用一个IP作为源地址,然后请求DNS解析域名,DNS返回的一般都是同运营商的目标地址,然后就用请求DNS解析时的IP作为源就得了。

所以,这件事并不难。

但是,路由和DNS是可信任的吗?路由配置就一定稳定可靠吗?如果说这个用户配置了三条等价的默认路由,怎么办呢?

# 联通默认路由
0.0.0.0/0 via $cnc metric 100
# 电信默认路由
0.0.0.0/0 via $tel metric 100
# 移动默认路由
0.0.0.0/0 via $mob metric 100

很多人都这么玩,最终所有上行流量都从cnc出去(取决于实现,要么是第一个配置的,要么是最后配置的),下行流量分布在三条线路,于是就造成了好多跨运营商传输。

你可能会说,可以配置Policy Routing啊,但是,哥,天下那么多服务器地址,你事先怎么知道哪些地址是联通的,哪些地址是电信的…

只要在你发起一条连接的第一个数据包时没有猜对下一跳,就意味着源地址会选错,源地址如果选择了不同运营商的,那么冷土豆转交将会伴随连接的整个生命周期。 所以说,路由一定要选对!

这又是一个先有鸡还是先有蛋的问题,好在我们能拿到一个条目非常全的地址库,或者DNS也能告诉我们这样一个东西,我们剩余的工作就是发挥愚公移山精卫填海铁杵磨成针的精神,去配置吧!

无论如何,这个事情对外部机制的依赖太多了,就选择一个源IP地址而已,却牵扯到了路由,DNS,Policy Routing…

等等!我最近就碰到配置上万条策略路由的!任何困难都难不倒勤劳的人民。

有没有更简单或者更复杂的方法呢?绝对有!我非常擅长解决这种问题。我用Policy Routing,IP Mark,conntrack就可以配置出这种效果,但是我在本文不说,反正非常复杂繁琐且易出错,说白了就是Trick。这种东西我能说一个礼拜,不然怎么能说自己靠着iptables,iproute2这些打通了内核协议栈任督二脉呢…

IPv6登场,事情起了变化,一切变得不一样!

先来看看IPv6地址的分配原则。

首先,IPv6的分配要遵循一个类似身份证的分层的原则:

闲谈IPv6-IPv6地址聚类分配原则于源地址选择的关系

这就使得所有的提供商在自己所辖的辖区内的路由都是可聚合的!IPv6地址提供商的层级结构和IPv6地址空间本身的层级结构完全一致!

分配机构一般会给一个高级别的运营商一个前缀比较短的整个网段,可以容纳百万级的子网,对于外部而言,这么大个运营商网络,可以从一条通告聚合路由抵达,该大运营商在其次级运营商那里分配地址也是同样的原则。

我这里定义一个 “提供商距离” 的概念。全世界所有的提供商形成一个树形结构,所谓的提供商距离就是两个IPv6地址的直接提供商在这棵树纵向上的距离。

请阅读:

RFC3177: https://tools.ietf.org/html/rfc3177

RFC6177: https://tools.ietf.org/html/rfc6177

对于 “提供商距离” 不用说太多,一个例子足矣。

如果自己有一个IPv6地址,随便给定另一个IPv6地址,我们算一下它们共享前缀的长度,就能知道它们共享到几级提供商。比如给定一个地址 240e:8880:4448:1300::222/64 ,问下面3个地址谁跟它的 提供商距离 最近:

a1=240e:8880:4448:1334::123/64

a2=240e:8870:4448:1334::123/64

a3=240e:8880:4448:1000::123/64

非常简单,直接最长前缀匹配就好了嘛!

看着一个地址,就能算出在IPv6地址空间,它离我的IPv6地址有多亲近。

所以,RFC3484里面的源IP地址选择策略中,有个Rule 8:

Rule 8: Use longest matching prefix.

【为啥是Rule 8而不是优先级更高呢?仔细想想!】

If CommonPrefixLen(SA, D) > CommonPrefixLen(SB, D), then prefer SA.

Similarly, if CommonPrefixLen(SB, D) > CommonPrefixLen(SA, D), then

prefer SB.

IPv6的源地址选择,不再像IPv4一样以下一跳为基准执行最长前缀匹配,而是直接以目标地址为基准执行最长前缀匹配!因此,IPv6的源地址选择不再依赖路由!

我们看看,对于IPv6地址的使用者而言,这个分配原则意味着什么。

这意味着,如果你搬了家,或者你的公司搬了家,你大概率不能继续使用原来的IPv6地址了,甚至你必须更改服务提供商,除非你搬到了同一个被分配了相同64位前缀网段的地理范围内。

如果在IPv4的世界,更换一个家庭或者企业的外部IP地址并不是什么问题,因为NAT遍地都是,没人会为内网每一个主机都分配一个公共地址,也没人有这个财力…但是在IPv6世界,NAT不再被建议使用,甚至强烈建议不使用,那么这就意味着,内网有多少设备,就要改多少设备的IP地址!

天啊,这是一场灾难!在这一点上,IPv4+NAT完胜!

幸运的是,IPv6分层聚合+IPv6自动配置(更多的是指无状态自动配置,缩写为SLAAC)可以完美胜任这一艰巨的任务!顺着一溜下去,你几乎不用动手,事情就完了!

之所以IPv4会有本文一开始陈述的那个问题,就是因为IPv4分配机制的无规则且混乱。

你搬家甚至可以带着你的IPv4地址一起搬,你交点服务费,运营商为你添加一条路由即可。理论上讲,如果每个人都这么玩,核心路由表项将会有数亿条。如果我们假设D类,E类地址也能参与分配,且没有私有地址,那么将会有43亿条的路由表项充斥各大路由器!

我来写一个程序,看看在常规的现代计算机上仅仅遍历43亿次执行递增操作需要多久:

#include 
#include 

int main()
{
	unsigned int i = 0;
	for (i = 0; i <0xffffffff; i++) {
		//i++;
	}
	printf("%0x\n", i);
}

看一下执行时间:

[root@localhost NetworkManager]# time ./a.out
ffffffff

real	0m6.644s
user	0m6.637s
sys	0m0.007s

如果换成数亿次的路由表项匹配,呵呵。

IPv4的问题在于它过于灵活,过于灵活在业务无关的底层并不是什么好事。地址随意飘,加路由即可,地址随便分配,不考虑聚合,以为算法总是可以解决效率问题,这便是问题。

IPv6靠强制措施,硬性规定了很多条条框框,从地址分配时就考虑路由表的聚合问题。

我经常在京东买东西,因为我喜欢京东本地没库存宁可不卖也不让顾客遥遥无期等待。但是另一方面,我是个双重标准的人,我吐槽盒马鲜生,因为就隔一条小路,它就是不给送!绝不通融。

浙江温州皮鞋湿,下雨进水不会胖!


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 我们


推荐阅读
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • Python学习day3网络基础之网络协议篇
    一、互联网协议连接两台计算机之间的Internet实际上就是一系列统一的标准,这些标准称之为互联网协议,互联网的本质就是一系列网络协议。二、为什么要有互联网协议互联网协议就相当于计 ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 在使用 Nginx 作为服务器时,发现 Chrome 能正确从缓存中读取 CSS 和 JS 文件,而 Firefox 却无法有效利用缓存,导致加载速度显著变慢。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • 本文详细介绍了如何在Linux系统中使用nslookup命令查询DNS服务器地址,这对于Linux服务器的运维管理是非常重要的基础知识。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 在分析和解决 Keepalived VIP 漂移故障的过程中,我们发现主备节点配置如下:主节点 IP 为 172.16.30.31,备份节点 IP 为 172.16.30.32,虚拟 IP 为 172.16.30.10。故障表现为监控系统显示 Keepalived 主节点状态异常,导致 VIP 漂移到备份节点。通过详细检查配置文件和日志,我们发现主节点上的 Keepalived 进程未能正常运行,最终通过优化配置和重启服务解决了该问题。此外,我们还增加了健康检查机制,以提高系统的稳定性和可靠性。 ... [详细]
  • 在配置Nginx的SSL证书后,虽然HTTPS访问能够正常工作,但HTTP请求却会遇到400错误。本文详细解析了这一问题,并提供了Nginx配置的具体示例。此外,还深入探讨了DNS服务器证书、SSL证书的申请与安装流程,以及域名注册、查询方法和CDN加速技术的应用,帮助读者全面了解相关技术细节。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
author-avatar
黑漆高傲的眼眸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有