IP协议与网络层

qc1iu published this page · Last modified:

我们每天都在使用网络进行通信,只要知道对方的ip我们就能够与其进行通信。并且,从技术上讲,我们可以与全世界任意一台电脑相互通信。但是,事实上我们并没有和目标机器之间有直接的物理线路,只是被一些设备间接的连接了起来。假设现在没有ip,设想一个简单的场景:实验室中的两台主机如何相互通信?一种最简单的方法就是将两台电脑直接连接。此外,我们还需要一种方法可以定位被物理线路连接的各个主机,这个与电话号码类似。因此在一个实验室中构建一个小网络需要两个条件:

  1. 物理上连接
  2. 一种合理的id编码方式

组建一个类似这样规模的小型网络,其实就是链路层的组网问题。在讨论网络层之前,假设其下的层都已经存在并能正常服务。为了让网络层更清楚,这里需要先讨论一下链路层的组网问题。链路层组网?

网络跟网络层没关系

满足上面的两个条件,实际上就已经可以自己组建网络了,不过除此之外,还需要约定一下这个网络中的一些细节。比如传输速率问题,信道是否可以共用,共用的话冲突如何解决等等。如果能自己想一套解决方案搞定这些问题,那这个小网络就可以工作了。现在的链路层已经有了不少这种问题的解决方案:以太网,无线网等等,每个都是解决这些问题的方案。

为了能准确的找到通信目标,id必须满足唯一性,就跟不能有两个一样的手机号一样。在链路层MAC地址已经满足全球唯一性(实际上MAC可以重复,不过不影响)。所以没有ip地址也可以组建网络,各个主机之间可以相互通信。But。

规模与异构

我们的目的不是自嗨。如果仅仅是为了个组建一个供组织内自己使用的网络,链路层足矣。而网络的最终目的是互联世界上所有的主机,让任意主机之间可以相互通信(虽然有些特例也不能通信,比如政策原因,NAT等)。也就是说,链路层的方案出现了问题。在之前的网络上,各个小网络之间的属性不同。这里的属性包括但不限于传输速度,专递方式(报文或虚电路),链路帧格式等等。当出现这种问题的时候,若要连接两个不同的网络,一个简单的方法就是在两个网络之间建立一个中间设备,该设备即知晓网络A规则,又知道网络B的规则。当网络A有主机向网络B通信时,所有的消息都发到这个中间设备。多个网络同理。

另外一个问题是,当A向B发送数据的时候,如果A和B直接连接,那么A可以直接向B发送。但一种更合理的做法是A先将数据发送到一个中转站,中转站负责发送到B。毕竟网络中所有主机相互连接不靠谱,但是所有的主机都可以连接到这个中转站上。这个中转站实际上就是交换机。当网络内主机的数量非常巨大的时候,将全球所有的主机连接到一个中心服务器上也不现实,在使用MAC地址这种没有任何区域信息的地址时,即使分层的组建网络,最上层的转发服务器还是要知道全球所有主机的MAC地址才可以转发。

we can try to solve the problem by adding a layer of indirection and building a common layer on top of the different networks.

IP协议就是这样的一个中间层。IP协议提供了一种新的id编码方式,并且规定了针对这种新编码方式的一系列转发规则。可以看到,链路层之所以不能解决规模问题,一个原因就是MAC地址是平坦的,不带有任何层次信息。所谓的层次信息可以参考手机号码,xxx-xxxx-xxxx。前3位可以识别出运营商,中间4位可以识别出地域,最后4位标识身份。IP协议中定义的ip地址通过将地址分为网络号与主机号两部分,使得地址便于转发。

当然IP协议不是唯一一个解决方案,但是全球的网络互联必须让所有人使用一种统一的方式,因此IP协议因为简单易用而快速普及, IPX, SNA, and AppleTalk等协议已经被人遗忘了。当然,如果需要组建一个大型局域网,完全可以用他们来代替IP协议(中国和朝鲜可能会)。

总结

在OSI的分层网络模型中,网络层负责解决如何高效的连接各个网络的问题。由于历史原因,现在的网络层一般只使用一种协议,即IP协议。IP协议使用分层的地址形式,使得转发变得高效,也使全球主机互联变为现实(仅使用链路层协议连接全球主机理论上可能)。在IP协议将地址分层之后,因为地址分配的不合理,出现了地址空间浪费的问题。为了高效的利用地址空间,引入了子网的概念。为了减少路由表,提出了CIDR。为了真正的解决ip地址不够用的问题,除了IPv6,还提出了一种短平快的NAT技术,虽然NAT有诸多的问题,但是此时此刻的我(或许你)也还在用。当然,这些问题在RFC中都有描述,既不是本文的重点也不是非重点,提一下,按需自行查看。