网络层总结(IP协议簇)
知识点
知识点如下
- ARP、ICMP、ICGP协议,重点在于ARP和ICMP
- IP地址的分类、IP地址组成、IP地址的演化
- IPV4数据报格式
- 无子网划分的路由器的分组转发算法
- 子网划分、子网划分之后的分组转发算法
- IP地址的无分类编制CIDR(形成超网)
- 路由协议(路由器之间交换路由信息)
- IPV6数据报格式
- IPV4到IPV6的演变
- 路由器的组成
网络层主要的协议
先来简单回顾下网络层主要用的协议
整个网络层从上到下,分别是
- ICMP、IGMP:网络层与上层传输层交互的
- ICMP:Internet Controller Message Protocol,网际控制报文协议
- IGMP:Internet Group Management Protocol,网际组管理协议
- IP:网际协议
- ARP:Address Resolution Protocol 地址解析协议,用于与链路层交互的
IP地址形式的发展
下面回顾一下IP地址的分类、IP地址的组成、IP地址的演变
IP地址的演变
首先要认识,IP地址的组成由网络号和主机号组成,清楚一个事实就是,网络号+主机号两者唯一确定主机
先来回顾第一个阶段
IP地址为32位,分为ABCDE类,划分ABCDE类的主要依据在于IP地址第一个0出现的为数,比如第一位为0代表A类地址;第二位为0,代表为B类地址;第三位为0代表C类地址,第四位为0代表D类地址,前面4位都不出现0代表E类地址
类 | 网络号 | 主机号 |
---|
A | 8位的网络号,开头为0 | 剩下的24位 | B | 16位的网络号,开头为10 | 剩下的16位 | C | 24位的网络号,开头为110 | 剩下的8位 | D | 1110开头,整个IP地址为一个多播地址,没有网络号和主机号划分 | | E | 1111开头,预留今后使用的地址 | |
前提:一个机构被分配的地址是网络号,然后可以对主机号来进行自行分配(网络号也确定了其是什么类IP地址)
从中也可以看到,A类地址可分配的主机最少,B类次少,C类最多,一般生活上大多数都仅是涉及A、B、C类地址,C类地址遇到的最多
常常将IP地址使用点分十进制来进行表示,既32位划分成4组8位,没组8位由10进制表示,所以最大值为255.255.255.255
所以对应也可以划分出A、B、C类地址的网络号的最大值和最小值,这里就不推算了
下面来看第二个阶段,划分子网
三个问题
针对第一个问题:一个网络号代表了一个整体网络,而对这整体网络再进行细划,分成一个个小网络,这些小网络就称为子网,整个网络就由这一个个子网来组成
针对第二个问题:有三个方面
- 节约IP地址,一个机构分到了一个IP地址,但其根本用不完分配得到的主机号,这样不就产生浪费了吗?所以分配一个子网给它,几个机构形成的子网网络构成一个整体网络。
- 减少路由器中的路由表的路由项数量,通过路由器对IP地址的聚合(后面学习的CIDP),同时,当机构申请IP地址时,优先考虑分配子网,这样就可以不用额外添加路由表的表项了,这里要注意:子网与子网是属于同一个网络的,边缘是有一个路由器来接收该网络的分组,因为是同个网络,所以可以进行直接转发
- 两级IP地址不够灵活,两级IP地址让网络号、主机号都是固定大小的,增加了子网号之后可以限制主机号的长度,让IP地址更加灵活
针对第三个问题:有了子网的划分之后,IP地址不再是两级了,而是变成了三级,也就是原来的主机号划分出了一部分来当子网号,由以下三部分组成
有了子网号,还要进行区分,当路由器拿到一个IP数据报并解析出IP地址时,虽然可以根据其是几类IP地址来划分出网络号,但并不能划分出子网号,因此有了子网掩码,IP地址与子网掩码进行与运算就可以得出网络号+子网号了,子网掩码同样也是32位,网络号与子网号的部分对应为1,剩下的部分为主机号,对应为0
有人可能就觉得,把主机号给去没了怎么办?分组在网络核心进行路由转发是不需要使用到主机号的(间接转发),只要到达IP地址对应的网络时,路由器会判断出该分组跟自身属于同一个网络,此时主机号才会有用处,路由器会进行匹配然后进行直接转发
还有一个问题:如果网络本身不划分子网,那怎么办呢?
- 互联网规定所有网络都必须使用子网掩码、路由器的路由表都要有子网掩码的栏目
- 本身不划分子网的话,子网掩码就采用默认的子网掩码,默认的子网掩码只会筛选出网络号出来
- A类的默认子网掩码:0xFF000000
- B类的默认子网掩码:0xFFFF0000
- C类的默认子网掩码:0xFFFFFF00
注意,子网号或主机号为全0或者全1是有特殊含义的,并不是代表一个子网,因此不同类的IP地址,其子网号可以使用的位数也是不一样的,比如B类,使用0、1、15和16位的子网号是没有意义的,0就是没有子网,1就是子网号只能为全1或全0,15就代表主机号为全0或全1,16代表没有主机号
划分子网增加了灵活性,但却减少了能够连接在网络上的主机总数
下面来看第三个阶段:构造超网
超网是由无分类编址CIDR来实现的,用来解决了路由表上的路由项过多的和B类地址消耗完了,并没有解决IPV4危机,解决IPV4危机是靠IPV6的,相当于是一个应急措施
其实CIDR就是前面回顾的路由表对属于同一个网络但不同子网的聚合处理
CIDR让IP地址的组成形式又变回了两级,组成形式为:网络前缀+主机号,网络前缀代表了前面的网络号和子网号,而主机号的意义不变,CIDR采用斜线记法,在IP地址的后面使用斜线+位数来表明网络前缀的长度,比如192.168.7.1/16,代表前面16位为2网络前缀,同时,这后面的位数其实也表明了子网掩码的1的个数
CIDR的贬值方式,可以让路由器使用聚合的方式来减少路由表中的表项,聚合之后就构成了一个超网。
聚合的方式就是,判断部分网络前缀是否一致,并且要优先选择最长前缀匹配
- 两个子网部分网络前缀一致,可以将两个子网划分在一起,形成一个超网
- 可能会存在多种匹配方式,优先选择最长前缀匹配方式
举个栗子,如下 有两种形式的划分
- 192.168.8.0/21
- 192.168.0.0/16
当后面接收到发送自192.168.11.0的分组会优先选择第一个超网
通过将子网聚合成超网,大量减少了路由表中的表项
IPV4数据报格式
分为两部分
路由算法
首先要知道,IP数据报的在路由器的转发,跟主机号无关,只要到达了位于同一个网络下的路由器,才会使用到主机号进行转发
无子网划分时的路由算法
路由表中存储的路由项由两部分组成:(目的网络地址,下一跳地址),而下一跳地址有两种形式
- 直接转发交付:从接口转发,也就是代表当前路由器与目的主机位于同一个网络,进行直接转发交付
- 间接网络交付:转发到下一个路由器,代表当前路由器与目的主机不位于同一个网络,需要交由下一个路由器处理,进行间接转发交付
基于目的主机所在的网络进行路由,并且要注意,路由器自身至少拥有两个IP地址,一个是接收方网络的IP地址,另外一个是发送方网络的IP地址
有几个注意点
- 路由器通过匹配路由表上的目的网络地址,从而确定下一跳地址
- 中间经过多次间接转发交付之后,IP数据报最终可以找到目的主机所在目的网络上的路由器,然后进行直接转发交付
- 存在特定主机路由和默认路由,特定路由用来为特定主机指明路由信息,默认路由是当无法找到路由信息时会使用,默认路由一般适用于路由器对外连接的网络比较少,可以用来减少路由表信息,减少占用空间和路由搜索时间。比如一个路由器仅仅只有一个端口与外部一个网络进行连接,那么仅仅只需要一个默认路由即可
路由的过程如下
- 从数据报的头部解析出目标IP地址信息
- 先判断是否可以直接交付,也就是判断IP地址信息与路由器自身的IP地址是否位于同一个网络,如果位于,不再进行路由转发给其他路由器处理,当前路由器从指定端口进行发送,路由的IP地址就是解析出的IP地址信息
- 如果不能直接交付,就要进行间接交付
- 判断有没有目标IP地址的特定路由信息,如果有,就根据特定路由信息传给下一跳路由器
- 从路由表中搜索有没有目标IP地址映射的路由信息,如果有,就根据映射的路由信息传给下一跳路由器
- 判断有没有默认路由,如果有,就根据默认路由信息传给下一跳路由器
- 最后都没找到对应路由信息,抛出异常!
转发的细节
- 当路由器找到了下一跳IP地址、或者指定直接转发的端口之后,要进行重新IP地址映射MAC硬件地址,使用ARP高速缓存,通过路由的IP地址寻找到匹配的下一跳的MAC地址,并且将MAC地址放在链路层的帧的首部
- 其实路由器的输入端口进行解封装时,会先判断MAC地址是否与自身MAC地址匹配,如果不匹配会直接丢弃!
出现子网划分时的路由算法
出现了子网划分之后,我们从IPV4的数据报可以看到,并没有存储子网掩码的字段,所以,子网掩码的信息是直接保存在路由器上的,所以,此时路由器的路由表项就从两个变化变为了3个,(目的网络地址:子网掩码:下一跳地址)
整体的过程跟前面的路由算法几乎一致,不过多了一个使用子网掩码计算网络号和子网号的步骤
- 首先依然是将IP数据报中的IP地址解析出来
- 先判断是不是可以直接交付,判断IP地址信息与路由器自身的IP地址是否位于同一个网络,通过对与当前路由器直接相连的网络逐个进行检查(一个路由器可能有多个相连的网络),用各网络的子网掩码与IP地址进行相与,看是否与目的网络地址匹配上,如果匹配上,就直接交付,直接交付就是使用解析出的IP地址去找ARP映射的MAC地址
- 判断路由表中是否有该IP地址的特定路由,如果存在,根据特定路由来转发
- 对路由表中的每一行路由信息,使用子网掩码与解析出的IP地址进行相与,与路由信息的IP地址进行匹配,如果匹配成功,根据匹配成功的路由信息的IP地址来转发,跳转到下一个指定的路由器
- 判断是否有默认路由,如果有,根据默认的路由来进行转发
- 报错
形成超网之后的路由算法
形成超网之后,除了上面的步骤之外,还要进行最长前缀匹配
使用了CIDR之后,IP地址的组成就变成了网络前缀+主机号,因此路由表中的路由项也变了,又变回了两项,(网络前缀:下一跳地址),这里要知道网络前缀的表示为网络前缀/前缀长度,前缀长度可以当成是子网掩码
路由算法的步骤大概都一致
- 解析IP地址
- 判断是不是可以直接交付,通过搜索方法看直接交付项中是否有匹配的网络前缀
- 判断路由表中是否有特定路由
- 判断路由表项中有没有匹配的路由,通过搜索方法看路由表项中是否有匹配的网络前缀
- 判断有没有默认的路由
- 报错
不同点在于,匹配的方式变成了ip地址与掩码进行相与,看是否与指定的网络前缀相匹配,然后要优先选择最长的一个
那么此时就要考虑采用什么算法了
最简单的方法就是迭代法,对IP地址所有可能的前缀长度进行查找,从1~32,那么对于一个IP地址,都要去匹配32次
那么为了提高查询的效率,采用二叉搜索来查找路由表
二叉搜索的关键在于使用网络前缀来形成一棵二叉树,一个网络前缀对应的就是从根节点到叶子结点(当然实际不包含根节点,因为根节点只能代表一个值,网络前缀的开头可以为0和1),该二叉树的高度最多只有32,那么就可以使用该树来快速直接搜索到匹配的最长前缀了,这种做法相比于迭代来说,就是减少了很多的无效匹配,比如说路由表压根没有路由信息,就不需要匹配了,匹配的最长前缀为16位就只会匹配到16位,17位就不符合顺序了
不过这里要注意的是,叶子结点还要去存储对应的子网掩码,从而当经过一个叶子结点的时候计算出匹配的网络前缀,然后去映射找到对应的下一跳地址
网络层的协议
与IP协议经常配套使用的
- ARP协议:Address Resolution Protocal,地址解析协议,用于链路层根据对应IP地址匹配到对应MAC地址的
- ICMP协议:Internet Controller Message Protocal,网际控制报文协议,用来进行IP数据报转发时的差错报告的
先来分析一下ARP协议
ARP协议
ARP协议是解决了IP地址与MAC地址映射关系的
首先要知道MAC地址与IP地址的区别!MAC地址是一个物理地址,而IP地址则是一个逻辑地址,将分组真实转发到目标主机,其实依赖的是MAC地址,而IP地址则是将MAC地址给抽象了起来,让网络层不需要知道链路层的细节,只需要关注IP地址来进行通信即可
然后还需要知道的是,分组接收的过程,当物理层将分组传给链路层时,链路层会解开MAC帧,取出MAC地址,如果MAC地址与自身的MAC地址不对应,则会抛弃掉,只有对应,才会保留,然后将IP数据报拆出来传给上一层的IP层,所以当路由器确定了IP数据报的下一跳地址时,是需要找到下一跳地址映射的MAC地址,然后交由链路层封装成MAC帧的,因此就需要IP地址与MAC地址的映射关系,也就有了ARP协议
ARP协议的内容
- 主机使用ARP高速缓存来记录局域网中各个主机IP地址与MAC地址的映射关系,并且该映射关系是有过期时间的
- 当主机要向局域网中的某A主机发送数据报时,会先查询自身的ARP高速缓存是否具有目标IP地址与MAC地址的映射关系
- 如果没有,则会在该局域网上发送一个广播ARP请求分组,里面带有目标IP地址、自身的IP地址与自身的MAC地址,局域网上的所有主机都可以接收到该ARP请求分组,不过只有自身IP地址与分组中的目标IP地址对应才会做出响应,然后采用单播的形式响应,发送ARP响应分组(分组上带上了自己的MAC地址和自身的IP地址),当主机接收到ARP响应分组就会在自身的ARP高速缓存中保存该映射关系并且设置上生存时间
- 如果有,直接根据映射关系找到对应的MAC地址
- 设置生存时间是因为主机的MAC地址会发生改变,因此需要定时刷新
- 这里要注意的是,ARP是解决了同一个局域网上的主机的IP地址和MAC地址的映射!不同网络是不知道对方的IP地址和MAC地址的映射关系的
ICMP协议
ICMP协议主要用来做差错报告的,提供可靠的IP协议服务,但也仅仅只是差错报告,并不进行纠错,ICMP报文位于IP数据报的数据部分,ICMP协议不属于IP层
首先IP协议的报文格式如下
ICMP的前8字节是固定的
- 类型:ICMP的类型
- ICMP的类型分为两大类
- ICMP询问报文,比如Ping命令的实现
- ICMP差错报告报文
- 代码:与类型字段组合起来使用,定义详细的报文类型,说白了就是大类型中的小类型
- 校验和:校验整个ICMP数据报的,包括头部和选项数据
- 选项数据:ICMP数据报的内容
路由选择协议
路由选择协议不是路由算法匹配的问题,而是路由器如何去学习路由信息!说白了就是路由表的表项应该如何获得,如何进行选择!
首先路由选择协议分为两大类,依据是路由器是否可以根据网络状态来进行更新路由信息来进行分类
- 静态路由选择策略:非自适应路由选择,路由信息是固定的,不能动态去变化,也不能及时去适应网络状态,但其开销小
- 动态路由选择策略:自适应路由选择,可以动态去变化,能够较好地适应网络的变化,但实现起来困难,对于路由器来说有一定的开销
网络一般采用动态路由选择策略
同时,网络还采用分层次的路由选择策略,整体的网络被划分为一个个自治系统(AS),一个自治系统里面是由一系列路由器来构成的,在一个自治系统内部,是使用IGP协议来管理的,而对于两个自治系统之间,则是采用EGP
- IGP:Interior GateWay Protocol,内部网关协议
- EGP:External GateWay Protocol,外部网关协议
为什么要进行分层次呢?
- 如果不分层次,那么每个路由器就需要知道所有的网络应该如何到达,路由表就太过庞大了,分层次了之后,AS系统里面的路由器仅仅只关心内部的路由信息,对于外部的路由信息交给AS系统的边缘路由器来负责
- 有一些机构并不想其内部网络被外部全部知道,但同时也想要内部网络可以连接到互联网上
常用的几种协议
- IGP:内部网关协议,又被称为域内路由选择
- EGP:外部网关协议,又被称为域间路由选择
内部网关协议
RIP
RIP的全称为Routing Infomation Protocol,路由信息协议,并且是前期使用最广泛的,是一个基于分布式距离向量的路由选择协议
什么是距离向量?
距离向量其实是当前路由器到目的网络所要经过的距离,使用经过的路由器数量来进行表示!
RIP需要跟相邻的路由器不断去交换路由信息,从而选择最短的路由路径
- RIP只允许相邻的路由器进行交换信息
- 每次交换信息都是发送全部的路由信息
- 相邻路由器会定时地进行路由交换
通过定期地交换路由信息,选择出去往目的网络的最短距离的路径
交换信息采用的是距离向量算法
-
相邻路由器发送RIP报文,里面含有相邻路由器的所有路由信息 -
接收RIP报文的路由器会首先将RIP报文中的路由表中的下一跳字段,改为相邻路由器,这是因为对于报文中的目的网络,需要当前路由器来转发到相邻路由器才能继续进行下面的跳转,同时距离字段还要进行加1,道理也是一样,需要经过相邻路由器才能跳转 -
对修改RIP报文中的每一个项目,进行下面步骤
- 判断本身路由表中是否含有目的网络,如果没有,则直接添加
- 如果含有目的网络,判断下一跳的地址是不是相邻路由器,如果是发送来RIP报文的路由器,则要进行覆盖,更新替换
- 如果含有目的网络,但下一跳的地址不是相邻路由器,则会比较距离字段,选择最小距离字段的项来进行覆盖
-
注意点,如果3分钟没有收到相邻路由器的RIP报文,那么当前路由器将会将该路由器设为不可到达,下一跳地址为相邻路由器的项的距离字段全部会变为16! -
RIP协议定义了,最大的距离为15,当超过15时,将会被视为不可达 -
RIP协议让每个自治系统中的路由器都和自己的相邻路由器定时地蒋欢路由信息,不断去更新路由表,使得了每一个路由器到下一个网络地址的路由都是最短的! -
当也是由于RIP定时的更新操作,并且是交换所有的路由信息,造成的网络开销不可忽略,因此仅仅适用于一些小网络
RIP协议的报文格式
RIP的报文也分为两部分
- 首部(4个字节)
- 命令:命令是指出报文的意义,比如是请求路由信息还是响应RIP请求的
- 版本
- 填充0:保证首部一定要满四个字节
- 路由部分,路由部分由路由项组成,一个路由项为20个字节,最多只能有25个路由项
- 路由项的组成如下
- 地址族标识符:支持非IP地址,可以是其他TCP\IP协议
- 路由标记:为自治系统号
- 目的网络地址
- 子网掩码
- 下一跳地址
- 距离向量
- 首部为4个字节,而路由项每个为20字节,最多只能有25个,因此整个RIP报文最大为504个字节!
RIP的优点在于实现简单、并且开销较小,并且传播得快!但缺点则是传播得慢!
传播的慢是指当某个网络断开连接时,比如某个网络断开连接,路由器A也知道了,并且将其设为不可达,但此时相邻路由器发送了RIP报文给了A,并且里面有经过A到达断开网络得路由信息,此时A也相信了B,并且替换了,让距离向量+1,然后循环轮转,直到某一方发现了断开网络其实不可达才会停止!也就是说,对于检测网络断线可能会出现很慢的情况
RIP是封装在UDP用户数据报上的!
OSPF
OSPF称为Open Shortest Path First,也就是最短路径优先,其采用SPF(最短路径算法)来实现
- OSPF最主要的特征是链路状态协议,交换的是路由器的链路状态,不仅仅是路由信息,还包括路由器其他信息,比如跟什么路由器相邻
- 路由器会采用洪泛法将自己的链路状态信息发送给自治系统中所有的路由器,首先路由器会通过所有的输出端口向相邻的路由器发送信息,然后相邻的路由器又会通过自己的所有输出端口,向其他路由器发送信息!这样就会很快传播给自治系统中所有的路由器,与RIP协议不一样,RIP协议仅仅只是传播给相邻路由器就没了
- 路由器发送的信息是链路状态信息,链路状态信息说明了当前路由器与哪些路由器相邻,并且包含该链路的一些度量信息,度量信息可以指距离、时延、带宽等
外部网关协议
BGP
IPV6
使用IPV6了之后,IP数据报改名为分组了
IPV6主要的变化
- 更大的地址空间:IP地址由32位扩展到了128位
- 地址拥有更大的扩展性:因为IP地址的位数多了,可以做更多层次结构性的扩展
- 报文的首部格式更加灵活:添加了更多的可选项扩展首部字段
- IPV6的报文对其采用的是八字节对其,而IPV4则是4字节对齐
- 支持资源的预分配:一些影像资源需要占用更多的带宽,因此会进行预分配!
IPV4如何过渡到IPV6
有两种方式
- 双协议栈:双协议栈的主机既可以和IPV6通信,也可以和IPV4通信,通过DNS的域名解析系统,直到目的主机采用哪种协议,然后就使用哪种协议进行通信,因此双协议栈的主机拥有两种IP地址
- 隧道技术:当IPV6数据报要进入IPV4的网络中时,会将IPV6数据报封装进IPV4数据报中,成为数据部分里面的一部分;当从IPV4网络中出来时,再将IPV4中的IPV6给还原出来,交给主机的IPV6协议栈
|