还是抛出老问题,IP地址到底是属于主机的还是属于网卡的?理解了这个看似无聊的问题,可以帮助你增强各种动态路由协议,IPv6等技术的理解深度。
请看我在2013年的一篇文章《闲聊计算机IP网络》,此文从技术的角度解释了该问题,本文将从另外一个角度来解释。
...
这个问题是在帮朋友设计一个IS-IS和IP Anycast相关模块时一起聊到的,由于朋友不想透露更多的细节,我也就不再说过多。仅仅针对问题而解释问题。
其实这个问题现在非常好回答,我们把IP地址换成别的说法,叫做网络层标识,那么问题就变成了“设备的网络层标识到底是属于主机的还是属于网卡的?”
答案很简单,在OSI模型下,它是属于主机的,在TCP/IP模型下,它是属于网卡的。
Why?这要从OSI模型以及TCP/IP模型的编址说起了。
我们在学习网络的时候,不管是上课还是看书自学,几乎第一节课都是OSI分层模型,然后其实这个模型就没啥用了,后面所有的内容都是围绕着TCP/IP展开,即便是IS-IS,也不是纯的OSI模型的版本,而是兼容IP协议的集成IS-IS...所以对于大多数人来说,OSI分层模型仅仅停留在概念阶段,并且这个概念还是十分模糊的。
但是其实,OSI模型和TCP/IP模型的差异十分巨大!这种差异体现在我们对一些基本概念的理解上,哦,对了,跟IPv6也有关系...
网络层编址
先来看看TCP/IP模型是怎么来划分网段的:
所以说,一个路由器会属于不同的网络中,比如我们常见的默认网关,它就属于内网和外网,在内网和外网均有一个角色。因此它有至少2个IP地址,内网网卡上的IP地址标识其内网的角色,而外网的IP地址标识其外网的角色。
对于更加复杂动态路由域的划分,也是如此。以OSPF为例,Area的边界在路由器。
这种编址方式直接影响了转发动作中的路由查找。路由器收到一个数据包之后,如果数据包的目标地址属于自己的一个网络,那么将会匹配到一种特殊的路由,即链路层路由。这种链路层路由不需要配置,是根据网卡所配置的IP地址自动生成的,也叫做自动发现的路由。比如路由器的一个网卡eth0配置了IP地址192.168.1.20/24,数据包的目标IP为192.168.1.30,那么将会配置到下面的一条路由项,我以Linux为例:
192.168.1.0/24 dev eth0 proto kernel scope link
这个项中proto kernel以及scope link的含义就是内核自动发现的链路层路由。线缆两端只要不跨越三层设备,且配置同一个网络标识(即IP地址与掩码的按位与)的IP地址,就可以通过这个链路层路由通信,无需任何配置。不过如果你非要配置一个两端属于不同网段的IP地址,然后靠配置静态路由的方式来保证两边的互通,那谁也拦不住你。
总的来讲,在IP网络中,链路层路由几乎总是数据包的最后一跳采用的路由,后面提到OSI模型时,我们就会知道OSI采用了另一种完全不同的方式处理最后一跳。
因此,IP地址的编址方式实际上是与MAC地址对应的,它标识的是一块网卡所延伸出去的那条链路。之所以不直接使用网卡的MAC地址而引入一个IP地址,是因为IP地址在MAC地址上增加了逻辑含义,表现为以下几个方面:
1.屏蔽底层差异,统一操作接口
由于网卡类型各异,MAC地址的格式并不统一,甚至有些网卡根本就没有MAC地址的概念,只有类似设备序列号的概念。提供一个抽象的IP层,可以屏蔽掉这些差异,这也是分层模型中网络层的首要任务。以IPv4为例,其地址格式是统一且规整的。
如果全世界所有的设备均安装以太网卡,统一为48位MAC地址,请接着看第2点和第3点。
2.层次化
MAC地址空间是平坦的(各个厂商的厂商编号根本就没有规律,网卡的出厂批次编号也不是按照寻址意义编码的,它们可能更看重维修和淘汰),无法利用局部性原理进行汇聚寻址。而IP地址和前缀(即掩码)的组合可以对地址空间进行分层,将其组织成一棵32层的二叉树。在这棵树上执行最长前缀匹配即可精确寻址到每一个节点。起初的设计为分类IP地址,后来逐步被无类编址取代。这种层次化方式可以通过地址规划,路由汇聚等操作大大减少路由查找的开销,不然如果直接使用MAC地址寻址,则最好的方案也就是哈希查找了。
3.多重命名
一块网卡只能有一个MAC地址,但是如果逻辑上需要将一个物理网络分为多个逻辑网络呢?多个IP地址可以配置在同一个网卡上。
--------------
IP地址的编址方法极其意义基本就是以上这些了,下面看下OSI模型的编址方案
--------------
OSI模型的网络层编址方案彻底与链路层脱离一切关系。
不管是NSAP还是NET,名称不重要,我把它们统称为NSAP,这就是OSI模型的网络层地址。与IP地址配置在网卡上不同,NSAP地址配置在主机(包括终端机,路由器等)上,典型情况下一台设备不管有多少块网卡,只有一个NSAP地址,在需要“多重命名”的环境,会有多个NSAP地址,但并不多见。因此OSI划分网络的方式如下:
你应该知道为什么IS-IS和OSPF的Area划分边界不同了吧。IS-IS的Area边界在链路上而非路由器接口。
现在看一下OSI模型如何三层寻址。
在中间网络,跟IP寻址几乎是一样的,NSAP地址虽然在结构上更加复杂,但是与IP地址拥有一致的特性,也是逻辑层次化,可以规划,汇聚的,路由算法IS-IS也如OSPF一样基于SPF算法,所不同的是下一跳寻址。IP网络是依靠的是ARP(仅限以太网链路),而OSI则是采用了邻居发现协议。对于最后一跳寻址,IP网络依靠链路层路由用来寻址最后一跳,而OSI网络则是依靠ES-IS协议完成类似的事情。
ES-IS也是几乎自动运行的,不需要任何配置。比较有意思的是,虽然与IP协议的最后一跳寻址不同,IPv6采用了OSI模型ES-IS的风格。IPv6针对端节点也有一个类似的自动配置协议,来无人干预自动配置其IPv6地址,在寻址最后一跳目的地时,不再使用ARP协议,而是采用了类似ES-IS的方式路由数据包。这是不是从侧面说明OSI模型的下一跳寻址方案比IPv4的ARP更加优越呢?
本质上,ES-IS更像是一个下一跳寻址协议而不是一个路由协议。所有的终端主机(End-System,简称ES)会向路由器(简称IS)发送ESH报文,这样路由器就会采集到所有与之相连的端主机,同样,路由器会泛洪ISH报文,这样所有与之相连的端主机也就知道了路由器的存在极其配置。是不是很像IPv6的邻居发现和自动配置呢?
下一跳寻址
关于下一跳寻址,IP网络会更简单一些,由于IP地址在配置时已经与某个网卡接口有了关联,所以在路由查询得到下一跳之后,只需要在对应的接口发出询问即可,比如ARP协议就是干这个事情的。
与IP网络不同的是,OSI网络解除了NSAP地址与网络接口的关联,所以不再知道该从哪个网卡接口发送询问解析下一跳,所以就需要独立的邻居发现协议来建立下一跳,网卡接口以及MAC地址之间的关联。这与IPv6非常类似...
其实话不能这么说,应该是IPv6与OSI非常类似。难不成OSI是更合理的模型?虽然在实用性上TCP/IP胜利了,但是在下一代TCP/IP中,模型回归了...
关于这个话题,我以我觉得比较酷的IPv6自动配置来结束本节,IPv6的自动配置可以在不需要类似DHCP协议的前提下实现自动配置IP地址,无需任何干预,只要上电开机即可:
(我当然知道链路本地地址,全局单播地址这类概念,只是我不明说,我希望能为IPv4找到一个这样的协议,而不套用任何IPv6的概念)
服务编址
IP网络中,服务体现在传输层,由以下的标识组成:IP地址+协议号+端口号。其中协议号区分了有连接服务(TCP)与无连接服务(UDP),而端口号标识具体的服务进程,这是很容易理解的,因为几乎所有的网络程序都是这么写的,socket,bind,listen,accept已经被标准化。
对于OSI网络,服务直接体现在网络层,由以下的标识组成:CONP|CLNP+NSAP地址。其中在网络层就已经区分了服务的类型,CONP面向连接,而CLNP则类似IP,无连接。NSAP地址结构比较复杂,本文不讨论,在这个NSAP地址中有一个组成部分,即最后一个字节,它叫NSAP selector,它标识了具体的服务进程,类似IP网络的端口号。对于路由器而言,显然这个字节的值为0。
总结:
TCP/IP模型的IP地址标识的是链路,OSI网络的NSAP地址标识的是设备,显然后者更合理??
运营商为什么倾向于选用IS-IS
首先,我觉得这个问题不要一味的尝试从纯技术的角度去分析为什么,因为对于运营商而言,技术因素本来占据的份额就不多,这种问题应该从历史的发展角度去分析。
虽然TCP/IP最终赢了OSI成了事实上的标准,但是这仅仅意味着TCP/IP在“全网”得以部署,这个“全网”有多大决定了路由要怎么配置!所以说两条线都很重要,其中一条线是TCP/IP在全网的部署,另外一条线则是“全网”规模的扩大。当网络规模扩大到一定规模的时候,动态路由才会派上用场。
在上世纪80年代末到90年代初,TCP/IP模型(1983年出世)已经赢得了全网,但是网络规模尚不足以扩大到必须使用比较复杂的动态路由协议,这意味着OSPF这种复杂的协议并没有太大的吸引力,充其量只是RIP大行其道。现在说说IS-IS。
IS-IS一开始是DEC开发的。在其部署的时候,TCP/IP正方兴未艾。IS-IS的目的很明确,是要替代RIP,这意味着网络规模已经变大了。等到TCP/IP意识到需要支持动态路由的时候,IS-IS已然成为了一个现成可用的东西,而此时的OSPF才刚刚起步。
当网络达到需要专门的运营商这个实体才可运营的规模时,运营商迫切需要一种新的动态路由协议来替代复杂的人工配置以及RIP协议之前完成的工作,然而此时成熟的方案只有IS-IS,此时的OSPF尚不足以稳定运行,运营商唯一的选择几乎就是IS-IS。
上学的时候,教科书上讲到IS-IS都是运营商使用,而企业会用OSPF...这也是有原因的。一般而言,运营商的生命周期比企业要久,其设备的更新换代周期也更长,更重要的是,运营商的竞争压力比企业要小很多,所以说运营商往往选用稳妥的方案,不求变而求稳,既然上世纪90年代已经接受了IS-IS,那么换成OSPF并不会显得有所收益。就这样,IS-IS至今为止依然是运营商的首选。
不要说什么IS-IS比OSPF灵活可以无缝承载IPv6,地址消耗比IP要小,最小生成树计算代价要比OSPF高等等,基本都是为技术而技术,很多技术不考虑历史因素就完全想不通。类似的例子还有Intel和AMD的x86处理器架构之间的PK,很明显很多人都能看出AMD的架构更加先进,但最后赢的还是Intel,原因何在,只因为人们最初选择了Intel。还有以太网的成功,也不是技术上有多么牛逼,而是恰好可以满足需求,又恰好便宜到足以推动整个产业的扩张。
后记:
这个话题是一个比较古老的话题,感兴趣的人相信不会太多,中文社区论坛以及各个博客站点,知乎,微博上几乎没有人讨论这种话题,但相反在国外却有很多人关注。国内的圈子似乎只对Howto感兴趣,对Whyto丝毫无感...我常说,Howto是给学习中的人看的,而Whyto是帮人突破瓶颈的,是这样吗?