计算机网络之网络层

数据链路层上形成的局域网,在网络层中,通过 IP 协议相互连接,最终形成了全球的 Internet 。

网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。网络层不提供服务质量的承诺。

网际协议 IP

与 IP 协议配套使用的还有四个协议:

  • 地址解析协议 ARP(Address Resolution Protocol)
  • 逆地址解析协议 RARP(Reverse Address Resolution Protocol)
  • 网际控制报文协议 ICMP(Internet Control Message Protocol)
  • 网际组管理协议 IGMP(Internet Group Management Protocol)

IP 使用 ARP 和 RARP 协议,ICMP 和 IGMP 使用 IP 协议。

数据报格式

IP 数据报格式

  • 版本:占 4 位,指定 IP 协议的版本。可以分成 IPv4 和 IPv6 两种版本。
  • 首部长度:占 4 位,因此最大值为 15。值为 1 表示的是 1 个 32 位字的长度,也就是 4 字节。如果可选部分的长度不是 4 字节的整数倍,就用尾部的填充部分来填充。
  • 区分服务:占 8 位,用来获得更好的服务,一般情况下不使用这个字段。
  • 总长度:首部加数据的长度,总长度字段为 16 位,因此数据报的最大长度为 65535 字节。
  • 标识:相同的标识字段的值使分片后的各数据报片最后能够正确地重装为原来的数据报。
  • 标志:
    1. MF = 1 代表后面还有分片的数据报
    2. DF = 1 代表不能分片
  • 片偏移:较长的分组在分片后,某片在原分组中的相对位置。以 8 个字节伪偏移单位。

IP 地址编码

源地址和目的地址都是 IP 地址。通常把 IPv4 的地址分成 4 个十进制数字,每个数的范围是 0~255 。IP 地址可以用来区分局域网还是主机。

IP class From To Subnet Mask
A 1.0.0.0 126.255.255.255 255.0.0.0
B 128.0.0.0 191.255.255.255 255.255.0.0
C 192.0.0.0 223.255.255.255 255.255.255.0

IP 地址分成两个部分,前一部分代表网络,后一部分代表主机。如何判断是不是同一个子网络还需要子网掩码 (Subnet Mask) 。将两个 IP 分别和子网掩码进行 AND 运算,如果结果一样那么就是在同一个子网络中。A、B 和 C 类地址的默认子网掩码都是已经规定好了的。

网卡和路由

之前在 计算机概观 中,我们知道一个路由具有多个网卡,每个网卡接入到不同的网络之中。其实 IP 地址识别的就是网卡 ( NIC, Network Interface Card ) 。网卡收到信息后,然后把从网络上收到的信息传递给计算机。

分组转发

路由表必须包含一下三项:目的网络地址、子网掩码和下一跳地址。

Destination Gateway Genmask Iface
199.165.145.0 0.0.0.0 255.255.255.0 eth0
0.0.0.0 199.165.145.17 0.0.0.0 eth0

假设发出地的 IP 是 199.165.145.17 ,目的地的 IP 是 199.165.146.21 。第一行:如果目的地 IP 和 子网掩码 AND 运算后的结果是 199.165.145.0 ,那么就是同一个自网络,那么直接在 etho0 网卡上传送即可。显然不符合第一行。第二行:不符合第一行规则的 IP 数据报,都发往 199.165.145.17

然后发出地的 IP 就来到中间的路由了,该路由也有一个路由表。

Destination Gateway Genmask Iface
199.165.145.0 0.0.0.0 255.255.255.0 eth0
199.165.146.0 0.0.0.0 255.255.255.0 eth1
0.0.0.0 199.165.146.8 0.0.0.0 eth1

发出地的 IP 数据报符合第二条规则,所以把 IP 放入到新的帧中,帧的头部写上 199.165.146.21 的 MAC 地址,然后就可以发送到目的地了。

整个过程中,IP 数据不断被主机和路由器装入帧中被拆开,从网络层的角度来看, IP 数据报经过一个一个路由器到达了目的地。

ARP 协议

从上面最后一步来看,到达了一个子网络中,知道了 IP 地址,就可以知道 MAC 地址了,所以需要知道局域网内 IP 地址和 MAC 地址的对应关系,这就是 ARP 协议。ARP 协议也是发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的 IP 地址,在对方的 MAC 地址这一栏,填的是 FF:FF:FF:FF:FF:FF ,表示这是一个”广播”地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出 IP 地址,与自身的 IP 地址进行比较。如果两者相同,都做出回复,向对方报告自己的 MAC 地址,否则就丢弃这个包。由于发送 ARP 请求的主机采取的是广播形式,并附带有自己的 IP 地址和 MAC 地址,其他的主机和路由会同时检查自己的 ARP cache,如果不符合,则更新自己的 ARP cache 。

ICMP 协议

ICMP(Internet Control Message Protocol) 是介于网络层和传输层的协议。它的主要功能是传输网络诊断信息,作为 IP 层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去,但是 ICMP 不属于高层协议。

ICMP 报文可以分成两种:

  1. 差错报告报文:如果 IP 包没有被传送到目的地,或者 IP 包发生错误,IP 协议本身不会做进一步的努力。但上游发送 IP 包的主机和接力的路由器并不知道下游发生了错误和故障,它们可能继续发送 IP 包。通过 ICMP 包,下游的路由器和主机可以将错误信息汇报给上游,从而让上游的路由器和主机进行调整。
  2. 询问报文:某台计算机询问路径上的每个路由器都是谁,然后各个路由器同样用 ICMP 包回答。

ICMP 差错报告报文

ICMP 差错报告报文共有五种:

  1. 终点不可达
  2. 源点抑制
  3. 时间超过
  4. 参数问题
  5. 改变路由(重定向)

ICMP 询问报文

ICMP 询问报文共有两种:

  1. 回送请求和回答
  2. 时间戳请求和回答

ICMP 应用举例

ping

1
2
3
4
5
6
7
8
9
➜  ~ ping www.ouyangsong.com -c 3
PING nervous-nobel-747257.netlify.com (54.250.174.92): 56 data bytes
64 bytes from 54.250.174.92: icmp_seq=0 ttl=40 time=177.116 ms
64 bytes from 54.250.174.92: icmp_seq=1 ttl=40 time=175.853 ms
64 bytes from 54.250.174.92: icmp_seq=2 ttl=40 time=145.160 ms

--- nervous-nobel-747257.netlify.com ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 145.160/166.043/177.116/14.776 ms

如果服务器正常工作并且相应这个 ICMP 回送请求报文,那么它就会发回 ICMP 回送回答报文。

traceroute

1
2
3
4
5
6
➜  ~ traceroute www.bupt.edu.cn
traceroute to www.bupt.edu.cn (10.3.9.254), 64 hops max, 52 byte packets
1 * * *
2 10.0.12.1 (10.0.12.1) 5.180 ms 2.307 ms 3.452 ms
3 10.0.4.34 (10.0.4.34) 1.982 ms 5.893 ms 3.984 ms
4 10.3.9.254 (10.3.9.254) 2.622 ms 2.443 ms 9.986 ms

Traceroute 从源主机向目的主机发送一连串的 IP 数据报,数据报中分装的是无法交付的 UDP 用户数据报。

路由选择协议

互联网使用的路由选择协议都是自适应的,能随着网络通信量和拓扑结构的变化而自适应地进行调整。互联网可以划分为许多较小的自治系统 AS,一个 AS 可以使用一种和别的 AS 不同的路由选择协议。可以把路由选择协议划分为两大类:

  • 内部网关协议 IGP(Interior Gateway Protocol):在 AS 内部使用,如 RIP 和 OSPF。
  • 外部网关协议 EGP(External Gateway Protocol):在 AS 之间使用,如 BGP。

内部网关协议 RIP

RIP 是一种分布式的基于距离向量的路由选择协议。距离是“跳数“,直接相连的路由器跳数为 1,跳数最多为 15,超过 15 表示不可达。

RIP 按固定的时间间隔仅和相邻路由器交换自己的路由表,经过若干次交换之后,所有路由器最终会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器地址。

距离向量算法:

  1. 对地址为 X 的相邻路由器发来的 RIP 报文,先修改报文中的所有项目,把下一跳字段中的地址改为 X,并把所有的距离字段加 1;
  2. 对修改后的 RIP 报文中的每一个项目,进行以下步骤:
    • 若原来的路由表中没有目的网络 N,则把该项目添加到路由表中;
    • 否则:若下一跳路由器地址是 X,则把收到的项目替换原来路由表中的项目;否则:若收到的项目中的距离 d 小于路由表中的距离,则进行更新;否则什么也不做。
  3. 若 3 分钟还没有收到相邻路由器的更新路由表,则把该相邻路由器标为不可达,即把距离置为 16。

RIP 协议实现简单,开销小,但是 RIP 能使用的最大距离为 15,限制了网络的规模。并且当网络出现故障时,要经过比较长的时间才能将此消息传送到所有路由器。

其实这个思想和 Bellman-Ford 算法很类似,知道 BF 算法很容易看懂这个。

外部网关协议 BGP

AS 之间的路由选择很困难,主要是互联网规模很大。并且各个 AS 内部使用不同的路由选择协议,就无法准确定义路径的度量。BGP的基本工作过程与RIP类似,但在考虑距离的同时,也权衡比如政策、连接性能等其他因素,比如有些 AS 不愿意让其它 AS 经过,再决定交通的走向。

每个 AS 都必须配置 BGP 发言人,通过在两个相邻 BGP 发言人之间建立 TCP 连接来交换路由信息。

相关文章