文章目录
- 虚电路服务和数据报服务
- 网际协议IP
- IP地址的分类
- IP地址与硬件地址
- 地址解析协议ARP
- IP数据报的格式
- IP层的转发分组
- 划分子网和构造超网
- 划分子网
- 子网掩码
- 使用子网时的分组转发
- 无分类编址CIDR(构成超网)
- 网际控制报文协议ICMP
- 路由选择协议
- 分层次的路由选择协议
- 内部网关协议RIP
- 内部网关协议OSPF
- 外部网关协议BGP
- IP组播(多播)
网络层位于数据链路层之上,运输层之下;也就是说网络层是基于数据链路层的服务为运输层提供服务的。
虚电路服务和数据报服务
虚电路服务和数据报是网络层所提供的两种服务,那么究竟什么是虚电路服务?什么是数据报服务?
数据报服务
为网络层提供无连接服务(无连接服务:不事先为分组的传输确定传输路径,每个分组独立确定传输路径,不同分组传输路径可能不同);每个分组都携带源地址和目的地址。
虚电路服务
为网络层提供连接服务【连接服务:首先为分组的传输确定传输路径(建立连接),然后沿该路径(连接)传输系列分组,系列分组传输路径相同,传输结束后拆除连接】;什么是虚电路呢?虚电路就是一条源主机到目的主机类似于电路的路径(逻辑连接),路径上所有结点都要维持这条虚电路的建立,都维持一张虚电路表, 每一项记录了一个打开的虚电路的信息;而且还将数据报方式和电路交换方式结合,可以发挥两者的优点。那么虚电路的通信过程是什么呢?
- 建立连接(虚电路建立):每个分组携带虚电路号,而非自的地址。源主机发送“呼叫请求”分组并收到“呼叫应答”分组后才算建立连接。
- 数据传输:全双工通信、
- 释放连接(虚电路释放):源主机发送“释放请求”分组,以拆除电路。
对比方面 |
虚电路服务 |
数据报服务 |
思路 |
可靠通信由网络来保证 |
可靠通信由用户主机保证 |
连接的建立 |
必须有 |
不需要 |
终点地址 |
仅在连接建立阶段使用,每个分组使用短的虚电路号 |
每个分组都有终点的完整地址 |
分组的转发 |
属于同一条虚电路的分组均按照同一路由进行转发 |
每个分组独立选择路由进行转发 |
当结点出故障时 |
所有通过出故障的结点的虚电路均不能工作 |
出故障的结点可能会丢失分组,一些路由可能会发生变化 |
分组的顺序 |
总是按照发送顺序到达终点 |
到达终点的时间,不一定按照发送顺序 |
端到端的差错处理和流量控制 |
可以由网络负责,也可以由用户主机负责 |
由用户主机负责 |
网际协议IP
网际协议IP是TCP/IP体系中两个最重要的协议之一,也是最重要的因特网标准协议之一;通常还有地址解析协议ARP、网际控制报文协议ICMP和网际组管理协议IGMP三个协议与IP协议配套协议。这里可能有人会问了“不是还有逆地址解析协议RARP的吗”,这里没有说的原因是因为RARP协议已经淘汰不适用了,而且它的功能也在别的协议(DHCP协议)中能够实现。
这里给大家补充一些中间设备的知识,不然学完计算机网络连中间设备都分不清楚说出去确实有点尴尬;
- 物理层使用的中间设备叫做转发器
- 数据链路层使用的中间设备叫做网桥或桥接器
- 网络层使用的中间设备叫做路由器
- 在网路层以上使用的中间设备叫网关
IP地址的分类
IP地址与硬件地址
学习IP地址时,弄清楚IP地址和硬件地址的区别是很重要的。物理地址是数据链路层和物理层使用的地址,而IP地址是网路层和以上各层使用的地址,是一种逻辑地址;发送数据时,数据从上层传给下层,使用IP地址的IP数据报一旦交给了数据链路层就被封装成MAC帧,MAC帧所使用的目的地址和源地址都是硬件地址。因为IP数据报传给数据链路层,IP数据报作为MAC帧的数据被封装起来,所以数据链路层看不见数据报的IP地址。
地址解析协议ARP
到这里细心的同学可能会发现,我们还有个问题没有解决“主机或者路由器要怎样知道MAC帧上填入什么样的硬件地址?”,简单的来说就是。我们虽然知道了IP地址,那应该怎么得到其对应的硬件地址呢?这个问题就交给地址解析协议ARP来解决。
那么地址解析协议ARP又是如何解决这个问题的呢?地址解析协议ARP解决的办法是在主机ARP高速缓存中存放一个IP地址到硬件地址的映射表,并且这个映射表还经常更新(新增或超时删除)。每一个主机都设有一个ARP高速缓存,里面有本局域网上各主机的IP地址到硬件地址的映射表。问题又来了,映射表里面的映射是怎样添加的呢?
- ARP进程在本局域网中广播发出一个ARP请求分组,主要内容是“我的IP地址是IP01,硬件地址是A,我想知道IP地址是IP02的主机的硬件地址”;
- 在本局域网上的所有主机上运行的ARP进程都会受到次ARP请求分组;
- 主机B的IP地址与请求分组中要查询的IP地址一致,就收下这个ARP请求分组,并向主机A发送ARP响应分组,主要内容是“我的IP地址是IP02,我的硬件地址是B”;由于其他的所有主机的IP地址与请求分组中的查询的IP地址不同,所以别的主机不需要进行相应;
- 主机A收到响应分组后,就在自己的映射表中添加主机B的IP地址到硬件地址的映射。
注意:因为主机B后面还要向主机A发送响应分组,为了减少网络上的通信量,主机B也会保存主机A的IP地址到硬件地址的映射;而且。ARP会把保存在高速缓存中的每一个映射都设置生存时间。
ARP的四种典型情况:
- 主机A发给本网络上的主机B:用ARP找到主机B的硬件地址;
- 主机A发给另一网络上的主机B:用ARP找到本网络上一个路由器的硬件地址;
- 路由器发给本网络的主机A:用ARP找到主机A的硬件地址;
- 路由器发给另一网络的主机B:用ARP找到本网络上的一个路由器的硬件地址。
IP数据报的格式
这个在网上可以搜到很多很详细的解释,这里就不再过多的解释,只是简单的分享一下,如果想详细学习可以查阅那些专门介绍IP数据报格式的博客,这属于固定的内容一般不会出错。
IP层的转发分组
其核心还是分组转发算法,那么我们就来看一下分组转发算法,具体如下:
- 从数据报的首部提取目的主机的IP地址D,得出目的网络地址为N;
- 若N是与此路由器直接相连的某个网络地址,则进行直接交付,不需要经过其他的路由器,直接把数据交付目的主机;否则就是间接交付,执行3;
- 若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中指明的下一跳路由器;否则,执行4;
- 若路由表中有达到网路N的路由,则把数据传送给路由表中所指明的下一跳路由器;否则,执行5;
- 若路由表中有一个默认路由,则把数据报传给路由表中所指明的默认路由器;否则,执行6;
- 报告转发分组出错。
划分子网和构造超网
前面我们所说的IP地址均为两级IP地址,即表示为IP地址 ::== {<网络号>,<主机号>}
但是,这样的IP地址就能满足我们的使用吗?当然不是,两级IP地址还存在着很多问题。IP地址空间利用率有时会很低,每一个A级网络可连接的主机数超过1000万台,但是真正的使用中这些网络上计算机的数量可能根本达不到这么大的数值;为每一个物理网络分配一个网络号会使路由表变得太大而导致网络性能变坏;两级IP地址还不够灵活,如果一个公司有紧急情况需要开通一个新网络,但是在申请到新的IP地址之前,这个忘了是不可能连接到因特网上的。为了解决这些问题,就将二级网络再进行划分;
划分子网
为了解决上面所说的问题,1985年的时候就在IP地址中增加了一个“子网号字段”,使得两级IP变成了三级IP,这种做法就叫做划分子网,或子网寻址或子网路由选择。那么究竟是怎么进行划分的呢?基本思路如下:
- 一个拥有很多物理网络的单位,可将所属的物理网络划分为若干个子网;值得注意的是,子网划分只是这个单位内部的事情,在单位之外来看仍然是一个网络,看不见有多少个子网。
- 划分的方法:将网络的主机号借用若干位作为子网号,主机号位数减少,两级IP地址变为三级IP地址,表示为IP地址 ::== {<网络号>,<子网号>,<主机号>}
- 当其他网络发送给本单位IP数据报的时候,仍然根据IP地址找到相应的路由器。但是此路由器收到IP数据报后,在按照网络号和子网号找到目的子网,交付IP数据报。
停停停,等一下,上面说的路由器收到IP数据报之后是怎么把他发给子网的呢?从IP数据报的首部又不能看出来目的主机所在的网络有没有进行子网划分,究竟是怎么实现的呢?
这就要说说子网掩码了!
子网掩码
子网掩码也是32位,是由一串1和一串0组成的,子网掩码的1对应三级IP地址里面的网络号和子网号,子网掩码中的0对应三级IP地址里面的主机号;那么网络地址就是子网掩码和IP地址进行逐位的“与”运算。这里还要明白一个事情,就是:在不划分子网的时候,也要使用子网掩码。现在互联网标准规定了所有的网络都必须有子网掩码,同时路由器的路由表中也必须有子网掩码这一栏。所以,若一个网络没有划分子网,那么改网络的子网掩码就使用默认子网掩码:
- A类地址的默认子网掩码是255.0.0.0;
- B类地址的默认子网掩码是255.255.0.0;
- C类地址的默认子网掩码是255.255.255.0;
由此,我们可以知道子网掩码是一个网络或一个子网的重要属性;划分子网虽然增加了灵活性,但却减少了能够连接在网络上的主机总数。
使用子网时的分组转发
上面我们说过,使用子网后路由器的路由表中必须有子网掩码这一栏,即路由表中要包含这三项内容:目的网络地址、子网掩码和下一跳地址,此时路由器转发分分组的算法为:
- 从数据报的首部提取目的主机的IP地址D;
- 先判断是否为直接交付。对路由器直接相连的网络逐个进行检查:用各网络的子网掩码和D逐位相“与”,看结果是否和响应的网络地址匹配。若匹配,则把分组进行直接交付,转发任务结束;否则就是间接交付,执行3
- 若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中指明的下一跳路由器;否则,执行4;
- 对路由表中的每一行(目的网络地址,子网掩码,下一跳地址),用其中的子网掩码和D逐位相“与”,其结果为N。若N与该行的目的网络地址匹配,则把数据报传送给该行指明的下一跳路由器;否则,执行5;
- 若路由表中有一个默认路由,则把数据报传给路由表中所指明的默认路由器;否则,执行6;
- 报告转发分组出错。
大家可以和上面IP层的转发分组中的算法进行对比,查看其差异。
无分类编址CIDR(构成超网)
CIDR主要是用来解决B类地址即将被全部分配完毕和因特网主干网上的路由表项目数急剧增加的问题;我们先来了解一下CIDR最主要的两个特点:
- CIDR消除了传统A类、B类和C类地址以及划分子网的概念;把32位IP地址划分为两部分,前面的部分是“网络前缀”,用来指明网络,后面的部分则用来指明主机,表示为IP地址 ::== {<网络前缀>,<主机号>}。CIDR还是用了“斜线记法”,或成为CIDR记法,即在IP地址后面加上下颚线“/”,然后写上网络前缀所占的位数(即地址掩码中1的个数)。
- CIDR把网络前缀相同的连续IP地址组成了一个“CIDR地址块”,我们只要知道CIDR地址块中的任何一个地址,就可以知道这个地址的起始地址、最大地址和地址块中的地址数。例如,已知IP地址128.14.35.7/20(10000000 00001110 00100011 00000111)是某CIDR地址块中的一个地址,则这个地址所在地址块的最小地址为128.14.32.0(10000000 00001110 00100000 00000000),最大地址为128.14.47.255(10000000 00001110 00101111 11111111)。
在使用CIDR时,采用的是网络前缀这种记法,IP地址是有网络前缀和主机号组成,路由表中的项目也发生了改变,因此我们就一定会有新的方式去进行匹配。应该从匹配结果中选择具有最长网络前缀的路由,这叫做最长前缀匹配。这是因为网络前缀越长,其地址块越小,因为路由越具体。
网际控制报文协议ICMP
为了更高效的转发IP数据报和提高交付成功的机会,网际层使用了网际控制报文协议ICMP,ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告的。ICMP报文是作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去的。
ICMP的报文种类分为两种:ICMP差错报告报文和ICMP询问报文。
ICMP差错报文共有五种:
- **终点不可达:**当路由器或主机不能交付数据报时就向源点发送终点不可达报文。无法交付
- **源点抑制:**当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。因为拥塞而丢数据
- **时间超过:**当路由器收到生存时间TTL=0的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文。生存时间TTL=0
- **参数问题:**当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。首部字段有问题
- **改变路由(重定向) :**路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。有更好的路由
而ICMP询问报文有两种:
- **回答请求和回答报文:**主机或路由器向特定目的主机发出的询问,收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。测试目的站是否可达以及了解其相关状态
- **时间戳请求和回答报文:**请某个主机或路由器回答当前的日期和时间。用来进行时钟同步和测量时间
路由选择协议
路由选择协议也是网络层很重要的一部分,掌握几种常见的路由选择协议并了解他们的具体实现过程是很有必要的;首先我们先来对这些协议进行分类。
分层次的路由选择协议
在学习路由选择协议之前,我们要先明白什么是自制系统;自治系统AS:在单一的技术管理下的一组路由器,而这些路由器使用一种AS内部的路由选择协议和共同的度量以确定分组在该AS内的路由,同时还使用一种AS之间的路由协议以确定在AS之间的路由。一个AS内的所有网络都属于一个行政单位来管辖,一个自治系统的所有路由器在本自治系统内都必须连通。回归正题,因特网把路由选择协议划分为两大类:
- 内部网关协议IGP: 即正在一个自治系统内部使用的路由选择协议,这与互联网中的其他自制系统使用什么路由选择协议无关。如RIP和OSPF协议;
- 外部网关协议EGP: 若源主机和目的主机处在不同的自治系统中,当数据从一个自制系统传到另一个自治系统中;这样的协议就是外部网关协议EGP。如BGP。
接下来,我们就来分别介绍一下这三种协议。
内部网关协议RIP
RIP协议是一种分布式的基于距离向量的路由选择协议,最大的优点就是简单。RIP协议要求网络中每一个路由器都要维护从它到其他每一个路由器的距离记录;距离的定义为:从路由器到直接连接的网路的距离定义为1,从一路由器到非直接相连的网络的距离为所经过的路由器数加1。此外,RIP协议的“距离”也被称为“跳数”。
接下来我们来说一下RIP协议的特点:
- 仅和相邻路由器交换信息;
- 路由器交换的信息是当前本路由器知道的全部信息,即自己的路由表;
- 按固定的时间间隔(例如每30秒)交换一次路由信息, 然后路由器根据新信息更新路由表。若超过180s没收到邻居路由器的通告,则判定邻居没了,并更新自己路由表;
- 经过若干次更新后,所有路由器最终都会知道到达本自治系统任何一个网络的最短距离和下一跳路由器的地址,即“收敛”。
路由表中最主要的信息就是:到某个网络的距离(即最短距离),以及应经过的下一跳地址。路由表更新的原则是找出到每个目的网络的最短距离,这种算法被称为距离向量算法;那么接下来就再介绍一下距离向量算法的具体步骤:
- 对地址为X的相邻路由器发来的RIP报文,修改此报文中的所有项目:把“下一跳"字段中的地址改为X,并把所有的“距离”字段+1。每一个项目都有三个关键数据,即到目的网络N,距离d,下一跳路由X;
- 对修改后的RIP报文中的每一个项目,进行以下步骤:
i . 若原来的路由表中没有目的网络N, 则把该项目添加到路由表中;
ii. 若原来的路由表中有目的网络N,则查看下一跳路由器地址:
• 若下一跳路由器地址是X,则把收到的项目替换源路由表中的项目;
• 若下一跳路由器地址不是X,如果收到的项目中的距离d小于路由表中的距离则进行更新,否则不作处理。
- 若180s还没收到相邻路由器X的更新路由表,则把X记为不可达的路由器,即把距离设置为16。
- 返回
说了这么多,也是时候说说RIP协议不好的地方了,它的缺点就是当网络出现故障时,要经过比较长的时间才能将此信息传达到所有的路由器;难道它只有这一个缺点?当然不是,其实还有很多比如它使用的最大距离为15(16就表示不可达),使用范围很小,所以在规模较小的网络中,使用RIP协议的还是占多数。
RIP协议有缺点?不怕,常见的内部网关协议不是还有OSPF的嘛,让我们再来看看OSPF。
内部网关协议OSPF
OSPF的名字是开放最短路径优先,它就是为了克服RIP的缺点而开发出来的;最主要的特征就是使用过分布式的链路状态协议。既然是为了克服RIP协议的缺点而开发出来的,那么肯定有与RIP协议不同的地方:
- 向本自制系统中所有路由器发送消息。这里使用的方法是洪泛法,即路由器通过输出端口向所有相邻的路由器发送信息,而每一个相邻路由器又再次将此信息发往其所有的相邻路由器。最终整个区域内所有路由器都得到了这个信息的一个副本;
- 发送的信息就是与本路由器相邻的所有路由器的链路状态,这只是路由器知道的部分信息;
- 只有当链路状态发生变化时,路由器才向所有路由器洪泛发送此信息;
最后,所有的路由器都能建立一个链路状态数据库,即全网的拓扑结构图。与RIP正好相反,OSPF的更新过程收敛得快。OSPF和RIP还有一点不同的是RIP使用UDP进行传送,OSPF则直接使用IP数据报传送。OSPF的共有五种分组类型:
- 问候分组,用来发现和维护邻站的可达性;
- 数据库描述分组,向邻站给出自己的链路状态数据库的详细信息;
- 链路状态请求分组,向对方请求发送某些链路状态项目的详细信息;
- 链路状态更新分组,用洪泛法对全网更新链路状态;
- 链路状态确定分组,对链路更新分组的确定。
外部网关协议BGP
首先来看一下BGP的特点:
- 与其他AS的邻站BGP发言人交换信息;
- 交换的网络可达性的信息,即要到达某个网络所要经过的一系列AS;
- 发生变化时更新有变化的部分。
BGP的报文共有四类:
- OPEN (打开)报文:用来与相邻的另一个BGP发言人建立关系,并认证发送方;
- UPDATE (更新)报文:通告新路径或撤销原路径;
- KEEPALIVE (保活)报文:在无UPDATE时,周期性证实邻站的连通性;也作为OPEN的确认;
- NOTIFICATION (通知)报文:报告先前报文的差错;也被用于关闭连接。
IP组播(多播)
在了解IP组播之前我们要先知道,IP数据报都有哪些传输方式:
- 单播:是一种点对点传输方式;
- 广播:广播是指发送数据包到同一广播域或子网内的所有设备的一种数据传输方式,是一种点对多点传输方式;
- 组播:当网络中的某些用户需要特定数据时,组播数据发送者仅发送一次数据,借助组播路由协议为组播数据包建立组播分发树,被传递的数据到达距离用户端尽可能近的节点后才开始复制和分发,是一种点对多点传输方式。
接着我们就要学习究竟要怎么实现多播,多播的实现需要两种协议:网际组播协议IGMP和组播路由协议。
网际组播协议IGMP
IGMP协议让路由器知道本局域网上是否有主机(的进程)加入或退出了某个组播组;使用IP数据报传递报文,IGMP的工作分为两个阶段:
- 某主机要加入组播组时,该主机向组播组的组播地址发送一个IGMP报文,声明自己要称为该组的成员。本地组播路由器收到|GMP报文后,要利用组播路由选择协议把这组成员关系发给因特网上的其他组播路由器;
- 本地组播路由器周期性探询本地局域网上的主机,以便知道这些主机是否还是组播组的成员。只要有一个主机对某个组响应,那么组播路由器就认为这个组是活跃的;如果经过几次探询后没有一一个主机响应,组播路由器就认为本网络上的没有此组播组的主机,因此就不再把这组的成员关系发给其他的组播路由器。
组播路由协议
组播路由协议的目的是找出以源主机为根节点的组播转发树,特点是对不同的多播组对应不同的多播转发树,同一个多播组,对不同的源点也有不同的多播转发树;组播路由协议常用三种算法:
- 基于链路状态的路由选择(OSPF)
- 基于距离-向量的路由选择(RIP)
- 协议无关的组播(稀疏/密集)