计算机网络系列文章(三)网络层

632 阅读17分钟

计算机网络系列五篇文章传送门

  1. 概述篇
  2. 网络接口层
  3. 网络层(本文)
  4. 传输层
  5. 应用层

虚拟互联网络

实际的计算机网络是错综复杂的,如下图所示:

image.png

计算机A的数据先经过中型网络、大型网络、中型网络、小型网络,然后到达计算机B。除了上图的这条路径以外,还可以画出别的很多路径。通过这张网络拓扑可以知道,A的传输路径有很多条。其实这些网络路径,对于使用者,是不需要关心的,也就是说我们不关心网络是怎样连接的,也不关心数据包是怎么走的,这个是由网络层所解决的。网络层提出了一个非常重要的概念,虚拟互联网络

image.png

也就是说,上边提到的复杂的网络拓扑,其实我们不用关心。只需要把中间的部分看做虚拟的互联网络即可。 如上图,计算机A通过网络连接到一个虚拟的互联网络中,计算机B也连接到了这个虚拟的互联网络中。那么计算机A只需要将数据发送到虚拟的互联网络中,这个虚拟的互联网络就可以解决数据传输的问题,并且将其准确的传输到计算机B。这个就是虚拟互联网络的概念。

IP协议

IP协议有什么用?

  • IP协议使得复杂的实际网络变为一个虚拟互连的网络
  • IP协议使得网络层可以屏蔽底层细节而专注网络层的数据转发。
  • IP协议解决了在虚拟网络中数据报传输路径的问题

在数据链路层,MAC地址是每一个网络设备或网卡的身份证,只要拥有了这个MAC地址,就可以进行数据帧的传输了。MAC地址是48位,使用十六进制来表示。我们可以将MAC地址展开成二进制的格式。

在网络层,同样也有一个地址的概念,这个地址称之为IP地址。 IP地址总共有32位,一般用点分十进制表示。也可以展开成二进制的格式

IP地址和MAC地址有什么区别呢?

  • IP地址因网络环境变化而变化。
  • MAC地址永久不变。
  • IP地址长度为32位,常分成4个8位。
  • IP地址常使用点分十进制来表示(0255.0255.0255.0255)。
  • 最多可有2的32次方 = 4294961296个IP地址。

image.png

IP协议具体由什么内容?

在了解IP协议之前,先看一下IP协议所处的一个位置。在物理层,它传输的是0、1这样的比特流在数据链路层,传输的是数据帧,数据帧包括帧首部、帧尾部和“帧”数据,“帧”数据主要就是IP数据报 现在对IP数据报进行详细的剖析,它将会分成IP首部和IP数据报的数据两个部分。

image.png

下图展示了IP协议的完整内容:

image.png 其中需要注意的有:

  • 4位版本:指IP协议的版本(IPv4/IPv6)
  • 16位总长度:IP数据报的总长度(最大65536),表示的是IP数据报总长度(IP首部+IP数据)
  • 8位生存时间TTL:占8位,表明IP数据报文在网络中的寿命,每经过一个设备(不管是路由器还是计算机),TTL减一,当TTL=0时,网络设备必须丢弃该报文(它解决的就是,当网络报文找不到终点的时候,避免网络报文在网络中无限的传输,以消耗带宽)
  • 8位协议:表明IP数据报所携带的具体数据时什么协议(TCP/UDP)
  • 校验和:占16位,校验IP首部是否有出错(接收方接收到IP首部之后也会进行校验,如果有错,则直接丢弃)
  • 协议:占8位,表明IP数据所携带的具体数据是什么协议的(如TCP、UDP等,一些协议对应的值,可参考下图)

image.png

IP协议的转发流程

计算机A在给计算机B发送数据的时候,数据的路径,可能是通过中型网络、大型网络、中型网络、小型网络,然后到达计算机B。关于数据的转发过程,有一个概念叫:逐跳(hop-by-hop)。意思就是计算机A发送的报文是一跳一跳的来到计算机B的,网络 -> 路由器 -> 网络2 -> 路由器2 -> 网络3 -> 计算机B。

在前边介绍数据链路层的时候,有提到过一个MAC地址表。路由表工作在网络层,它的工作流程其实是和MAC地址表差不多的。 MAC地址表由两列组成,分别是MAC地址和硬件接口。路由表的重点部分也是由两列组成的,分别是目的IP地址和下一跳IP地址。计算机和路由器都拥有路由表。

image.png

如图,设备A发送数据到设备C,是怎么达到的? image.png

仅从网络层来看:

  1. A发出目的地址为C的IP数据报,查询本机路由表下一条为E
  2. A将数据发送给E
  3. E查询路由表发现下一跳为F,将数据报发送给F
  4. F查询路由表发现与目的地C直接连接,见数据报发送给C

结合网络层数据链路层综合来看:

  1. A发出目的地为C的IP数据报,查询路由表发现下一跳为E
  2. A将IP数据报交给数据链路层,并告知目的MAC地址是E
  3. 数据链路层填充源MAC地址A和目的MAC地址E
  4. 数据链路层通过物理层将数据发送给E
  5. E的数据链路层接收到数据帧,把帧数据交给网络层
  6. E查询路由表,发现下一跳为F
  7. E把数据报交给数据链路层,并告知目的MAC地址为F
  8. E的数据链路层封装数据帧并发送
  9. F的数据链路层接收到数据帧,把帧数据交给网络层
  10. F查询路由表,发现下一跳为C
  11. F把数据报交给数据链路层,并告知目的MAC地址为C
  12. F的数据链路层封装数据帧并发送

ARP协议和RARP协议

ARP(Address Resolution Protocol)即地址解析协议,通过查询ARP缓存表,能够将网络层32位IP地址转化为数据链路层48位MAC地址。

image.png

  • ARP缓存表是ARP协议和RARP协议运行的关键
  • ARP缓存表缓存了IP地址到硬件地址之间的映射关系
  • ARP缓存表中的记录并不是永久有效的,有一定的期限。
  • 在控制台使用arp –a命令查看ARP缓存表

ARP协议的报文信息是直接封装到数据链路层的数据帧中的, 可能这里会有一个疑问,既然ARP协议是直接封装在数据链路层的数据帧中的,那为什么ARP协议是属于网络层? 主要是因为ARP协议使用到了IP地址, 所以它属于网络层的内容。所以ARP协议是数据链路层和网络层配合使用的一个协议。

image.png

最上边为数据链路层的数据帧格式,中间是ARP协议的报文信息,PAD是填充的内容。

RARP(Reverse Address Resolution Protocol)即逆地址解析协议,与ARP协议相反,能够将数据链路层48位MAC地址转化为将网络层32位IP地址。

image.png

有了ARP和RARP协议,我们就能够理解上文“A将IP数据报交给数据链路层,并告知目的MAC地址是E”中,数据链路层是怎么知道目的MAC地址是E的了,就是查询ARP缓存表。

网络地址转换NAT技术

早期IP地址的不合理规划导致IP号浪费,因为IP地址不够用了,所以才使用到了网络地址转换NAT技术。在实际情况下,其实很多的公司(或家庭)只有一个外网的IP地址。那么,很多的内网设备是如何进行通信的?

对于公司,它可以在外部使用全球唯一的外网IP,但是在内部使用内网地址(家庭也是一样)。这样就可以解决,不同设备连接互联网的问题,虽然通过这种方法,每一个设备,都分配了一个IP地址,但是使用内网地址又会引发另一个问题:内网多个设备使用一个外网IP请求外网的服务,外部怎么知道具体是哪个设备在请求的? 用到了网络地址转化技术

  • 网络地址转化NAT(Network Address Translation)
  • NAT技术用于多个主机通过一个公有IP访问互联网的私有网络
  • NAT减缓了IP地址的消耗,但是增加了网络通信的复杂度

NAT技术具体是如何解决这个问题的?

假设有一个计算机和一个手机,通过路由器连接到外部网络,假设外部的IP地址是173.21.59.10。两个内部终端设备的IP地址分别为:192.168.2.10和192.168.2.11。

image.png

假设192.168.2.11:6666这个进程在使用网络,它发出的网络报文地址将会是:192.168.2.11:6666,但是这个地址在来到路由器之后,就会被替换成新的地址和端口号,新IP地址是173.21.59.10,假设新的端口为16666。通过路由器,刚才所发送的数据,会以新的地址和端口号发送到网络中。在目的计算机中,它识别的是新的IP地址和端口号,并不识别旧的IP地址和端口号,因为在路由器中进行了IP地址和端口的替换。所以外部其实是和173.21.59.10来进行通信的。

当目的计算机处理完数据之后,会将结果发送给173.21.59.10:16666,路由器接收到数据之后,又会进行一次地址和端口的转换,那么内部的设备也就获取到了请求的数据。

因此NAT技术其实就是将内网IP地址的网络请求,在本地路由器内部进行了一次IP地址和端口的转换,当接收到返回结果之后,再将IP地址和端口转换回来,发送给请求的设备。这个做映射的表,称为NA(P)T表。

image.png

网络地址转换NAT技术

  • 网际控制报文协议(Internet Control Message Protocol)
  • 该协议主要是用于辅助IP协议进行数据传输的
  • ICMP协议可以报告错误信息或者异常情况

ICMP的报文数据是通过封装在IP数据报中进行数据传输。ICMP的报文分为两个部分:ICMP报文首部和ICMP报文数据。

image.png

  • 「类型」:主要指的是ICMP报文的种类(主要有两大类,后边会进行说明)
  • 「代码」:主要是指,不同的ICMP报文种类具体有哪些错误
  • 「校验和」:主要是校验报文在整个传输中,是否存在错误

ICMP协议报文的两个种类

差错报告报文

image.png

  • 「网络不可达」:IP地址可以表示一个网络,当主机号全为0时就表示的是某一个网络,如果整个网络不可达,就会报告一个类型为3,具体代码为0的ICMP协议报文
  • 「主机不可达」:如果计算机A要和计算机B进行通信,而计算机B是关机的状态,就会出现主机不可达的情况
  • 「网络重定向」:传输给某一个网络的数据,可能不能走该网络了,需要进行重定向
  • 「主机重定向」:如果发送的报文,主机告知不能处理,请发送到另外一个主机

询问报文

image.png

  • 「回送请求或应答」:主要是验证网络是否通。假设计算机A要和计算机B进行通信,A会发送一个空的数据给B,如果B收到,就给一个回应
  • 「时间戳请求或应答」:当需要进行时间同步时,会用到这个

ICMP协议的应用

Ping应用

在前边的文章中有使用到ping命令来查看网络的响应时间和TTL。这部分主要是介绍ping的原理是什么 ping应用主要是使用ICMP的「询问报文」,它会发送「回送请求或应答」类型的报文。当使用ping命令的时候,它首先会组装一个IP协议的报文,然后在IP的数据报中组装ICMP的询问报文,然后通过数据链路层发送出去,这个就是ping应用的原理。

通常我们会使用ping命令来查看本地的网络是否通,或者网络质量是怎么样的。平时在家中,如何出现网络故障,我们也会使用ping命令来进行排查。

  • 第一步会先ping本地回环地址127.0.0.1(如果没有返回,说明协议栈有问题,这个时候可能需要重装系统,或重新安装协议栈)
  • 如果上一步正常返回,则ping网关地址(也就是路由器地址)。如果计算机是处于内网的话,一般就是ping 192.168.0.1或者ping 192.168.1.1。如果上一步ping网关也是通的,说明本机到路由器是通的,如果不通,说明网线或者wifi是有问题的
  • 如果ping网关是通的,则ping远端地址(比如百度)。如果不通,则说明在你家到ISP之间网络是故障的,这个时候就需要联系电信或移动或联通

Traceroute应用

Traceroute可以探测IP数据报在网络中走的路径, 在本文开头,有介绍到计算机是连接在虚拟互联网络中的,我们并不关心数据报在网络中经过了哪些路径。但是,如果需要对网络故障进行排查的话,Traceroute应用可以提供更高级的功能,使我们更了解网络是怎么样的。

Traceroute应用原理:在介绍IP首部时,首部里边有一个TTL,表明IP数据报文在网络中的寿命,每经过一个设备,TTL减1,当TTL为0时,网络设备必须丢弃该报文。

Traceroute应用巧妙的应用了「ICMP差错不可达报文」的作用,为了探测数据报走过的路径,它「首先会封装一个TTL为1的IP报文」。在上图中,计算机A发送了一个TTL为1的报文之后,到达中型网络之后就会发现TTL为0了,此时就会往源机器(也就是A)发出一个ICMP差错不可达报文。此时,计算机A会记录该中型网络的IP。此时Traceroute会再封装一个TTL为2的请求报文,当数据到达大型网络之后,TTL为0了。大型网络会丢弃该报文,并且向源机器发出一个ICMP差错不可达报文。此时计算机A又会记录大型网络的IP。「TTL会依次的增加,直到收到了正常的回应,表示说计算机A发送的报文,已经被B收到了」。此时,计算机A已经收到了所有的路径机器的信息,此时就可以输出数据报在网络中走过的路径了

因此,Traceroute应用巧妙的应用了ICMP差错不可达报文的作用,每次将TTL加1,直到到达目标机器,记录经过的每一个机器的IP,因此来获取路径。这就是Traceroute应用的原理。

看一波实际操作,在windows中可以使用「tracert+域名/IP」的命令来查看输出。Mac中有自带的工具可以使用(也可以使用traceroute命令):

DIDI-FVFYN24SHV2D:~ bayuechuqi$ traceroute www.baidu.com
traceroute: Warning: www.baidu.com has multiple addresses; using 110.242.68.4
traceroute to www.a.shifen.com (110.242.68.4), 64 hops max, 52 byte packets
 1  xiaoqiang (192.168.31.1)  2.858 ms  1.829 ms  1.867 ms
 2  120.13.0.1 (120.13.0.1)  19.476 ms  5.186 ms  5.085 ms
 3  218.11.164.101 (218.11.164.101)  7.338 ms
    218.11.136.253 (218.11.136.253)  8.260 ms
    218.11.171.117 (218.11.171.117)  7.921 ms
 4  hebei.182.61.in-addr.arpa (61.182.184.9)  13.218 ms
    218.11.135.174 (218.11.135.174)  7.732 ms
    hebei.182.61.in-addr.arpa (61.182.184.13)  12.991 ms
 5  hebei.182.61.in-addr.arpa (61.182.184.13)  12.605 ms
    110.242.66.190 (110.242.66.190)  17.065 ms
    hebei.182.61.in-addr.arpa (61.182.184.13)  12.878 ms
 6  * 110.242.66.166 (110.242.66.166)  45.726 ms
    221.194.45.154 (221.194.45.154)  17.251 ms
 7  * * 221.194.45.154 (221.194.45.154)  18.344 ms
 8  * * *

每一跳所经过的IP,可以直接在IP查询网查询一下是哪里的IP。

网络层路由

在之前的文章中有了解到跨设备传输时,需要借助路由表来知道数据报下一跳的IP,在路由表中有两列重要的信息,分别是:目的IP地址和下一跳IP地址,这两个IP形成映射的关系。在前边了解数据报转发时,都是直接使用的路由表,这样就会存在几个疑问:

  • 路由表中的下一跳地址是怎么来的?
  • 下一跳地址是唯一的吗?
  • 下一跳的地址是最佳的吗?
  • 路由器这么多,他们之间是怎么协调工作的?

这些问题就是网络层路由需要解决的问题,其实也就是需要一个好的算法去解决这些问题。所以,了解网络层的路由就是了解里边的一些算法。

下边这张图是一个简单的网络拓扑转化而来的,其中有A、B、C、D、E、F这六个顶点和若干条边。每个顶点表示一个网络或路由器或计算机。每一条边表示一条网络路径。比如从A到E就有很多条路径可以走,在现实网络中也是这样的。所以,该图就可以非常客观的表示现实生活中的网络:

image.png

如果把互联网抽象成一张图的话,那么,路由算法实际上就是图论算法(如Dijkstra)。但是,路由算法又不仅仅是图论算法,因为互联网是非常复杂的,比如,网络经常发生抖动,或网络出现故障。这就会导致图会实时的变化。因此,路由算法,实际上要比图论算法复杂很多。

因此为了让路由算法简单一些,也人为的对互联网进行了处理。对互联网进行了划分,这其中就包含一个非常重要的概念:自治系统(Autonomous System,简称AS)

  • 一个自治系统(AS)是处于一个管理机构下的网络设备群(管理机构:可以是一个国家、一个城市、一个公司)
  • AS内部网络自行管理,AS对外提供一个或多个出入口(AS外部的设备不直接参与内部的管理,如果外部设备需要对AS进行访问的话,通过AS提供的一个或多个出入口进行访问)

在之前的文章中有对网络层次进行了如下的划分:

image.png

了解了AS之后,就可以知道,其实每一个主干ISP,都可以理解成主干AS,每个地区ISP,都可以理解成地区AS。了解了自治系统AS的概念之后,就可以把路由算法分为两个层次:

  • 运行在自治系统内部路由的协议称为:内部网关协议(RIP、OSPE)
  • 运行在自治系统外部路由的协议称为:外部网关协议(BGP)

可以通过一个图示理解内部网关协议和外部网关协议,假设有一个AS1(可能是一个公司的网络),有一个AS2(可能是一个学校的网络),当一个公司和一个学校进行相互访问时,他可能就是通过外部网关协议进行路由的:

image.png