网络层的主要作用是实现终端节点之间的通信,这种终端节点之间的通信也称之为"点对点通信"。之前提到的数据链路层的主要作用是使得网络数据可以在同一类型的链路中进行传播,而一旦需要跨越多个数据链路就要使用网络层了。

一、网络层和链路层的分工

链路层实现了两个处于同一链路设备之间的通信功能。即通过MAC地址构造以太网帧,该数据帧通过网线、交换机最后到达指定的设备网卡。而网络层的设计目标在于实现两个位于不同链路设备之间的通信。

为什么要设计这两个层次呢?它们的分工又是怎样的?

我们可以用“快递运输”为例子说明这个问题。

你在快递驿站向你的朋友寄出一个包裹,快递公司会给你一个快递单子,上面只会记录这个包裹的起点到终点,这可以类比为网络层的职责,即两个节点逻辑上的连接。

而包裹在实际运输中,可能会经手不同的快递员,到达不同的中转站/分拣中心,但是每个地方都不会关心这个包裹要去的地方自己是否知道在哪里,他们只会关心自己接下来要发往哪个相邻的中转站,进行相邻中转站的运输可以类比为链路层的职责,即提供相邻节点的数据传输。

在这个过程中,包裹单子上的起点和终点一直没变(就像网络层的起始地址和目标地址在整个传输过程中始终保持不变,定义了通信的“逻辑两端”)。而在包裹从当前站点运往下一个站点的每一段实际运输中,当前站点的地址和目标站点的地址(即相邻两个中转站的地址)会随着每一跳而改变——因为不同站点之间使用的运输方式可能不同(例如有的用货车,有的用飞机),对应的“交接地址”或“下一站标识”自然也不同。这就像链路层在每一段链路上使用不同的MAC地址(或链路层地址)来完成相邻节点间的帧传输,这些地址只在当前链路有效。

还是没懂?下面让我们更详细的讲一下这个过程:

  1. 你的快递单上写着 四川省成都市xxx区xxx街道xxx小区 发往 北京市朝阳区xxx区xxx街道xxx小区
  2. 快递员拿到包裹,发现目的地在北京市,他知道自己没法直接送过去,但是他可以使用汽车送去成都的分拣中心。
  3. 成都分拣中心看到这个包裹,发现目的地在北京市,那他使用飞机将其发往北京市朝阳区的分拣中心。
  4. 北京市朝阳区的分拣中心看到这个包裹,发现在本区的xxx街道xxx小区,那他只需要使用汽车将这个包裹送到小区附近的驿站。
  5. 驿站的工作人员可以直接联系到收件人,所以他可以直接将该包裹送到收件人手中。

可以看到,包裹在运输过程中,即使中途经手过的每个快递员/站点并不清楚目的地到底在哪里,他们也可以将其发往自己能找到的地方。在这个过程中,如果只有快递单(网络层)没有每个站点之间的运输(链路层),那么这个快递从一开始就根本发不出去;如果没有快递单,即便有火车/汽车/飞机这样的运输收到,每个站点也完全不知道这个包裹接下来可以发往哪里,例如成都分拣中心不知道大方向该发往北京市还是天津市。所以网络层和链路层是缺一不可的。

当然,网络层也只是提供尽力而为的传输,根据我们前面的例子,如果我们不小心填错了目标地址,又或是快递系统录入时目标地址搞错了,甚至运输过程中快递件丢了,光依靠前面我们说的这种运输方式(网络层的职责和链路层的传输)似乎没办法保证收件人能成功拿到包裹。所以网络层并不能保证数据能够完整的正确的传输给对方,这些问题将会由传输层来解决。

二、IP地址的基础知识

1、IP地址和子网掩码

链路层使用MAC地址进行寻址,那么网络层的地址是什么呢?

网络层使用IP地址来描述一个网络中设备。IP地址是一个32位的正整数,为了方便人类记忆和书写,通常使用点分十进制进行标识。例如192.168.1.100就是一个IP地址

一个IP地址由两个部分组成,分为网络地址和主机地址,网络地址标识了一个设备所处的网络,主机地址则标识了一个设备在某个网络中的编号。那如何确定一个IP地址中哪些部分是网络地址,哪些部分是主机地址呢?这需要依靠子网掩码来进行区分。子网掩码的格式和IP地址的格式相同,它对应IP地址网络标识的部分全部为“1”,表示主机地址的部分全部为“0”。当然为1的部分必须是连续的。举个例子:

IP:192.168.100.12
子网掩码:255.255.255.0 
网络地址为:192.168.100.0
即某一网络192.168.100.0中存在一台地址为192.168.100.12的设备

IP:192.168.100.12
子网掩码:255.255.0.0 
网络地址为:192.168.0.0
即某一网络192.168.0.0中存在一台地址为192.168.100.12的设备

可以看到,即使IP地址相同,子网掩码相同,其实也有可能表示的为两台不同的设备。255.255.255.0这个掩码对应的网络中,可以容纳256个ip,允许可以分配254个设备。而255.255.0.0可以容纳65536个ip,允许分配65534个设备。

一般情况下,还可以在IP地址后面 使用 / 加上一个数字来表示网络地址的位数。

比如

192.168.2.100
子网掩码为255.255.255.0
可以直接写为 192.168.2.100/24

比如

192.168.2.100
子网掩码为255.255.0.0
可以直接写为 192.168.2.100/16

2、特殊的IP地址

广播地址

在数据链路中,将以太网帧的目标地址设置为ff:ff:ff:ff:ff:ff代表在数据链路中发送广播数据包,那么在网络层如何表示广播呢?

主机地址为255的IP地址就是广播地址,例如网络192.168.0.0/16这个网络中,向发送广播包,只需向地址192.168.0.255发送数据即可。

广播分为两种:

  • 本地广播:向当前网络进行广播,例如主机192.168.1.24/24向192.168.1.255/24发送数据,192.168.1.0/24这个网络的主机都可以收到整个消息
  • 直接广播:向其它网络进行广播,例如主机192.168.1.24/24向192.168.2.255/24发送数据,位于192.168.2.0/24这个网络的主机都可以收到整个消息。不过需要注意的是,这种方式很少见,一般路由器都默认会拦截这个数据包。

组播地址

希望进行一对多的通信,除了使用广播外,还可以使用组播的方式进行,即数据包只能被特定分组的成员接收到。

组播地址为:224.0.0.0 – 239.255.255.255

其中:

  • 224.0.0.0 – 224.0.0.255 用于本地组播,只能在当前链路中进行
  • 224.0.1.0 – 238.255.255.255 可以在全网使用
  • 239.0.0.0 – 239.255.255.255 私有管理用

要使用组播地址进行通信,除了地址以外,还需要IGMP协议的辅助,我们在后面的文章中会介绍到。

3、全局地址和私有地址

起初,互联网中的每台设备(主机或路由器)都必须有一个确定的IP地址,因为如果多个设备使用同一个IP地址,那么将会出现通信混乱。然而,随着互联网的普及,如果一直按照现有的方法分配IP地址,IP地址迟早会消耗殆尽,所以定义了全局地址和私有地址。当设备在连接互联网时使用全局地址,在局域网通信时使用私有地址;全局地址和私有地址使用NAT技术进行转换。

其中私有地址的范围如下:

  • 范围:10.0.0.0 – 10.255.255.255

    掩码:255.0.0.0(/8)

  • 范围:172.16.0.0 – 172.31.255.255

    掩码:255.240.0.0(/12)

  • 范围:192.168.0.0 – 192.168.255.255

    掩码:255.255.0.0(/16)

那么实际的运用场景是怎么样的呢?以我们在家中使用手机连接WiFi上网为例。

  1. 首先家庭路由器会为手机分配一个IP,假设为192.168.1.123。根据互联网的规则,这个IP并不可以在互联网上使用,即任何一个位于互联网的报文不应该使用这个IP作为源IP或者目标IP。
  2. 当手机想要访问某个互联网上的IP地址时,该报文在经过路由器时,路由器会标记这个报文并将源IP修改为全局地址之后将报文发往目标IP。
  3. 当目标IP的设备回复的报文到达路由器时,路由器会将该报文的目标地址再次修改为手机的私有IP。

将私有IP地址和全局IP地址进行转换的操作叫做NAT转换。不过放在今天,一台处于家用局域网的设备所发送的报文到达互联网可能会被修改多次IP,即存在多层NAT。

可以使用

traceroute www.baidu.com 

查询当前设备访问百度首页时所历经的NAT转换次数。