# 互联层

概念:主要任务是通过路由算法,为分组通过通信子网选择最适当的路径。网络层要实现路由选择、拥堵控制与网络互联等功能。

相关协议:

  1. 网络互联(Internet Protocol,IP)协议
  2. 地址解析(Address Resolution Protocol,ARP)协议
  3. 逆向地址解析协议(Reverse Address Resolation Protocol,RARP)协议
  4. 因特网控制报文协议(Internet Control Message Protocol,ICMP)协议

# 理解

问题: 在下图中,有五个路由器通过 PPP 协议 组成一个广域网,并且 北京路由器广东路由器 各有一个不相同的以太网。在这两个以太网中,主机 A 如何发送消息给主机 B?

联系图

回答: 可以利用 数据链路层 中的 以太网协议。在以太网帧的 目标物理地址源物理地址 填上 4e:0f:21:67:18:8068:00:27:77:34:d2。这样不就行了吗?

补充: 协议只能在自身范围内起作用,以太网帧是无法突破以太网发送到别的地方的。在主机 A 的以太网和主机 B 的以太网之间的路径,以太网帧是无法传输的。PPP 和 以太网 是两种不同的协议,谁都无法解释对方。

回答: 那就利用以太网协议,把 A 主机的信息发送给广东路由器利用 PPP 协议,再发送给上海路由器,接着发给北京路由器,最后北京路由器利用以太网协议发给 B 主机。

解读: 这样看起来可行,但这是开启了上帝视角 👼。为什么要从广东路由器发送到上海路由器,而不送发给云南路由器呢?

联想: 想象你在一个非常大、各个 房间走廊 相连的 大迷宫。你的目标是到达 北京 房间,当前你在起始房间 广东,左右各有一扇门,而且门上没有标识是通往哪个房间,你该如何选择?如果你选择走左侧的房间,你会穿过一条很长的走廊来到另一个房间,这个房间标着 云南。而且 云南 房间,除了刚刚进来的门,就没其他的门了,这肯定就走错了。你只能返回 广东 房间。尝试走右侧的门,又是穿过很长的走廊,来到了下一个房间,这个房间名是 上海上海 房间,有左侧、前方、回去的三扇门。这次你选择了前面的门,这扇门后也有一条走廊,这条走廊有特别特别多人排队,他们也是为了进入下一个房间。你想着也回不去了,就排下去了,等到达下一个房间时,已经过了三天三夜。不过很庆幸,你发现这个房间就是目标房间 北京。其实 上海 房间的左侧的门,根本没有人排队,去到 四川 房间只用一个小时而已。四川 房间到 北京 房间只需要半个小时,可是这些你完全不知道,因为你不知道这些门通往何处。如果你是设计者,你会怎么做?是不是觉得在每一个房间里挂一张指引表(路由控制表)就好了?

补充: 这里就需要引入了一个 IP 地址的概念,IP 地址 是由授权单位分配给接入互联网中的所有计算机的地址号码

  • IP 地址 用 32 个二进制位表示,人们为了方便记忆就用 把 IP 地址 的每字节进行隔开。例如 11000000.10101000.00000001.00000001,十进制表示 192.168.1.1。(其实这样还是难以记忆😵,所有就有了域名)
  • 其中 32 个二进制又可以分为 网络号主机号网络号 可以理解成 哪栋楼,比如 阳光大楼。而 主机号 可以理解成 哪间房,比如:201
  • 子网掩码 不能单独存在,需要和 IP 地址 一同出现。用来指明 IP 地址 的哪部分是 网络号,哪部分是的 主机号。比如:十进制的 IP 地址 196.168.1.111, 二进制的子网掩码 11111111.11111111.11111111.00000000,代表 IP 地址 的前 24 位(196.168.1)是 网络号,后面 8 位(111)是 主机号。又可以写成 192.168.1.111/24

TIP

根据 网络号主机号,可以把 IP 地址 分成 A、B、C、D、E 五类。

  • A 类网络的 IP 地址 范围:1.0.0.1127.255.255.254。允许有 126 个网络,每个网络大约允许 1670 万 台主机,通常分配给拥有大量主机的网络,例如主干网。
  • B 类网络的 IP 地址 范围:128.1.0.1191.255.255.254。允许有 16384 个网络,每个网络允许 65533 台主机,适用于节点比较多的网络。
  • C 类网络的 IP 地址 范围:192.0.1.1223.255.255.254。大约允许 209 万 个网络,每个网络允许 254 台主机。适用于小规模的局域网络。
  • D 类网络:用于多址投递系统。(用得比较少,略过)
  • E 类网络:保留未用。(用得比较少,略过)

WARNING

IP 地址可以分为 公网 IP 地址内网 IP 地址内网 IP 地址 只能在内网中访问,是无法和其他网络互连的,需要 NAT 协议将数据包中的 内网 IP 地址 替换为 公网 IP 地址。目前 IPv4 的地址枯竭,正在向 IPv6渡过。而 NAT 协议是解决 IPv4 地址枯竭的手段之一,可以自行了解其细节。

私网地址:

  • A 类地址:10.0.0.010.255.255.255
  • B 类地址:172.16.0.0172.31.255.255
  • C 类地址:192.168.0.0192.168.255.255

问题: 加入了 IP 地址路由控制表,主机 A 如何发送消息给主机 B?

联系图-IP

回答:

  1. 先将主机 A 给主机 B 的数据包发往广东路由器。
  2. 因为主机 B 的地址是 192.168.20.2,它的网络号是 192.168.20(192.168.20.0/24)。根据广东路由的控制表,应该发往接口 2(表中第四条)。
  3. 同理,根据上海路由器的控制表,应该发往接口 3(表中第四条)。
  4. 同理,根据北京路由器的控制表,将数据包通过接口 3 发送给主机 B。

补充: 其实上述回答只描述了 路由转发,其实还有一些细节没有回答到。比如以下问题:

  1. 主机 A 是为什么发送到广东路由器,而不是隔壁的主机呢?(不要开启上帝视角👼)
  2. 两个 IP 地址,主机 A 就能发送给广东路由器吗?(以太网帧不是只能通过物理地址发送吗?)
  3. 在数据链路层没有 IP 地址 的概念,又如何携带 IP 地址 信息?用什么协议发送呢?
  4. 数据包在北京路由器的时候,通过接口 3 传输数据。为什么是发送到主机 B,而不是隔壁的主机?

以上对应问题的解决方案:

  1. 默认网关
  2. 地址解析(Address Resolution Protocol,ARP)协议
  3. 网络互联(Internet Protocol,IP)协议
  4. 地址解析(Address Resolution Protocol,ARP)协议

TIP

请记住这几个问题和解决方案,接下来会详细描述。

# 默认网关

默认网关 又可称为 缺省网关缺省路由器默认网关子网外网 连接的设备,通常是一个 路由器。当一台计算机发送信息时,根据发送信息的 目标 IP 地址子网掩码 来判定目标主机是否在本地子网中,如果目标主机在本地子网中,则直接发送即可。如果目标不在本地子网中则将该信息送到 缺省网关/路由器,由路由器将其转发到其他网络中,进一步寻找目标主机。

对于问题 1: 主机 A 是为什么发送到广东路由器,而不是隔壁的主机呢?(不要开启上帝视角👼)

回答: 主机 A 192.168.9.2 要发数据给主机 B 192.168.20.2。但是主机 A 发现它们两个的 网络号 不一样,不是在同一个网络。一个是 192.168.9.0/24,另一个是 192.168.20.0/24。所以会发送到默认网关 192.168.9.1,让它(默认网关/广东路由器)发送到外网。

TIP

Windows 用户可以在终端输入 ipconfig 来查看到默认网关。

# 地址解析协议

作用:IP 地址 转换为 物理地址

对于问题 2: 两个 IP 地址,主机 A 就能发送给广东路由器吗?(以太网帧不是只能通过物理地址发送吗?)

回答: 根据问题 1 的答案,我们知道将数据包发往默认网关 192.168.9.1。但是主机 A 只能通过 以太网帧 把数据发送到 广东路由器 中。目前已知:主机 A 的 IP 地址主机 A 的物理地址默认网关(广东路由器)。最重要的是缺少了默认网关的 物理地址,我们就可以根据 ARP 协议 ,将已知条件转换为默认网关的物理地址,最后发送以太网帧即可。转换过程如下:

ARP协议流程

解释:

  1. 因为不知道默认网关的物理地址,所以主机 A 发送 广播,让以太网的所有主机都会接受以太网帧。
  2. 所有主机收到以太网帧后,看到 类型字段0x0806(ARP 协议),便按照该协议,判断自己是否符合目标 IP 地址 192.168.9.1,如果符合则带上自己的物理地址回答主机 A。如果不符合,则忽略该应答。广东路由器 发现自己符合,便带上自己的物理地址 08:00:27:71:9e:95 回应主机 A。
  3. 主机 A 收到广东路由器发的以太网帧,便解析里面的数据,拿到广东路由器的物理地址。
  4. 有了目标物理地址自身物理地址 后,主机 A 把真正要发往主机 B 的数据 包装在以太网帧发送给了广东路由器。

该过程产生了 3 个数据包,分别为 ARP 的一问一答真正数据包。以后再要发出外网,就不需要前面两个步(ARP 一问一答)做基础了。因为主机 A 会自我学习,把广东路由器的物理地址存储起来。

对于问题 4,同理。

# 格式

ARP帧格式

  • 硬件类型(2 字节):指明了发送方想知道的硬件接口类型。例如:以太网的类型为 1。
  • 协议类型(2 字节):表示要映射的协议地址类型。它的值为 0x0800,表示 IP 地址。
  • 硬件地址长度(1 字节):定义物理地址的长度,以字节为单位。例如:对于以太网的值为 6。
  • 协议长度(1 字节):定义逻辑地址的长度,以字节为单位。例如:对于 IPv4 协议的值为 4。
  • 操作类型(2 字节):用来定义报文的类型。已定义的分组类型有两种:ARP 请求(1),ARP 响应(2)。
  • 源硬件地址——发送方 MAC 地址(可变):可变长度字段,用来定义发送方的物理地址。例如:对于以太网这个字段的长度是 6 字节。
  • 源逻辑地址——发送方 IP 地址(可变):变长度字段,用来定义发送方的逻辑地址。例如:对于 IP 协议这个字段的长度是 4 字节。
  • 目标硬件地址——目标 MAC 地址(可变):可变长度字段,用来定义目标的物理地址。例如:对以太网来说这个字段位 6 字节。对于 ARP 请求报文,这个字段为全 0,因为发送方并不知道目标的硬件地址。
  • 目标逻辑地址——目标 IP 地址(可变):可变长度字段,用来定义目标的逻辑地址。例如:对于 IPv4 协议这个字段的长度为 4 个字节。

TIP

RARP 的作用与 ARP 的作用相反,是将物理地址转换为 IP 地址。

# 网络互联协议

设计 IP 的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP 只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务。

# 理解

流程图

补充: 传递过程都是先将 数据 一层一层的 包装,然后通过物理层进行 传输。到达下一个节点后,便将数据包一层一层 剥离解析,得到很多参数条件。可以通过这些参数条件来决定 传输 方向,如何 重新包装。所以从发送端到接收端的数据包不是一成不变的。

对于问题 3: 在数据链路层没有 IP 地址 的概念,又如何携带 IP 地址 信息?用什么协议发送呢?

IP协议

回答: 采用本次介绍的 IP 协议,在真正的数据外面包多一层 IP 信息,又称 IP 帧。以太网帧又将 IP 帧 当作一个整体数据,填到数据字段中。广东路由器收到以太网帧后,一层一层剥离外壳,并解读出目标 IP 地址等参数出来。根据这些参数和 控制表 判断得出:通过 接口 2 发送。 又将数据 重新包装PPP 帧,发送出去。如此反复,最后到达 北京路由器,又根据 ARP 协议 得出物理地址,以以太网帧将真正的数据包发往最终目的——主机 B。如上图:

WARNING

部分字段不详细说明,可以结合下面的 IP 帧格式理解。

# 格式

IP帧格式

  • 版本(4bit): 表示 IP 协议的版本。通信双方使用的 IP 协议版本必须一致。目前广泛使用的 IP 协议版本号为 4,即 IPv4。
  • 首部长度(4bit): 表示 IP 帧的头长度,单位是 4 字节。如果头长度不为 4 字节的整数倍,则必须利用填充字段加以填充。当首部长度为 1111 时(即十进制的 15),头长度就达到 60 字节。
  • 区分服务(8bit): 也被称为服务类型,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998 年 IETF 把这个字段改名为区分服务(Differentiated Services,DS)。只有在使用区分服务时,这个字段才起作用。例如:运营商可以根据这个字段将缴费高的用户的数据包优先处理。
  • 总长度(16bit): 首部和数据之和,单位为字节。数据报的最大长度为 2^16-1=65535 字节。
  • 标识(16bit): 用来标识数据报。IP 协议在存储器中维持一个计数器。每产生一个数据报,计数器就加 1,并将此值赋给标识字段。当数据报的长度超过网络的 MTU,而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。具有相同的标识字段值的分片报文会被重组成原来的数据报。
  • 标志(3bit): 第一 bit 位未使用,其值为 0。第二 bit 位称为 DF(不分片),表示是否允许分片。取值为 0 时,表示允许分片;取值为 1 时,表示不允许分片。第三 bit 位称为 MF(更多分片),表示是否还有分片正在传输,设置为 0 时,表示没有更多分片需要发送,或数据报没有分片。
  • 片偏移(13bit): 当报文被分片后,该字段标记该分片在原报文中的相对位置。片偏移以 8 个字节为偏移单位。所以,除了最后一个分片,其他分片的偏移值都是 8 字节(64 bit)的整数倍。
  • 生存时间(8bit): 又称 TTL,表示数据报在网络中的寿命。该字段由发出数据报的源主机设置。其目的是防止无法交付的数据报无限制地在网络中传输,从而消耗网络资源。路由器在转发数据报之前,先把 TTL 值减 1。若 TTL 值减少到 0,则丢弃这个数据报,不再转发。防止路由器循环发送,永远无法到达目标地。
  • 协议(8bit): 表示该数据报文所携带的数据所使用的协议类型。该字段可以方便目的主机的 IP 层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。例如,TCP 的协议号为 6,UDP 的协议号为 17,ICMP 的协议号为 1。
  • 首部检验和(16bit): 用于校验数据报的首部。数据报每经过一个路由器,首部的字段都可能发生变化(如 TTL),所以需要重新校验。而数据部分不发生变化,所以不用重新生成校验值。
  • 源地址(32bit): 表示数据报的源 IP 地址。
  • 目的地址(32bit): 表示数据报的目的 IP 地址。该字段用于校验发送是否正确。
  • 可选字段(可变): 该字段用于一些可选的报头设置,主要用于测试、调试和安全的目的。这些选项包括严格源路由(数据报必须经过指定的路由)、网际时间戳(经过每个路由器时的时间戳记录)和安全限制。
  • 填充(可变): 由于可选字段中的长度不是固定的,使用若干个 0 填充该字段,可以保证整个报头的长度是 32 位的整数倍。
  • 数据部分(可变): 表示传输层的数据,如保存 TCP、UDP、ICMP 或 IGMP 的数据。