网络层概述
网络层是干什么的?
- 网络层的主要任务是实现不同异构网络互连,进而实现数据包在各网络之间的传输
- 相比于数据链路层的以太网通信,网络层则是将一个个数据链路层连接的以太网通过路由器连接起来。从而实现不同数据链路层的互联。
这些异构型网络N1~N7如果只是需要各自内部通信,他们只要实现各自的物理层和数据链路层即可
但是如果要将这些异构型网络互连起来,形成一个更大的互联网,就需要实现网络层设备路由器
有时为了简单起见,可以不用画出这些网络,图中N1~N7,而将他们看做是一条链路即可
-
网络层最最核心的功能,就是 分组转发 和 路由选择
- 分组转发:当分组进入路由器,根据转发表将分组从合适的路由端口转发出去
- 路由选择:当分组从发送方流向接收方时,网络层必须决定这些分组所采用的路由或路径,这就是路由选择
路由器收到数据后,是依据什么来决定将数据包从自己的哪个端口转发出去?
依据分组中的目的地址和路由器中的路由表
但在实际当中,路由器是怎样知道这些路由记录?
- 由用户或网络管理员进行人工配置(比如配置一个默认兜底的路由),这种方法只适用于规模较小且网络拓扑不改变的小型互联网
- 另一种是实现各种路由选择协议,由路由器执行路由选择协议中所规定的路由选择算法,而自动得出路由表中的路有记录,这种方法更适合规模较大且网络拓扑经常改变的大型互联网
补充 网络层(网际层)除了 IP协议外,还有之前介绍过的地址解析协议ARP,还有网际控制报文协议ICMP,网际组管理协议IGMP
总结
网络层提供的两种服务
这个问题是怎么提出来的呢?
- 在计算机网络领域,网络层应该向运输层提供怎样的服务(“面向连接”还是“无连接”)曾引起了长期的争论。
- 争论焦点的实质就是:在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统?
面向连接的虚电路服务
一种观点:让网络负责可靠交付
- 这种观点认为,应借助于电信网的成功经验,让网络负责可靠交付,计算机网络应模仿电信网络,使用面向连接的通信方式。
- 通信之前先建立虚电路 (Virtual Circuit),以保证双方通信所需的一切网络资源。
- 如果再使用可靠传输的网络协议,就可使所发送的分组无差错按序到达终点,不丢失、不重复。
发送方 发送给 接收方 的所有分组都沿着同一条虚电路传送
- 虚电路表示这只是一条逻辑上的连接,分组都沿着这条逻辑连接按照存储转发方式传送,而并不是真正建立了一条物理连接。
- 请注意,电路交换的电话通信是先建立了一条真正的连接。
- 因此分组交换的虚连接和电路交换的连接只是类似,但并不完全一样
所以说为什么互联网不用这种虚电路的交换方式呢?
虚电路电信网提供的端到端可靠传输服务对电话业务无疑是很合适的,因为电信网的终端(电话机)非常简单,没有智能,无差错处理能力,电信网必须负责把用户电话机产生的话音信号可靠地传送到对方的电话机,使还原后的话音质量符合技术规范的要求。但计算机网络的端系统是有智能的计算机。计算机有很强的差错处理能力(这点和电话机有本质上的差别),因此,互联网在设计上就采用了和电信网完全不同的思路。
无连接的数据报服务
另一种观点:网络提供数据报服务
- 网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。
- 网络在发送分组时不需要先建立连接。每一个分组(即 IP 数据报)独立发送,与其前后的分组无关(不进行编号)。
- 网络层不提供服务质量(QoS)的承诺。即所传送的分组可能出错、丢失、重复和失序(不按序到达终点),当然也不保证分组传送的时限。
发送方 发送给 接收方 的分组可能沿着不同路径传送
尽最大努力交付
- 如果主机(即端系统)中的进程之间的通信需要是可靠的,那么就由网络的主机中的运输层负责可靠交付(包括差错处理、流量控制等) 。
- 采用这种设计思路的好处是:网络的造价大大降低,运行方式灵活,能够适应多种应用。
- 互连网能够发展到今日的规模,充分证明了当初采用这种设计思路的正确性。
将网络转发设备上的压力降低(路由器,交换机…),把纠错等等问题交给计算能力强的计算机
虚电路服务与数据报服务的对比
对比的方面 | 虚电路服务 | 数据报服务 |
---|---|---|
思路 | 可靠通信应当由网络来保证 | 可靠通信应当由用户主机来保证 |
连接的建立 | 必须有 | 不需要 |
终点地址 | 仅在连接建立阶段使用,每个分组使用短的虚电路号 | 每个分组都有终点的完整地址 |
分组的转发 | 属于同一条虚电路的分组均按照同一路由进行转发 | 每个分组独立选择路由进行转发 |
当结点出故障时 | 所有通过出故障的结点的虚电路均不能工作 | 出故障的结点可能会丢失分组,一些路由可能会发生变化 |
分组的顺序 | 总是按发送顺序到达终点 | 到达终点时不一定按发送顺序 |
端到端的差错处理和流量控制 | 可以由网络负责,也可以由用户主机负责 | 由用户主机负责 |
IP地址
IP地址属于网络层的范畴,不属于数据链路层的范畴
为什么会出现IP的概念
简单说:全世界各种各样的以太局域网,设备不统一,协议不统一。没有一种单一的网络能够适应所有用户的需求。而这些局域网又有接入互联网的需求,势必需要一个统一的概念。
从一般的概念来讲,将网络互相连接起来要使用一些中间设备。根据中间设备所在的层次,可以将中间设备分为以下四种。
(1)物理层使用的中间设备叫作转发器(Repeater)或集线器(Hub)。
(2)数据链路层使用的中间设备叫作网桥或桥接器(Bridge)或交换机(Switch)。
(3)网络层使用的中间设备叫作路由器(Router)。
(4)在网络层以上使用的中间设备叫作网关(Gateway),用网关连接两个不兼容的系统需要在高层进行协议的转换。
当中间设备是转发器或网桥时,互连仅仅是把一个网络扩大了,从网络层的角度看,这仍然是一个网络,因此一般并不称之为网络互连。因此提出了IP的概念,于参加互连的计算机网络都使用相同的IP,因此可以把互连以后的计算机网络看成一个虚拟互连网络。所谓虚拟互连网络也就是逻辑互连网络,它的意思就是互连起来的各种物理网络的异构性是客观存在的,但是我们利用IP可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络。
TCP/IP体系在网络互连上采用的做法是在网络层(即IP层)使用标准化协议,但相互连接的网络可以是异构的。网络层及以下是IP负责转发数据,网络层以上TCP保证可靠传输
从网络体系结构看IP地址与MAC地址
每一层都看不懂上一层给他的东西是什么,但是这不重要,只需要加上对应的这一层的帧首尾就可以了。
IP地址与MAC物理地址的关系
从层次的角度看,物理地址是数据链路层或物理网络使用的地址,而IP地址是网络层及以上各层使用的地址,是一种逻辑地址(称IP地址是逻辑地址是因为IP地址是用软件实现的)。
以局域网为例来说明IP地址与物理地址的关系。在发送数据时,数据从高层传递到低层,然后才到通信链路上传输。使用IP地址的IP数据报一旦被交给了数据链路层,就被封装成MAC帧。
MAC帧在传送时使用的源地址和目的地址都是物理地址,这两个物理地址都写在MAC帧的首部中。连接在通信链路上的设备(主机或路由器)在接收MAC帧时,其根据是MAC帧首部中的物理地址进行转发等等操作。在数据链路层看不见隐藏在MAC帧的数据中的IP地址。只有在剥去MAC帧的首部和尾部,把MAC层的数据上交给网络层后,网络层才能在IP数据报的首部中找到源IP地址和目的IP地址。
总之, IP地址放在IP数据报的首部,而物理地址则放在MAC帧的首部。 在网络层和网络层以上使用的是IP地址,而数据链路层使用的是物理地址。在图中,在IP数据报被放入数据链路层的MAC帧中以后,整个IP数据报就成为MAC帧的数据,因而在数据链路层看不见数据报的IP地址。(每一层只能看见本层相关的地址内容)
数据包转发过程中IP地址与MAC地址的变化情况
图上各主机和路由器各接口的IP地址和MAC地址用简单的标识符来表示
注意,主机中有完整的网络体系结构,而路由器仅有到网络层的结构
重点:
在传输过程中:
源IP地址和目的IP地址保持不变;
源MAC地址和目的MAC地址逐个链路(或逐个网络)改变。
看个例题:MAC地址在转发过程中的变化情况
这里我们可以看到,IP是恒定不变的。但是MAC是随着下一跳的目的地址不断变化的,假如一个路由器连了多个节点,下一跳转发给哪个MAC这个怎么确定?
如何从IP地址找出其对应的MAC地址?
引出ARP协议
ARP协议
如何从IP地址找出其对应的MAC地址(数据链路层)?
通过ARP(地址解析协议 Address Resolution Protocol)
ARP生成的流程
主机B要向本局域网上的某个主机C发送IP数据报时,会先在其ARP高速缓存中查看有无主机C的IP地址。如有,主机B就在ARP高速缓存中查出其对应的物理地址,再把这个物理地址写入MAC帧,然后通过局域网把该MAC帧发往此物理地址。
主机B也有可能查不到主机C的IP地址。原因可能是主机B才入网,也可能是主机B刚刚加电,其高速缓存还是空的。在这种情况下,主机B就自动运行ARP,然后按以下步骤找出主机B的物理地址。
ARP高速缓存表的生成过程
当主机B要给主机C发送数据包时,会首先在自己的ARP高速缓存表中查找主机C的IP地址所对应的MAC地址,但未找到,此时,主机B需要发送ARP请求报文,来获取主机C的MAC地址。
主机B需要发送ARP请求报文,发送广播帧来获取主机C的MAC地址
C发现是询问自己IP地址ARP广播帧,于是对广播帧做出响应,同时,C也会对B的地址(IP,MAC地址映射)进行记录,以便后续可能会用到。都会记录彼此的地址。
Q:为什么C要记录B的地址
A:当主机B向C发送数据报时,很可能以后不久主机C还要向B发送数据报(比如响应数据),因而主机C也可能要向B发送ARP请求分组。为了减少网络上的通信量,主机B在发送其ARP请求分组时,就把自己的IP地址到物理地址的映射写入ARP请求分组。主机C收到B的ARP请求分组时,就把主机B的这一地址映射写入自己的ARP高速缓存。以后主机C向B发送数据报时就很方便了。
收到ARP请求报文的主机A和主机C会把ARP请求报文交给上层的ARP进程
主机A发现所询问的IP地址不是自己的IP地址,因此不用理会
主机C的发现所询问的IP地址是自己的IP地址,需要进行响应
C回复ARP响应报文(单播帧)
这样就代表了,B的ARP表存好了C的MAC地址,二者就可以开始发送数据了
但是,ARP表并不是一成不变的,比如连入设备改变,网卡坏了等等导致的MAC地址更新等等。
因此,ARP高速缓存中的每一个地址映射项目都设置有生存时间(如10~20min)。超过生存时间的项目会被从高速缓存中删除掉。
ARP协议的使用条件
ARP协议只能在一段链路或者一个局域网上使用,不能跨局域网使用。原因就是路由器会隔离广播域,广播域都隔离了,ARP广播帧自然就发不过去了
从IP地址到物理地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上的另一个已知IP地址的主机或路由器通信,ARP就会自动地把这个IP地址解析为链路层所需要的物理地址。
Q:既然在网络链路上传送的帧最终是按照物理地址找到目的主机的,那么为什么我们不直接使用物理地址进行通信,而是要使用逻辑的IP地址并调用ARP来寻找出相应的物理地址呢?
A:全世界存在着各式各样的网络,它们使用不同形式的物理地址。要使这些异构网络能够互相通信就必须进行非常复杂的物理地址转换工作,由用户或用户主机来完成这项工作几乎是不可能的。统一的IP地址把这个复杂问题解决了。
所以这也就是,网络层以及IP出现的意义。为了连接不同架构的异构网络,以及解决不同形式的物理地址连接问题。
总结
IPV4
IP地址及编址方式
点分十进制就是二进制的IPV4地址转化十进制的IPV4地址
分类编制时期的IPv4地址(已淘汰)
IPV4之所以说是32位的
就是因为网络号+主机号 一共是32位
通过不同的格式分为 A、B、C、D(多播地址)、E(保留地址) 五种不同种类的网络
其中,A、B、C 类网络最为常用
- 每一类地址都由两个固定长度的字段组成,其中一个字段是网络号 net-id,它标志主机(或路由器)所连接到的网络,而另一个字段则是主机号 host-id,它标志该主机(或路由器)。
- 主机号在它前面的网络号所指明的网络范围内必须是唯一的。
- 由此可见,一个 IP 地址在整个互联网范围内是唯一的。
- 一个主机号的IP下可以给多个子网的主机进行分配全球唯一的IPV4地址(相同的网络号下,利用不同主机号区分)
A类地址
B类地址
C类地址
例子
IPV4地址分类总结
IP 地址的指派范围
一般不使用的特殊的 IP 地址
IP 地址的一些重要特点
(1) IP 地址是一种分等级的地址结构。分两个等级的好处是:
- 第一,IP 地址管理机构在分配 IP 地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便了 IP 地址的管理。
- 第二,路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间。
(2) 实际上 IP 地址是标志一个主机(或路由器)和一条链路的接口。
- 当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的 IP 地址,其网络号 net-id 必须是不同的。这种主机称为多归属主机 (multihomed host)。
- 由于一个路由器至少应当连接到两个网络(这样它才能将 IP 数据报从一个网络转发到另一个网络),因此一个路由器至少应当有两个不同的 IP 地址。
(3) 用转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有同样的网络号 net-id。
(4) 所有分配到网络号 net-id 的网络,无论是范围很小的局域网,还是可能覆盖很大地理范围的广域网,都是平等的。
划分子网的IPV4地址
首先说说为什么IPV4需要来划分子网
在 ARPANET 的早期,IP 地址的设计确实不够合理:
- IP 地址空间的利用率有时很低。
- 给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。
- 两级的 IP 地址不够灵活。
如果想要将原来的网络划分成三个独立的网路
所以是否可以从主机号部分借用一部分作为子网号
将某一个部分用来专门划分标记为子网
但是如果未在图中标记子网号部分,那么我们和计算机又如何知道分类地址中主机号有多少比特被用作子网号了呢?
所以就有了划分子网的工具:子网掩码
- 从 1985 年起在 IP 地址中又增加了一个“子网号字段”,使两级的 IP 地址变成为三级的 IP 地址。
- 这种做法叫做划分子网 (subnetting) 。
- 划分子网已成为互联网的正式标准协议。
引出子网掩码,子网掩码是通过当前网卡的IPV4地址计算出来的
子网掩码划分的思路
基本思路
-
划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络。对外全部都是IPV4地址
-
从主机号借用若干个位作为子网号 subnet-id,而主机号 host-id 也就相应减少了若干个位。
-
凡是从其他网络发送给本单位某个主机的 IP 数据报,仍然是根据 IP 数据报的目的网络号 net-id,先找到连接在本单位网络上的路由器。
-
然后此路由器在收到 IP 数据报后,再按目的网络号 net-id 和子网号 subnet-id 找到目的子网。
-
最后就将 IP 数据报直接交付目的主机。
划分为三个子网后对外仍是一个网络
- 优点
- 减少了分类编制时期 IP 地址的大量浪费(固定分配子网个数就会浪费一部分)
- 使网络的组织更加灵活
- 更便于维护和管理
- 划分子网纯属一个单位内部的事情,对外部网络透明,对外仍然表现为没有划分子网的一个网络IP。
子网掩码
(IP 地址) 与运算 (子网掩码) = 网络地址
重要,下面很多相关知识都会用到
举例来看子网掩码到底是怎么划分的,以C类网络为例,A、B类网络酌情调整网络号占位
再详细一点的例子,还是以C类网络为例,这次给网络号分配的子网号是两个比特位
默认子网掩码
如果划分了子网掩码就不用这个默认的子网掩码了
总结
- 子网掩码是一个网络或一个子网的重要属性。
- 路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。
- 路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。
- 若一个路由器连接在两个子网上,就拥有两个网络地址和两个子网掩码。
无分类编址的IPv4地址
为什么使用无分类编址
无分类域间路由选择 CIDR (Classless Inter-Domain Routing)。
说白了,就是即便是 用 网络号+子网号+主机号这种模式,仍然会有一部分IP会被主机号给挤占,造成本就不多的IPV4地址浪费掉,那么索性,将主机号从地址空间拿出来(用CIDR子网掩码的方式再从外部对其进行具体的划分),让渡一部分IP空间出来 (网络号的可分配空间更多了),减少地址的浪费
CIDR 最主要的特点
- CIDR使用不定长的“网络前缀”,来代替分类地址中固定长度的网络号和子网号。
- IP 地址从三级编址(使用子网掩码)又回到了两级编址。
CIDR把32位的IP地址划分为两个部分。前面的部分是不定长的“网络前缀”或简称为“前缀”),代替分类编址中的“网络号”来指明网络,后面的部分则用来指明主机。因此CIDR使IP地址从三级编址(划分子网)又回到了两级编址,但这已是无网络分类的两级编址。它的记法是:
请注意,虽然无分类编址的IP地址形式上与分类编址的两级结构好像一样,但这里的网络前缀是不定长的。有子网掩码来控制网络前缀的长度
子网掩码有几位是1,就代表了网络前缀(相当于网络号)有几位是被锁死不能修改,剩下的位数用来作主机号。也就是分配子网IP
如何使用CIDR地址
例子:
再来个例子:
路由聚合
路由表的每一行对应一个网络,随着互联网迅速发展,越来越多的网络连接到互联网,路由表的表项将会越来越多,路由器查找路由表的时间也会越来越长。采用路由聚合(Route Aggregation)可有效缓解这个问题。路由聚合又称为地址聚合,简单来说,就是通过把下一跳是同一台路由的地址List都抽出来,看他们的前缀地址是否可以抽一部分共通出来,记作一个共通的CIDR地址,这样后续的IP地址发现自己网络号可以和聚合地址匹配上,就会走这条路由。
可以理解为:目的地址都位于同一个省,那么其同省的前缀就可以抽出来,送到同省的站点,再继续在省内,进行转送省内快递,精确到具体地址
而这几个网络的地址空间正好可以合并成一个CIDR地址块,因此在路由表中完全可以用一个网络前缀172.1.4.0/22这样的CIDR地址来指示这四个网络的路由。
利用路由聚合可以大大减少路由表的表项。靠近互联网边缘的路由器使用较长的网络前缀(更长,更精确)转发数据报,而靠近互联网核心的路由器使用较短(更短,但核心路由器需要减少路由条数)的网络前缀转发数据报。
在1994年和1995年,由于未使用CIDR,互联网核心路由器的一个路由表就会超过7万项,而使用CIDR后,在1996年,核心路由器的路由表项目减少为3万多个。
路由聚合过程中的最长前缀匹配
在使用CIDR时,由于采用了路由聚合,路由表中可能存在多个有包含关系的地址块前缀,这时在查找路由表时可能会得到不止一个匹配结果。
这就带来一个问题:我们应当从这些匹配结果中选择哪一条路由呢?
正确的答案是,应当从匹配结果中选择具有最长网络前缀的路由。这叫作最长前缀匹配(Longest-Prefix Matching)。这是因为网络前缀越长,其地址块就越小,因而路由就越具体。最长前缀匹配又称为最长匹配或最佳匹配。
采用最长前缀匹配,默认路由可以用网络前缀0.0.0.0/0来表示,因为该网络前缀的长度为0,任何IP地址都能和它匹配,前提是路由表中没有任何其他项目可以匹配。(兜底路由)
但最长前缀匹配算法也有一个缺点,就是查找路由表花费的时间变长了,因为要遍历整个路由表才能找到最长匹配的前缀项。人们一直都在积极研究提高路由表查找速度的算法,并已提出了很多性能较好的算法。
最大主机个数例题:
路由聚合地址计算:
IPv4地址下子网的分配(地址规划)
所谓地址规划,就是:给定一个IPv4地址快,如何将其划分成几个更小的地址块,并将这些地址块分配给互联网中不同网络,进而可以给各网络中的主机和路由器接口分配IPv4地址
一般由两种方法:
- 定长的子网掩码FLSM
- 变长的子网掩码VLSM
定长的子网掩码FLSM(Fixed Length Subnet Mask)
看看某个网络中需要申请的网线数量
通过上面步骤分析,就可以从子网1~8中任选5个分配给左图中的N1 ~ N5
采用定长的子网掩码划分,只能划分出2^n个子网,其中n是从主机号部分借用的用来作为子网号的比特数量,每个子网所分配的IP地址数量相同
但是也因为每个子网所分配的IP地址数量相同,不够灵活,容易造成IP地址的浪费
变长的子网掩码VLSM(Variable Length Subnet Mask)
优先给大的块进行分配,按需划分子网
IPv4数据报的首部格式
各字段的作用
版本号,一般通用的为IPV4
- 一个 IP 数据报由首部和数据两部分组成。
- 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。
- 在首部的固定部分的后面是一些可选字段,其长度是可变的。
基础字段
图中的每一行都由32个比特(也就是4个字节)构成,每个小格子称为字段或者域,每个字段或某些字段的组合用来表达IP协议的相关功能
IP数据报的首部长度一定是4字节的整数倍
因为首部中的可选字段的长度从1个字节到40个字节不等,那么,当20字节的固定部分加上1到40个字节长度不等的可变部分,会造成首部长度不是4字节整数倍时,就用取值为全0的填充字段填充相应个字节,以确保IP数据报的首部长度是4字节的整数倍
IPv4数据报分片相关字段
所谓IPV4数据报片偏移,就是分片前的整个数据报(固定首部+数据字段)超过了当前以太网MAC帧的最大传送单元MTU的上限,也就是1500。就会导致MAC帧无法传输。所以要进行切片处理,切片的位置,就会有片偏移的问题。
有三个字段是专门用于标记IP数据报文分片的:标识、标志、片偏移
以当前这个数据报为例:长度是固定的20+数据载荷3800
超过了当前以太网MAC帧的最大传送单元MTU的上限,也就是1500
所以要进行切片处理
注意,这里0~1399一共长是1400,从0开始算的,因为对数据部分切片了,所以每一个切开的帧都需要重新加入首部。
现在假定分片2的IP数据报经过某个网络时还需要进行分片(一个分片数据报被二次分片了)
分片的流程
主要是为分片的数据上添加编号
每一片的长度都是固定部分+携带数据部分,通过每一片的编号来进行区分。
其中MF表示是否后面有分片数据报,0表示后面没有分片数据报(当前就是最后的数据报),1标示后面有分片数据报。
其中DF表示是否允许被分片,0标示允许被分片,1表示不可以被分片
片偏移:切割的数据报起点 / 以xx字节为单位进行整除计算片偏移
例子:1400 / 8 : 切割的数据报起点为1400 / 以8个字节为单位进行整除计算片偏移
注意:IP数据报在传送中可能被多次分片,但分片的数据报仅在目的主机才被重装为原来的数据报。
生存时间TTL
主要是怕因为某些错误的配置,导致IP数据报在网络中一直兜圈子
每次IP数据报在经过一次路由器的时候其TTL就会被减一,当减少到0的时候,路由器就会将该IP数据报丢弃
注意:局域网IP数据报的TTL设为1,只跳一次
协议字段
不同的值代表着不同的协议
首部检验和
例题:
总结
ICMP(网际控制报文协议)
为了更有效地转发IP数据报和提高交付成功率,网际层使用了互联网控制报文协议(Internet Control Message Protocol,ICMP)(也翻译为网际控制报文协议)。
说白了就是发送发生错误之后之后的补救措施,或者是确认数据的发送正确,比如:
- 确认IP包是否成功送达目标地址
- 通知在发送过程当中IP数据报被废弃的具体原因
- 改善网络设置等
ICMP报文作为IP数据报的数据部分,加上数据报的首部,组成IP数据报发送出去。因此ICMP本身也是一种IP数据报。
有了这些功能以后,就可以获得网络是否正常,设置是否有误以及设备有何异常等信息,从而便于进行网络上的问题诊断
总结:
ICMP报文的格式
ICMP 不是高层协议(看起来好像是高层协议,因为 ICMP 报文是装在 IP 数据报中,作为其中的数据部分),而是网络层IP的协议
ICMP 报文的格式
在类型字段上,可以区分的常见报文类型
差错报告报文
ICMP差错报告报文有如下五种:
- 终点不可达
- 源点抑制
- 时间超过
- 参数问题
- 改变路由(路由重定向)
终点不可达
当IP数据报发往目标地点的过程中发生了障碍,无法抵达目标点,路由器或主机不能交付数据报时,就向源点发送终点不可达报文。
源点抑制
在发送的过程中,途经点某个路由或者主机发生了拥塞,相当于缓存爆掉了,接不住数据报了,无奈只能进行丢弃操作。这种情况下就会发送差错报告报文,告知源点抑制。
时间超过
上面说过TTL就是IP数据报首部标记的超时时间,每次经过一次路由器就会 -1
,直到减一减到零,这个IP数据报就会被扔掉。这种情况下就会发送差错报告报文,告知IP数据报时间超过。
参数问题
发现IP数据报首部错误码部分被激活了(比如校验和计算出错),没啥好说的直接丢弃这种情况下就会发送差错报告报文,告知IP数据报参数问题,比如错误码。
改变路由(重定向)
路由在转发数据报的过程中发现有更短的路径,报告给发送方,下次走另外一边的路由,这就是重定向。
解释下重定向是怎么发现更优的路径的:
我们知道,互联网的主机中也要有一个路由表。主机要发送数据报时,首先查找自己的路由表,看应当从哪一个接口把数据报发送出去。
在互联网中,主机的数量远大于路由器的数量,出于效率考虑,这些主机不和连接在网络上的路由器定期交换路由信息。主机刚开始工作时,一般都会在路由表中设置一个默认路由器的IP地址。不管数据报要发送到哪个目的地址,一律先将数据报传送给网络上的这个默认路由器,而这个默认路由器知道到每一个目的网络的最佳路由(通过和其他路由器交换路由信息)。
如果默认路由器发现主机发往某个目的地址的数据报的最佳路由不应当经过默认路由器而应当经过网络上的另一个路由器R,默认路由器就用路由重定向报文把这个情况告诉主机。于是,该主机在其路由表中增加一项:到某某目的地址应经过路由器R(而不是默认路由器)。
Q:默认路由器是怎么知道有更优路径的?
A:内部网络由RIP协议或OSPF协议优化路径,外部网络由BGP协议优化路径。通过这两种协议来不断优化报文的转发路径
以上是发送差错报文的情况,还有一些特定情况是不需要发送差错报文的
不应发送ICMP差错报告报文情况
询问报文
询问报文分为两种:
- 分组网间探测 PING(Packet InterNet Groper)
- 跟踪路由(traceroute)
分组网间探测PING(Packet InterNet Groper)
就是那个Ping命令,发送数据报来测试响应时间以及连通性的
跟踪路由(traceroute)
traceroute命令的实现原理
原理就是通过TTL经过路由会减一的特性,当数据报TTL=0的时候就会发给发送方ICMP。每次发送当前IP数据报TTL+1 的数据报进行测试,直到IP数据报到达目的主机的地址,就会回复确认。通过这种不断测试的方式进行途径路由器的测试。(没到达之前会一直回复ICMP差错报告报文的超时)
询问报文目的主机不回复的情况
最后需要说明的是,为了防止网络设备被恶意用户探测或攻击,一些主机或路由器被设置为不接收或不响应ICMP回送请求报文,因此在互联网中在使用ping命令或tracert命令测试目的主机连通性时有可能会超时,但并不代表网络不通。
总结
IP数据报的发送和转发
路由表
我们知道路由器是根据路由表转发IP数据报的,一个IP路由表到底包含哪些主要的信息呢?
如图所示,有四个网络通过三个路由器连接在一起。每一个网络上都可能有成千上万个主机。可以想象,若按目的地址来制作路由表,就会有很多路由条数,会让路由器负载很大。但若按目的主机所在网络的地址来制作路由表,那么每一个路由器中的路由表就只包含4个项目(即只有4行,每一行对应于一个网络)。
当拿到某一个IP数据报后,就可以通过目的地址(CIDR),利用目的地址+子网掩码
与运算的方式,来计算出对应的目的网络地址,从而查表,进行下一跳的跳转。
路由表的每一条,记录信息如图有
目的网络地址、地址掩码、下一跳、接口
我们简化一下转发链路,不用关心某个网络内部的具体拓扑及有多少台计算机连接在该网络上,IP数据包转发与以太网分组转发问题并没有什么关系(到了目的网络的路由上,路由器自然会处理)。这样的简化图强调了在互联网上转发数据报时,是从一个路由器转发到下一个路由器。
由于路由器是根据路由表中的目的网络地址来确定下一跳路由器的,因此有以下结论。
(1)IP数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)。
(2)只有最后一个路由器才试图向目的主机进行直接交付。
默认路由
路由器还可采用默认路由(Default Route),以减少路由表所占用的空间和搜索路由表所用的时间。这种转发方式在一个网络只有很少的对外连接时是很有用的(例如,在互联网的ISP层次结构的边缘)。
在前面已经讲过,主机在发送每一个IP数据报时都要查找自己的路由表。如果一个主机连接的网络只有一个路由器和互联网连接,那么在这种情况下使用默认路由是非常合适的,直接省去了查表的流程。
比如图上H主机的路由表,只要目的网络不是N1和N2,就一律选择默认路由。如果是往互联网上交付数据,则先把数据报先间接交付路由器R1,让R1再转发给下一个路由器,一直转发到目的网络上的路由器,最后进行直接交付。实际上当我们在主机的网络连接属性中配置默认路由器时,就是在主机的路由表中增加了一条默认路由。
如果默认路由不配置,就会导致如果出现目的网络不在表上的时候,IP数据报会直接丢弃。
直接交付 or 间接交付
这里A与C之间,是在同一个网络之间,所以可以直接通信。这也叫做直接交付。如果A与D之间想要直接进行通信连接,那么就要通过路由器进行间接交付。
引出问题,源主机如何知道目的主机是否与自己在同一个网络中,是直接交付,还是间接交付?
A主机如何判断出D主机与自己不在一个网络中?
C主机与F主机进行数据交互,通过计算网络地址,来判断是否在同一个网络中
可以通过目的地址IP和源地址的子网掩码进行逻辑与运算得到目的网络地址
- 如果目的网络地址和源网络地址 相同,就是在同一个网络中,属于直接交付
- 如果目的网络地址和源网络地址 不相同,就不在同一个网络中,属于间接交付,传输给主机所在网络的默认网关(路由器——下图会讲解),跨网络就需要由默认网关帮忙转发
主机C如何知道路由器R的存在?
用户为了让本网络中的主机能和其他网络中的主机进行通信,就必须给其指定本网络的一个路由器的接口(已指定好的),由该路由器帮忙进行转发,所指定的路由器,也被称为默认网关
例如:路由器的接口0的IP地址192.168.0.128做为左边网络的默认网关
主机A会将该IP数据报传输给自己的默认网关,也就是图中所示的路由器接口0
路由器转发IP数据报的基本过程
(1)从收到的数据报首部提取目的IP地址。
(2)先判断是否为直接交付。对与路由器直接相连的网络逐个进行检查:用各网络的掩码和D逐位相“与”,看结果是否和相应的网络地址匹配。
若匹配,则把分组直接交付(当然还需要把IP地址转换成物理地址,把数据报封装成帧发送出去),转发任务结束;否则间接交付,执行(3)。
(3)对路由表中的每一行(目的网络地址,掩码,下一跳,接口),用其中的掩码和D逐位相“与”,其结果为N。若N与该行的网络地址匹配,则把数据报传送给该行指明的下一跳路由器;否则执行(4)。
(4)若路由表中有一条默认路由,则把数据报传送给路由表中所指明的默认路由器;否则执行(5)。
(5)报告转发数据报出错。(如ICMP路由重定向报文)
Q:IP数据报的首部中没有地方可以用来指明“下一跳路由器的IP地址”。在IP数据报的首部写上的IP地址是源IP地址和目的IP地址,而没有中间经过的路由器的IP地址。既然IP数据报中没有下一跳路由器的IP地址,那么待转发的数据报又怎样找到下一跳路由器呢?
A:当路由器收到一个待转发的数据报时,在从路由表得出下一跳路由器的IP地址后,不是把这个地址填入IP数据报,而是送交下层的网络接口软件。网络接口软件负责把下一跳路由器的IP地址转换成物理地址(使用ARP),并将此物理地址放在链路层的MAC帧的首部(包装成MAC帧),然后根据这个物理地址找到下一跳路由器。由此可见,当发送一连串的数据报时,上述的这种查找路由表、计算物理地址、写入MAC帧的首部等过程,将不断地重复进行,造成了一定的开销。但是没有办法,这是网络层为了实现异构网络互联而必须做的
路由选择协议
静态路由配置的缺点
综上所述,人工配置静态路由性价比很低,面对大型的异构网络会比较无力,一旦链路上路由状态发生变更,需要人工手动调整,会非常不方便,因此就会有动态路由选择协议。
因特网作为全球最大的网络,其路由协议的选择有如下的特点:
路由选择协议为什么要分层?
互联网采用分层次的路由选择协议,主要有以下两个原因。
(1)互联网的规模非常大,现在就已经有几百万个路由器互连在一起。如果让所有的路由器知道所有的网络应怎样到达,则路由表将非常大,处理起来也太花时间。而所有这些路由器之间交换路由信息所需的带宽就会使互联网的通信链路饱和。
(2)许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议(这属于本部门内部的事情),但同时还希望连接到互联网上。为此,整个互联网被划分为许多较小的自治系统(Autonomous System,AS)。
在目前的互联网中,一个大的ISP就是一个自治系统。这样,互联网就把路由选择协议划分为两大类:内部网关协议(IGP),外部网关协议(EGP)
内部网关协议(IGP)
内部网关协议(Interior Gateway Protocol,IGP):在一个自治系统内部使用的路由选择协议,与互联网中的其他自治系统选用什么路由选择协议无关。目前这类路由选择协议很多,如RIP和OSPF等。
外部网关协议(EGP)
外部网关协议(External Gateway Protocol,EGP):若源主机和目的主机处在不同的自治系统中(这两个自治系统可能使用不同的内部网关协议),就需要在自治系统之间进行路由选择,使用一种协议将路由信息从一个自治系统传递到另一个自治系统中,这样的协议就是外部网关协议。目前互联网使用的外部网关协议就是BGP的版本4(BGP-4)。
网关协议也可称为路由选择协议
常见的路由选择协议
路由信息协议(内部网关协议)
RIP协议
基本原理就是通过IP数据报的跳数,来衡量到达目的网络的距离。
RIP协议认为,越短的路线越是好路由,无论带宽多与少。如果目的地相同,且经过的路由跳数相同的情况下,该路由也会被记录,作为等价负载均衡。
RIP的基本工作过程
刚开始工作的时候,路由器只知道自己身边的路由器并与之交换路由表,就是这样一个又一个的迭代传递,完成了整个路由表之间的信息传递,最终整个网络的每一个路由节点都互相知道了自己与每一个路由的距离(跳数)。
注意,当路由表发生更新时,立即向所有相邻路由器发送更新报文(即触发更新)
RIP的路由条目的更新规则
举例:C路由向D路由发送自己的更新报文(周期性广播 or C路由表发生了变化)。总之,路由器C把自己的路由表发给了路由器D
路由器C的表到达各目的网络的下一跳都记为问号,可以理解为路由器D并不需要关心路由器C的这些内容
假设路由器C的RIP更新报文发送周期到了,则路由器C将自己路由表中的相关路由信息封装到RIP更新报文中发送给路由器D,D拿到更新报文后,会对距离先进行+1操作,再对自己的路由表进行比较
路由器C能到达这些网络,说明路由器C的相邻路由器也能到达,只是比路由器C的距离大1,于是根据改造后的距离进行对比,路由器D根据实际情况来更新自己的路由表
路由器更新路由表的根据是什么呢?
到达目的网络,不同的下一跳,新路由有优势,就应该更新
路由器不更新路由表的根据是什么呢?
到达目的网络,不同下一跳,新路由劣势,不更新
路由器追加新路由表等价负载均衡的根据是什么呢?
相同目的网络,不同的下一跳,但是相同的跳数,追加一条路由做等价负载均衡
因此,从上述的更新策略就可以判断出来,通过不断与相邻路由器交换路由信息并更新路由表,最终每一个路由器到每一个目的网络的路由都是最短的(即跳数最少)。
例题
RIP协议存在“坏消息传播得慢”的问题
IP有一个特点,就是当一个路由器发现了更短的路由时,这种更新信息传播得很快,但是当网络出现故障时,要经过比较长的时间才能将此信息传送到所有的路由器。
N1是R2曾经保留的路由条目
R2发出的路由条目,意思是经过2个单位距离(路过R1传播到达R2,此时R2还不知道N1到R1的线路故障)可以连接到N1,但R1这边知道自己连不上,被R2的信息误导,以为自己借用R2可以连上N1。
这种两个路由器互相以为通过对方可以连上的错误信息一直反复发送。直到下一跳的距离大于15,认为N1不可达之后,才会放弃。
解决方法
但是,这些方法也不能完全解决“坏消息传播得慢”的问题,这是距离向量的本质决定
例题:
注意,这里有个前提就是“坏消息传的慢”,所以R1接收R3的故障消息要比R2的慢。所以R2接到故障通知要比R1要早,因为R2更近
总结
RIP 协议的优缺点
优点:
- 实现简单,开销较小。
缺点:
RIP 限制了网络的规模,它能使用的最大距离为 15(16 表示不可达)。
路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。
“坏消息传播得慢”,使更新过程的收敛时间过长。
开放最短路径优先 OSPF (Open Shortest Path First)协议
OSPF一定程度上就是为了解决RIP协议的一些问题的
注意:OSPF 只是一个协议的名字,它并不表示其他的路由选择协议不是“最短路径优先”。
问候(Hello)分组
IP数据报首部中协议号字段的取值应为89,来表明IP数据报的数据载荷为OSPF分组
发送链路状态通告LSA
洪泛法有点类似于广播,就是从一个接口进来,从其他剩余所有接口出去
链路状态数据库同步
根据LSD的数据库进行计算,利用Dijkstra的最短路径算法来计算
使用SPF算法计算出各自路由器到达其他路由器的最短路径
OSPF五种分组类型
OSPF分组不用UDP而是直接用IP数据报传送(其IP数据报首部的协议字段值为89)。OSPF构成的IP数据报很短。这样做可减少路由信息的流量。数据报很短的另一好处是不必将长的数据报分片传送。分片传送的数据报只要丢失一个数据报片,就无法组装成原来的数据报,导致整个数据报必须重传。
OSPF的基本工作过程
OSPF在多点接入网络中路由器邻居关系建立
如果不采用其他机制,将会产生大量的多播分组
若DR出现问题,则由BDR顶替DR
为了使OSPF能够用于规模很大的网络,OSPF把一个自治系统再划分为若干个更小的范围,叫做区域(Area)
-
在该自治系统内,所有路由器都使用OSPF协议,OSPF将该自治系统再划分成4个更小的区域
-
每个区域都有一个32比特的区域标识符
-
主干区域的区域标识符必须为0,主干区域用于连通其他区域
-
其他区域的区域标识符不能为0且不相同
-
每个区域一般不应包含路由器超过200个
-
划分区域的好处就是,利用洪泛法交换链路状态信息局限于每一个区域而不是自治系统,这样减少整个网络上的通信量,同时可以避免泛洪导致的整个自治系统出现的广播风暴
总结
边界网关协议BGP
Q:为什么要用BGP,用内部网关协议RIP或者OSPF不行吗?
A:(1)互联网的规模太大,使AS之间路由选择非常困难。
(2)AS之间的路由选择必须考虑经过网络的路由性能,不同网络之间,路由的性能差异非常大,根据最短距离(即最少跳数)找出来的路径可能并不合适,并且有的路径使用代价很高或很不安全。要考虑的东西就比较多,而内部网关协议是不会考虑这些复杂的问题的。
(3)还有一种情况,如AS1要发送数据报给AS2,本来最好是经过AS3,但AS3不愿意让这些数据报通过自己的网络,因为“这是他们的事情,和我们没有关系”。但是,AS3愿意让某些相邻AS的数据报通过自己的网络,特别是那些付了服务费的AS。
综上所述,BGP只是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由,重要的是能根据策略进行路由选择。
BGP(Border Gateway Protocol) 是不同自治系统的路由器之间交换路由信息的协议
外部路由在途径的时候,要考虑的东西还是比较多的。所以BGP就是为了寻找能到达目的地的路由链路,要保证可达性而不是最佳性
BGP用于自治系统对外的路由,两个对外路由(各AS的BGP路由)之间用的是TCP实现可靠连接
因为BGP路由只与BGP路由以及AS系统内的主机进行交流,因此 BGP交换路由信息的结点数量级是自治系统数的量级,远小于整个互联网的网络数。 因此要在许多自治系统之间寻找一条较好的路径不会耗费太多的时间。
工作过程
BGP四种报文
BGP支持CIDR & 解决IGP的坏消息传的慢问题
BGP支持CIDR(当然,BGP协议也支持路由聚合),BGP中的路由聚合通常是针对一个AS自治系统内部的网络号进行的。也就是可以简单理解为,BGP的网络号为其对应的以太网共通网络前缀(聚合地址)
交换的路由信息包括目的网络前缀、下一跳路由器(AS边界路由器),以及到达该目的网络所要经过的各个自治系统序列。由于使用了路径向量的信息,很容易避免产生兜圈子的路由。如果一个BGP发言人收到了其他BGP发言人发来的路径通知,它就要检查一下本自治系统是否在此通知的路径中。如果在这条路径中,就不能采用这条路径(因为会兜圈子)。因此BGP很容易解决距离向量路由选择算法中的“坏消息传播得慢”这一问题。
总结
封装不同路由选择协议报文的协议
RIP报文是利用UDP封装传输的
OSPF报文是用IP封装传输的
BGP协议是用TCP封装传输的
路由器工作原理
路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。
路由器的构成
整个路由器可划分为两大部分:路由选择部分(控制平面)和分组转发部分(数据平面)
控制平面:控制报文该从哪个路由接口输出出去,维护路由表等等
数据平面:根据路由表进行报文转发
从左到右依次介绍:
输入端口
请注意,“转发”和“路由选择”是有区别的。在互联网中,“转发”就是路由器根据转发表把收到的IP数据报从路由器合适的端口发出去。“转发”仅涉及一个路由器。“路由选择”则涉及很多路由器,因为路由表是许多路由器协同工作的结果。这些路由器按照复杂的路由选择算法,得出整个网络的拓扑变化情况,因而能够动态地改变所选择的路由,并由此构造出整个路由表。
路由器的输入端口和输出端口部分都各有三个方框,分别代表物理层、数据链路层和网络层的处理模块。
物理层进行比特的接收。数据链路层则按照链路层协议接收传送分组的帧。在把帧的首部和尾部剥去后,分组就被送入网络层的处理模块。
网络层处理模块收到IP数据报进行分析:
若分组的接收者是路由器自己,则将其交给相应的上层协议去处理(直接交付)
当这些分组是路由器之间交换路由信息的分组(如RIP分组或OSPF分组等)时,则把这种分组送交路>由器的路由选择部分中的路由选择处理机。(路由信息分组)
若非以上的两种分组,则为普通报文,网络层处理模块按照分组首部中的目的地址查找转发表,根据得出的结果,分组经过交换结构到达合适的输出端口。(间接交付)
为了使交换功能分散化,往往把复制的转发表放在每一个输入端口中,不必每次占用总线来查主表
这些副本常称为“影子副本(Shadow Copy)”。分散化交换可以避免在路由器中的某一点上出现瓶颈。
当一个分组正在查找转发表,等待转发时,从这个输入端口又收到另一个分组,后到的分组就必须排队等待,因而会产生一定的时延。
这个时延,也就是之前在概述章节所讲过的四种时延中的:排队时延
交换结构
交换结构(Switching Fabric)又称为交换组织,是路由器的关键构件,它将某个输入端口进入的分组根据查表的结果从一个合适的输出端口转发出去。
交换结构的速率对于路由器的性能是至关重要的。如果交换结构的速率跟不上输入端口分组的到达速率,分组会因为等待交换而在输入队列中排队,从而导致排队时延持续变高。
最早使用的路由器就是普通的计算机,用计算机的CPU作为路由器的路由选择处理机。路由器的输入端口和输出端口的功能和普通计算机的I/O设备一样,这时的路由器实际上就是一台安装了多个网络接口卡的计算机。由于其未对分组交换做出特殊优化,因此所有的转发操作,路由选择处理机从分组首部提取目的地址,查找路由表,再将分组复制到合适的输出端口的缓存中。采用这种方式分组要两次经过系统的总线(一次写和一次读)。性能还是很低的。
现代常见路由器交换结构如下:
(a)表示分组通过存储器进行交换,与早期的路由器的区别就是目的地址的查找和分组在存储器中的缓存都是在输入端口中进行的。
(b)是通过总线交换的示意图。采用这种方式时,分组从输入端口通过共享的总线直接传送到合适的输出端口,而不需要路由选择处理机的干预。但是,由于总线是共享的,因此在同一时间只能有一个分组在总线上传送。当分组到达输入端口时,若总线忙(总线正在传送另一个分组),则分组不能通过交换结构,要在输入端口排队等待。
(c)所示的是通过纵横交换结构(Crossbar Switch Fabric)进行交换。它有2N条纵横交叉的总线,可以使N个输入端口和N个输出端口相连接。通过控制相应的交叉结点,可使水平总线和垂直总线接通或断开,将分组转发到合适的输出端口。输入端口收到一个分组时,就将它发送到与该输入端口相连的水平总线上。若目标输出端口的垂直总线空闲,则在这个交叉结点将垂直总线与水平总线接通,然后将该分组转发到该输出端口。但若该垂直总线已被占用(有另一个分组正在转发到同一个输出端口),则后到达的分组必须在输入端口排队(不会把分组放出来到总线上)。
输出端口
输出端口从交换结构接收分组,然后把它们发送到路由器外面的线路上。网络层的处理模块中设有一个缓冲区,实际上它就是一个队列。当交换结构传送过来的分组的速率超过输出链路的发送速率时,来不及发送的分组就必须暂时存放在这个队列中。数据链路层处理模块把分组加上链路层的首部和尾部,交给物理层发送到外部线路。
一旦分组处理的速率赶不上分组进入队列的速率,到了后面就会造成队列溢出,再进入队列的分组由于没有存储空间而只能被丢弃。
路由器与交换机的比较
二层交换机和三层路由器,为什么前面会加一个xx层 ?
就是因为其工作的位置位于不同的层级上,三层路由器工作在网络层,利用网络层地址转发分组的路由器;二层交换机工作在数据链路层,利用MAC地址转发分组的交换机。
二层交换机的优缺点
交换机(这里指的是二层交换机)的最大优点是即插即用,并具有相对高的分组过滤和转发速度。
即插即用是因为主机完全感觉不到交换机的存在(即对主机“透明”),无须进行特殊配置就可用它组网,会利用arp协议自动进行学习。
转发速度快是因为交换机只需处理通过第二层传送上来的分组,而路由器还必须处理通过第三层传送上来的帧。
但交换机的缺点也是非常明显的:由于MAC地址是平坦的,一个大型交换机网络要求交换机维护大的MAC地址表,也将要求在主机中维护大的ARP表,MAC地址的自学习过程和ARP会产生和处理大量广播。而交换机对广播风暴不提供任何保护措施,如果一台主机失去控制不断发送大量的以太网广播帧,交换机将会转发所有这些帧,导致整个以太网崩溃(因此出现的三层交换机就一定程度上解决了这个问题,可以用VLAN划分广播域)。另外,交换机网络的逻辑拓扑结构被限制为一棵生成树,防止报文不停兜圈子,即使在物理上存在冗余链路,也不可能为每对主机提供最佳路径。
三层路由器的优缺点
路由器的优缺点正好与交换机相反。其优点是能提供更加智能的路由选择,并能隔离广播域。
在路由器互连的网络中,网络拓扑不再被限制为一棵生成树,并且可以通过路由选择协议为源和目的之间在多条冗余路径中选择一条最佳的路径(路由下一跳)。
由于路由器的网络寻址是层次的(不像MAC寻址那样是平面的),因此无须在路由表中维护所有主机的信息。路由器不会无目的地转发广播分组,因此能为第二层的广播风暴提供隔离保护功能。与交换机相比,路由器的缺点之一就是路由器不是即插即用的。网络管理员要为路由器的每个接口小心地配置IP地址,用户需要在他们的主机中配置默认路由器的IP地址。另外,路由器对每个分组的处理时间通常比交换机更长,因为要进行从第一层到第三层的各种处理( 层层剥开,再重新封装帧 ),包括比较复杂的最长前缀匹配,以及将IP数据报从一个数据链路层帧中取出再放入另一个数据链路层帧这些烦琐的处理。
如何选择?
既然交换机和路由器各有优缺点,那么什么时候应该用交换机、什么时候应该用路由器呢?包含几百台主机的小网络用交换机就足够了,因为它们不需要任何IP地址的配置就可以连接这些主机,并提供高性能的数据交换。包含几千台主机的更大的网络通常要使用路由器(除了交换机之外)将整个网络划分成多个局域网,并构成一个互连网络。这时,路由器提供更健壮的流量隔离和对广播风暴的控制,并在网络的主机之间使用更“智能”的路由选择。
三层交换机
前面我们说过,单纯的使用交换机,是无法隔离广播域的。而且n台交换机之间通信,也需要借助路由器进行通信,如果都用交换机,势必会导致ARP时产生广播风暴,因此现在的中小型局域网中,出现了三层交换机,也就是可以工作在网络层的交换机,起到了隔离广播域的作用,并且可以一定程度上节省了成本。
在实际应用中,典型的做法是,处于同一个局域网中的各个子网的互连及局域网中VLAN间的路由,用三层交换机来代替普通路由器,实现广播域的隔离(主要目的:提升性能)。
只有局域网与广域网互连,或广域网之间互连时才使用普通路由器。
三层交换机可以很方便地直接将多个VLAN在网络层(第三层)进行互连。三层交换机通常不具有广域网WAN接口,主要用于在局域网环境中互连同构的以太网,并起到隔离广播域的作用。
由于三层交换机所处理的都是封装在MAC帧中的IP数据报,可以对处理算法进行很多特殊的优化并尽量用硬件来实现,因此其转发分组的速度比传统路由器要快。
三层交换机工作流程(跨VLAN通信)
当一台主机通过三层交换机与另一个VLAN中的主机进行通信时
三层交换机在处理它们之间的第一个IP数据报时,完全与一个普通路由器一样,要根据目的IP地址使用最长前缀匹配算法查找路由表,获得下一跳IP地址 (得到目标主机所在网络的网络号) ,并使用ARP获取下一跳IP地址对应的MAC地址,然后将IP数据报转发出去。
但三层交换机会将目的IP地址与下一跳MAC地址的映射关系记录在高速缓存中,当后续IP数据报到达时就不再通过最长前缀匹配算法查找路由表了,而是根据目的IP地址直接从缓存中查找相应的下一跳MAC地址,并用自己的出口MAC地址和查找到的下一跳MAC地址直接替换包含该IP数据报的以太网帧的源和目的MAC地址(三层交换机连接的都是以太网),直接在第二层将帧转发出去。查找缓存、替换MAC地址全部由硬件完成,因此速度非常快,几乎没有第三层的复杂处理(但要查看目的IP地址)。这就是所谓的“一次路由,多次转发/交换”。
要注意的是,主机在上述过程中完全感觉不到三层交换机和普通路由器的区别。虽然三层交换机的转发性能比普通路由器要高,但其通常接口类型一般就只是以太网接口,支持的路由选择协议也较少。
虚拟专用网VPN与网络地址转换NAT
虚拟专用网VPN(Virtual Private Network)
- 由于 IP 地址的紧缺,一个机构能够申请到的IP地址数往往远小于本机构所拥有的主机数。
- 考虑到互联网并不很安全,一个机构内也并不需要把所有的主机接入到外部的互联网。
- 假定在一个机构内部的计算机通信也是采用 TCP/IP 协议,那么从原则上讲,对于这些仅在机构内部使用的计算机就可以由本机构自行分配其 IP 地址。
上图是因特网数字分配机构IANA官网查看IPv4地址空间中特殊地址的分配方案
用粉红色标出来的地址就是无需申请的、可自由分配的专用地址,或称私有地址
私有地址只能用于一个机构的内部通信,而不能用于和因特网上的主机通信
私有地址只能用作本地地址而不能用作全球地址
所有路由器对目的地址是私有地址的IP数据报一律不进行转发
本地地址与全球地址
- 本地地址——仅在机构内部使用的 IP 地址,可以由本机构自行分配,而不需要向互联网的管理机构申请。
- 全球地址——全球唯一的 IP 地址,必须向互联网的管理机构申请。
- 问题:在内部使用的本地地址就有可能和互联网中某个 IP 地址重合,这样就会出现地址的二义性问题。
所以部门A和部门B 都至少需要一个 路由器具有合法的全球IP地址,这样各自的专用网才能通过这个公网的IP来利用公用的因特网进行通信。
部门A向部门B发送数据流程:与公网相连接的R1与R2路由器发现数据报的转发不是在内网进行的,要途径公网,再进入异地的内网系统。因此要对这个数据报加密,加密后在公网上传输,R2接收到之后解密,加密的数据报解密之后暴露出内网目标地址,把数据报送往目的主机。
两个专用网内的主机间发送的数据报是通过了公用的因特网,但在效果上就好像是在本机构的专用网上传送一样
数据报在因特网中可能要经过多个网络和路由器,但从逻辑上看,R1和R2之间好像是一条直通的点对点链路
这种点对点的情况就叫IP隧道技术
这种利用IP隧道技术,就是虚拟专用网(Virtual Private Network,VPN)的实现方式。在效果上就好像是在本部门的专用网上传送一样。
网络地址转换NAT(Network Address Translation)
NAT是软件,并且他的出现是为了解决IPV4地址数量不够用的情况。
举例:内网要发送给外网信息,直接传肯定不行,因为路由器不允许私网的数据报直接转发到外网,所以这里要用NAT。
目的就是为了将其私有地址转换为全球IP地址,从而进行数据传输
使用私有地址的主机,如何才能与因特网上使用全球IP地址的主机进行通信?
这需要在专用网络连接到因特网的路由器上安装NAT软件
专有NAT软件的路由器叫做NAT路由器
它至少有一个有效的外部全球IP地址
这样,所有使用私有地址的主机在和外界通信时,都要在NAT路由器上将其私有地址转换为全球IP地址
假设,使用私有地址的主机要给因特网上使用全球IP地址的另一台主机发送IP数据报,直接发送肯定不行,因为源地址是内网的主机地址,发不到公网上不说,发出去了想往回传确认帧,内网IP谁都不认。
内网发送数据报,在经由装有NAT软件的路由器的时候,该数据帧的源地址就会从内网地址转换为NAT的公网IP地址。同时,路由器也会记录这个内网主机IP与目的主机IP的对应关系。
因特网上的目标主机给源主机回传数据报,就会根据当时NAT由内网IP转换出来的地址进行回传,当回复的数据帧到达NAT路由的时候,路由会根据路由表把IP数据报的地址再改回内网主机IP的地址。这样回传的数据就回到了内网主机
当专用网中的这两台使用私有地址的主机都要给因特网使用全球地址的同一台主机发送数据报时,在NAT路由器的NAT转换表中就会产生两条记录,分别记录两个私有地址与全球地址的对应关系
在发出时,NAT会用两个不同的公网地址来作为源地址,对应发出时的两台内网主机地址。这样,在外部主机回复时,NAT就能区分出来把数据报给哪台内部主机。
而且这种基本转换存在一个问题,NAT的表能提供的公网地址终究是有限的。
解决方法:用 地址+端口号 的组合基本上就可以解决问题。将地址区分改变为同一个公网IP下利用端口号区分。毕竟端口号可以分配到65536个。大大增加了可用的地址数量,也就解决了地址不足导致无法区分的问题。
我们现在用的很多家用路由器都是这种NAPT路由器
内网主机与外网主机的通信,是否能由外网主机首先发起?
答案是不可以的,这种只能由内网发起通信,外网直接找内网是找不到的。所以这种通信的发起方必须是内网方。
即便外部发起了,到了NAT路由的时候,NAT路由发现自己没有记录对应的IP映射关系,也就不知道该把确认帧发给内网哪台主机,因此外部主机无法主动与内部主机沟通。