计算机网络之网络层
网络层概述
网络层的目的是实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术。如果您想用尽量少的词来记住网络层,那就是”路径选择、路由及逻辑寻址”。
网络层中涉及众多的协议,其中包括最重要的协议,也是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的IP数据报,查询路由表发现下一跳为E
- A将数据报发送给E
- E查询路由表发现下一跳为F,将数据报发送给F
- F查询路由表发现目的地C直接连接,将数据报发送给C
现在结合数据链路层和网络层,再来看一下跨设备传输数据的过程:
- A发出目的地为C的IP数据报,查询路由表发现下一跳为E
- A将IP数据报交给数据链路层,并告知目的MAC地址是E
- 数据链路层填充源MAC地址A和目的MAC地址E
- 数据链路层通过物理层将数据发送给E
- E的数据链路层接收到数据帧,把帧数据交给网络层
- E查询路由表,发现下一跳为F
- E把数据报交给数据链路层,并告知目的MAC地址为F
- E的数据链路层封装数据帧并发送
- F的数据链路层接收到数据帧,把帧数据交给网络层
- F查询路由表,发现下一跳为C
- F把数据报交给数据链路层,并告知目的MAC地址为C
- 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命令进行简单的网络故障排查:
- ping本地回环地址,一般情况下,都会得到返回的,如果得不到返回,则说明你的计算机的协议栈出现了问题,这个时候就可能需要重装系统,或者是重新安装这个协议栈
- ping网关地址,即路由器地址,如果能得到返回的话,则说明本机到路由器的通路是通的,如果没有返回的话,则说明你的wifi,或者你的网线连接是有问题的
- 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协议的过程
- 路由器初始化路由信息(两个向量\(D_i\)和\(S_i\))
- 对相邻路由器X发过来的信息,对信息的内容进行修改(下一跳地址设置为X,所有距离加1)
- 检索本地路由,将信息中新的路由插入到路由表里面
- 检索本地路由,对于下一跳为X的,更新为修改后的信息
- 检索本地路由,对比相同目的的距离,如果新信息的距离更小,则更新本地路由表
- 如果3分钟没有收到相邻的路由信息,则把相邻路由设置为不可达(16跳)
RIP协议的优缺点:
- 优点:实现简单,开销很小。
- 缺点:故障信息传递慢。也就是随便相信“隔壁老王”,“自己不思考” “视野不够”。因为RIP协议每一个路由器它只看到相邻路由器的信息,而看不到更远的路由器信息,这也限制了网络的规模。
内部网关路由协议之OSPF协议
链路状态(LS)协议
链路状态(LS)协议:向所有的路由器发送消息,也就是一传十、十传百,只和相邻的路由器交换信息。消息描述该路由器与相邻路由器的链路状态,每隔30s交换路由信息,只有链路状态发生变化时,才发送更新信息。
Dijkstra(迪杰斯特拉)算法
Dijkstra算法是著名的图算法,Dijkstra算法解决有权图从一个节点到其他节点的最短路径问题,“以起始点为中心,向外层层扩展”。
Dijkstra(迪杰斯特拉)算法定义:
- 初始化两个集合(S, U)(S为只有初始顶点点A的集合,U为其他顶点集合)
- 如果U不为空, 对U集合顶点进行距离的排序,并取出距离A最近的一个顶点D
i. 将顶点D的纳入S集合
ii. 更新通过顶点D到达U集合所有点的距离(如果距离更小则更新,否则不更新)
iii. 重复2步骤 - 直到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开放式最短路径优先,底层是迪杰斯特拉算法,是链路状态路由选择协议,它选择路由的度量标准是带宽,延迟。