计算机网络之网络层

网络层概述

  网络层的目的是实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术。如果您想用尽量少的词来记住网络层,那就是”路径选择、路由及逻辑寻址”。

  网络层中涉及众多的协议,其中包括最重要的协议,也是TCP/IP的核心协议——IP协议。IP协议非常简单,仅仅提供不可靠、无连接的传送服务。IP协议的主要功能有:无连接数据报传输、数据报路由选择和差错控制。与IP协议配套使用实现其功能的还有地址解析协议ARP、逆地址解析协议RARP、因特网报文协议ICMP、因特网组管理协议IGMP。

IP协议详解

虚拟互连网络

  实际的计算机网络是错综复杂的,物理设备通过使用IP协议,屏蔽了物理网络之间的差异,当网络中的主机使用IP协议连接时,则无需关注网络细节。IP协议使得复杂的实际网络变为一个虚拟互连的网络,还使得网络层可以屏蔽底层细节而专注网络层的数据转发,IP协议解决了在虚拟网络中数据报传输路径的问题。

  IP地址长度为32位,常分成4个8位,IP地址常使用点分十进制来表示(0~255.0~255.0~255.0~255),也就是共有\(2^{32} = 4294961296\)个IP地址。下图是IP协议的格式:

我们来看看IP协议的首部:

4位版本 4位首部长度 8位服务类型(TOS) 16位总长度(字节)
16位标识 3位标志 13位片偏移
8位生存时间(TTL) 8位协议 16位首部校验和
32位源IP地址
32位目的IP地址
选项options(若有)
IP数据

版本:占4位,指的是IP协议的版本,通信双方的版本必须一致,当前主流版本是4,即IPv4,也有IPv6
首部位长度:占4位,最大数值为15,表示的是IP首部长度,单位是“32位字”(4个字节),也即是IP首部最大长度为60字节
总长度:占16位,最大数值为65535,表示的是IP数据报总长度(IP首部+IP数据)
TTL:占8位,表明IP数据报文在网络中的寿命,每经过一个设备,TTL减1,当TTL=0时,网络设备必须丢弃该报文。作用:避免数据在网络中无限传输,当这个网络报文找不到目的机器时,而进行无限传输,来浪费带宽资源
协议:占8位,表明IP数据所携带的具体数据是什么协议的(如:TCP、UDP等)

协议名 ICMP IGMP IP TCP UDP OSPF
字段值 1 2 4 6 17 89

首部校验和:占16位,校验IP首部是否有出错

IP协议的转发流程

  在数据链路层的学习中我们知道了MAC地址表,由于IP协议的转发是通过逐跳(hop-by-hop)来实现的,所以在网络层中,存在一个类似于MAC地址表的路由表,路由表是存储的目的IP地址和下一跳IP地址的映射,计算机或者路由器都拥有路由表。路由表如下:

目的IP地址 下一跳IP地址
IP1 IP4
IP2 IP5
IP3 IP6

A设备是如何跨设备将数据发送给C设备的呢?

A设备向C设备在网络层中传输数据的过程如下:

  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的数据链路层F封装数据帧并发送

  从IP协议的转发流程中我们可以看到:数据帧每一跳的MAC地址都在变化,但IP数据报每一跳的IP地址始终不变。但我们会发现一个问题,在网络层中将数据报交给数据链路层,并且需要告知目的MAC地址,但是在网络层中只知道IP地址,我们是如何知道目的MAC地址的呢?这就是ARP协议做的事情了。

ARP协议

  ARP(Address Resolution Protocol)地址解析协议,将网络层中的32位IP地址,通过ARP协议解析为数据链路层中的48位MAC地址。这个映射关系是存储在ARP缓存表中的。arp -a命令:查看ARP缓存表

IP地址 MAC地址
192.168.83.254 00-50-56-e0-33-40
192.168.83.255 01-00-5e-00-00-16
224.0.0.251 01-00-5e-00-00-fc
239.1.2.3 01-00-5e-40-98-8f
255.255.255.255 01-00-5e-7f-ff-fa

  ARP缓存表是ARP协议和RARP协议运行的关键,ARP缓存表缓存了IP地址到硬件地址之间的映射关系,ARP缓存表中的记录并不是永久有效的,有一定的期限。这是因为当你的网络设备,换个网络环境,网络设备的IP地址就可能会发生改变,ARP缓存表中的原来的记录就失效了。当ARP缓存表中有映射关系,就直接查询ARP缓存表;如果没有这个映射关系,ARP协议就会广播,并记录回应得地址信息。

  RARP(Reverse Address Resolution Protocol)逆地址解析协议,其作用与ARP协议相反,即把数据链路层中48位MAC地址,解析位网络层中的32位IP地址。(R)ARP协议是TCP/IP协议栈里面基础的协议,ARP和RARP的操作对程序员是透明的,理解(R)ARP协议有助于理解网络分层的细节。

IP地址的子网划分

分类的IP地址

最小网络号 最大网络号 子网数量 最小主机号 最大主机号 主机数量
A 0(00000000) 127(01111111) \(2^7\) 0.0.0 255.255.255 \(2^{24}\)
B 128.0 191.255 \(2^{14}\) 0.0 255.255 \(2^{16}\)
C 192.0.0 223.255.255 \(2^{21}\) 0 255 \(2^{8}\)

特殊的主机号:主机号全0表示当前网络段,不可分配为特定主机;主机号为全1表示广播地址,向当前网络段所有主机发消息

  • A类地址网络段全0(00000000)表示特殊网络
  • A类地址网络段后7位全1(01111111:127)表示回环地址
  • B类地址网络段(10000000.00000000:128.0)是不可使用的
  • C类地址网络段(192.0.0)是不可使用的

实际可使用各类IP地址如下:

最小网络号 最大网络号 子网数量 最小主机号 最大主机号 主机数量
A 1 127(01111111) \(2^7\)-2 0.0.1 255.255.254 \(2^{24}\)-2
B 128.1 191.255 \(2^{14}\)-1 0.1 255.254 \(2^{16}\)-2
C 192.0.1 223.255.255 \(2^{21}\)-1 1 254 \(2^{8}\)-2

  127.0.0.1,通常被称为本地回环地址(Loopback Address),不属于任何一个有类别地址类。它代表设备的本地虚拟接口,所以默认被看作是永远不会宕掉的接口。在Windows操作系统中也有相似的定义,所以通常在安装网卡前就可以ping通这个本地回环地址。一般都会用来检查本地网络协议、基本数据接口等是否正常的。

划分子网

  随着互连网应用的不断扩大,原先的IPv4的弊端也逐渐暴露出来,即网络号占位太多,而主机号位太少,所以其能提供的主机地址也越来越稀缺,目前除了使用NAT在企业内部利用保留地址自行分配以外,通常都对一个高类别的IP地址进行再划分,以形成多个子网,提供给不同规模的用户群使用。这里主要是为了在网络分段情况下有效地利用IP地址,通过对主机号的高位部分取作为子网号,从通常的网络位界限中扩展或压缩子网掩码,用来创建某类地址的更多子网。但创建更多的子网时,在每个子网上的可用主机地址数目会比原先减少。

上图就把原来的C类地址划分成了两个子网。
  但子网号这么多,有没有办法快速判断某个IP的网络号?这就是子网掩码的作用了,子网掩码是标志两个IP地址是否同属于一个子网的,也是32位二进制地址,其每一个为1代表该位是网络位,为0代表主机位。它和IP地址一样也是使用点式十进制来表示的。如果两个IP地址在子网掩码的按位与的计算下所得结果相同,即表明它们共属于同一子网中。

  子网掩码由连续的1和连续的0组成,某一个子网的子网掩码具备网络号位数个连续的1

  在计算子网掩码时,我们要注意IP地址中的保留地址,即” 0″地址和广播地址,它们是指主机地址或网络地址全为” 0″或” 1″时的IP地址,它们代表着本网络地址和广播地址,一般是不能被计算在内的。

无分类编址CIDR

  CIDR中没有A、B、C类网络号、和子网划分的概念,CIDR将网络前缀相同的IP地址称为一个“CIDR地址块”,注意网络前缀是任意位数的。

网络前缀 主机号

斜线记法:193.10.10.129/25 使用二进制表示:11000001.00001010.00001010.10000001
无分类地址CIDR相比原来的子网划分更加 灵活:

CIDR前缀长度 掩码点分十进制 地址数
/13 255.248.0.0 512K
/14 255.252.0.0 256K
/15 255.254.0.0 128K
/16 255.255.0.0 64K
/17 255.255.128.0 32K
/18 255.255.192.0 16K
/19 255.255.224.0 8K

网络地址转换NAT技术

  IPv4最多只有40+亿个IP地址,早期IP地址的不合理规划导致IP号浪费。在介绍NAT技术之前,首先要知道内网地址和外网地址。

  • 内网地址:内部机构使用,避免与外网地址重复。三类内网地址如下:
    • 10.0.0.0~10.255.255.255(支持千万数量级设备)
    • 172.16.0.0~172.31.255.255(支持百万数量级设备)
    • 192.168.0.0~192.168.255.255(支持万数量级设备)
  • 外网地址:全球范围使用,全球公网唯一

  网络地址转换技术是发生在本地路由器的,主要功能就是把内网的IP地址转成外网的IP地址来进行外部的通信,并且在接收到数据之后,再把外网IP地址映射成内网IP地址,转发到具体的某个设备上面去。

  内网多个设备使用同一个外网IP请求外网的服务,外部怎么知道具体是哪个设备在请求的?网络地址转换NAT的英文全称是Network Address Translation,NAT技术用于多个主机通过一个公有IP访问互联网的私有网络中,外部主要是通过端口号来区分到底是内网的哪一个设备进行请求的,这其中有一个NA(P)T表表:示例如下:

方向 旧的地址和端口号 新的地址与端口号
192.168.2.11:6666 173.21.59.10:16666
192.168.2.10:7777 173.21.59.10:17777
173.21.59.10:16666 192.168.2.11:6666
173.21.59.10:17777 192.168.2.10:7777

NAT减缓了IP地址的消耗,但是增加了网络通信的复杂度

ICMP协议

  ICMP协议全称是网际控制报文协议(Internet Control Message Protocol),ICMP协议可以报告错误信息或者异常情况

ICMP协议首部:

8位类型 8位代码 16位校验和
ICMP报文数据

ICMP报文分为:差错报告报文和询问报文:

ICMP报文种类 类型的值 报文类型 具体代码
差错报告报文 3(终点不可达) 网络不可达 0
主机不可达 1
5(重定向) 对网络重定向 0
对主机重定向 1
11 传输超时
12 坏的IP头 0
缺少其他必要参数 1
询问报文 0或8 回送(Echo)请求或应答
13或14 时间戳(Timestamp)请求或应答

ICMP协议的应用

ping应用:我们可以通过ping命令进行简单的网络故障排查:

  1. ping本地回环地址,一般情况下,都会得到返回的,如果得不到返回,则说明你的计算机的协议栈出现了问题,这个时候就可能需要重装系统,或者是重新安装这个协议栈
  2. ping网关地址,即路由器地址,如果能得到返回的话,则说明本机到路由器的通路是通的,如果没有返回的话,则说明你的wifi,或者你的网线连接是有问题的
  3. ping远端地址,如果不通的话,则说明你的家到ISP之间的网络是故障的,此时就需要联系网络服务商(移动、电信、联通)进行排查。

Traceroute应用:Traceroute可以探测IP数据报在网络中走过的路径

路由概述

  思考:路由表中的下一跳地址是怎么来的?下一跳地址是唯一的吗?下一跳地址是最佳的吗?路由器怎么多,他们是怎么协同工作的?为了解决这些问题,路由表需要一个好的算法去解决这些事情。路由算法实际上是图论的算法,由于网络环境复杂,使得路由算法要比图论的算法更复杂。

  由于互联网的规模是非常大的,互联网环境是非常复杂的,所以我们需要对互联网进行划分。自治系统(Autonomous System)是指处于一个管理机构下的网络设备群,AS内部网络自行管理,AS对外提供一个或者多个出(入)口。自治系统内部路由的协议称为:内部网关协议(RIP、OSPF), 自治系统外部路由的协议称为:外部网关协议(BGP)。

路由算法

  路由算法的本质是距离矢量(DV)算法, 距离矢量(DV)算法介绍如下:

  • 每一个节点使用两个向量\(D_i\)\(S_i\)
  • \(D_i\)描述的是当前节点到别的节点的距离
  • \(S_i\)描述的是当前节点到别的节点的下一节点
  • 每一个节点与相邻的节点交换向量\(D_i\)\(S_i\)的信息
  • 每一个节点根据交换的信息更新自己的节点信息


现在假设有A的距离矢量信息,收到的距离矢量信息如下图:

A通过B到各个节点得距离矢量信息如下:

A通过C到各个节点得距离矢量:并更新下一条的节点

A通过D到各个节点得距离矢量:并更新下一条的节点

A通过F到各个节点得距离矢量:并更新下一条的节点

RIP协议

  RIP(Routing Information Protocol)协议,RIP协议是使用DV算法的一种路由协议。RIP协议把网络的跳数(hop)作为DV算法的距离,每隔30s交换一次路由信息,认为跳数>15的路由则为不可达路由。

RIP协议的过程

  1. 路由器初始化路由信息(两个向量\(D_i\)\(S_i\))
  2. 对相邻路由器X发过来的信息,对信息的内容进行修改(下一跳地址设置为X,所有距离加1)
    1. 检索本地路由,将信息中新的路由插入到路由表里面
    2. 检索本地路由,对于下一跳为X的,更新为修改后的信息
    3. 检索本地路由,对比相同目的的距离,如果新信息的距离更小,则更新本地路由表
  3. 如果3分钟没有收到相邻的路由信息,则把相邻路由设置为不可达(16跳)

RIP协议的优缺点:

  • 优点:实现简单,开销很小。
  • 缺点:故障信息传递慢。也就是随便相信“隔壁老王”,“自己不思考” “视野不够”。因为RIP协议每一个路由器它只看到相邻路由器的信息,而看不到更远的路由器信息,这也限制了网络的规模。

内部网关路由协议之OSPF协议

链路状态(LS)协议

  链路状态(LS)协议:向所有的路由器发送消息,也就是一传十、十传百,只和相邻的路由器交换信息。消息描述该路由器与相邻路由器的链路状态,每隔30s交换路由信息,只有链路状态发生变化时,才发送更新信息。

Dijkstra(迪杰斯特拉)算法

  Dijkstra算法是著名的图算法,Dijkstra算法解决有权图从一个节点到其他节点的最短路径问题,“以起始点为中心,向外层层扩展”。

Dijkstra(迪杰斯特拉)算法定义:

  1. 初始化两个集合(S, U)(S为只有初始顶点点A的集合,U为其他顶点集合)
  2. 如果U不为空, 对U集合顶点进行距离的排序,并取出距离A最近的一个顶点D
    i. 将顶点D的纳入S集合
    ii. 更新通过顶点D到达U集合所有点的距离(如果距离更小则更新,否则不更新)
    iii. 重复2步骤
  3. 直到U集合为空,算法完成

OSPF协议的过程

  OSPF(Open Shortest Path First:开放最短路径优先),OSPF协议的核心是Dijkstra算法。OSPF协议的过程:路由器接入网络,路由器向邻居发出问候信息,与邻居交流链路状态数据库,广播和更新未知路由。

RIP协议 OSPF协议
从邻居看网络 整个网络的拓扑
在路由器之间累加距离 Dijkstra算法计算最短路径
频繁、周期更新,收敛很慢 状态变化更新,收敛很快
路由间拷贝路由信息 路由间传递链路状态,自行计算路径

外部网关路由协议之BGP协议

  BGP(Border Gateway Protocol: 边际网关协议),BGP协议是运行在AS之间的一种协议。由于互联网的规模很大,AS内部使用不同的路由协议。

  AS之间需要考虑除网络特性以外的一些因素(政治、安全…),BGP(Border Gateway Protocol,边界网关协议),BGP协议能够找到一条到达目的比较好的路由,AS之间通过BGP发言人来进行路由信息的交换。BGP发言人(speaker):BGP并不关心内部网络拓扑,AS之间通过BGP发言人交流信息,BGP Speaker可以人为配置策略。

总结:网络层负责对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制、网际互连等功能;网络层的基本数据单位为IP数据报;包含的主要协议:IP协议(Internet Protocol,因特网互联协议)、ICMP协议(Internet Control Message Protocol,因特网控制报文协议)、ARP协议(Address Resolution Protocol,地址解析协议)以及RARP协议(Reverse Address Resolution Protocol,逆地址解析协议)。网络层重要的设备是路由器。常见的路由选择协议有:RIP协议、OSPF协议。RIP协议 :底层是贝尔曼福特算法,它选择路由的度量标准(metric)是跳数,最大跳数是15跳,如果大于15跳,它就会丢弃数据包;OSPF协议 :Open Shortest Path First开放式最短路径优先,底层是迪杰斯特拉算法,是链路状态路由选择协议,它选择路由的度量标准是带宽,延迟。

发表评论

您的电子邮箱地址不会被公开。