计算机网络-网络层


1. 网络层的几个重要概念

如果使用面向连接的通信方式,使得电信网络能够向用户(实际上就是电话机)提供可靠的通信服务

  • 计算机网络模仿电信网络,使用面向连接通信方式
  • 通信之前先建立虚电路VC(Virtual Circuit)(即连接),以保证双方通信所需的一切网络资源
  • 如果再使用 可靠传输的网络协议,可使所发送的分组无差错按照次序到达终点,不丢失,不重复。

1.1 虚电路服务

当两台计算机进行通信的时候,也应当要建立连接,但是在分组交换中是建立一条虚电路(Virtual Circuit)

以保留双方通信所需要的一切资源,然后双方沿着已经建立号的虚电路发送分组

这样的话分组的首部就不需要填写目的主机的地址,只需要填写这条虚电路的编号,然后分组就能够在这条事先建立好的虚电路上进行分组的传送了。

虚电路只是一条逻辑上的连接,分组都沿着这条逻辑连接按照存储转发方式来传送,并不是真正建立了一条物理连接

如果这种通信方式再使用可靠的网络传输协议,那么就可以使得发送的分组无查错,按序到达终点,当然也不重复,不丢失。

1.2 数据报服务

互联网的设计思路:网络层要设计得尽量简单,向其上层只提供简单灵活、无连接的、尽最大努力交付的数据报服务,这里的数据报(datagram)或者IP数据报就是我们经常使用的分组

由于传输网络不提供端到端的可靠传输服务,这就使得网络中的路由器比较简单。

  • 网络在发送分组的时候不需要先建立连接
  • 每一个分组(即IP数据报)独立发送,与其前后的分组无关(不进行编号)
  • 网络层不提供服务质量的承诺。即所传送的分支可能出错、丢失、重复和时序(不按序到达终点),也不保证分组传输的时限

由主机中的运输层负责可靠的通信

对比的方面 虚电路服务 数据报服务
思路 可靠的通信应当由网络来保证 可靠通信应当由用户主机来保证
连接的建立 必须有 不需要
终点地址 仅在连接建立的阶段来使用,每个分组使用短的虚电路号 每个分组都有终点的完整地址
分组的转发 属于同一条虚电路的分组均按照同一路由进行转发 每个分组独立选择路由进行转发
当结点出故障的时候 所有通过出故障的节点的虚电路均不能工作 出故障的节点可能会丢失分组,一些路由可能会发生变化
分组的顺序 总是按照发送顺序到达终点 到达终点时不一定按发送顺序
端到端的查错处理和流量控制 可以由网络负责,也可以由用户主机负责 由用户主机负责

1.3 物理层上的数据交换技术与虚电路服务技术

  • 电路交换:建立连接-通信-释放连接,它的传输单位是报文,整个报文的比特流连续的从源点到达终点,这个过程中始终占用这个连接。

  • 报文交换:无需建立连接,它并不占用一整条连接,而是一段一段的。

当两台计算机进行通信的时候,应该先建立连接,在分组交换中建立一条虚电路(Virtual CirCuit),然后双方就沿着建立的虚电路发送分组。这样一来,分组的首部就不需要填充完整的目的主机地址,而只要填写这条虚电路的编号就可以了。

通过虚电路服务如果再使用可靠传输的网络协议,所发送的分组就可以无差错地按序到达终点,不存在丢失与重复的情况。两台主机之间进行分组的交换都必须在实现建立好的虚电路上。

数据报文中的虚电路号:当两台建立了虚电路的机器相互通信的时候,可以根据数据报文中的虚电路号,通过查找交换机的虚电路表从而得到它的输出线路,进而将数据传送到目的端

采用虚电路网络会使得网络核心部分变得复杂,需要所有经过这条电路的节点来进行共同的维护。如果虚拟电路断开,那么数据将会丢失,只能重新建立虚电路。

问题:电路交换和虚电路交换技术都存在一个核心,那就是建立一条连接通路,这两者有什么区别?

  • 物理连接层面上:CS(电路交换)是在通信的时候建立电路,在通信完毕的时候拆除电路,建立的线路是不固定的。而虚电路交换表示这只是一种逻辑上的连接,其传输的分组都沿着这条逻辑连接按照存储转发的方式传送,一般来说通信线路由交换机的虚电路表来维护。
  • 传输单元上看:CS(电路交换)的传输是传输报文数据,虚电路传输的是分组

问题:分组交换(数据报服务)和虚电路交换都是通过分组来传输数据的,它们有什么区别?

  • 通信线路连接的角度上来看:虚电路需要在交换机中维护一张虚电路编号表,这张表就代表着在进行虚电路交换的时候需要建立一层虚拟连接,而数据报服务不需要建立连接即可
  • 数据传输单元内容来看:虚电路上的数据单元的包头含有的是虚电路的编号,而数据报服务含有的是完整的终点地址。

1.4 网络层的两个层面

不同网络中的两个主机之间的通信,要通过若干个路由器转发分组来实现,分组通过查找路由器中的转发表,从指明的端口转发到下一个路由器,其中转发表是由路由表导出的,而路由表又是由互联网中许多的路由器按照共同选定的路由选择协议,通过许多次的相互交换路由信息而产生的。

不同网络中的两个主机之间的通信,要经过若干个路由器转发分组来完成

在路由器之间传送的信息有以下2大类

  • 转发源主机和目的主机之间所传送的数据,把源主机所发送的分组,接力从一个路由器转发到下一个路由器,最后将分组转发到目的主机
  • 路由信息(为数据传送服务),是根据路由选择协议所使用的路由算法,彼此不断地交换路由信息分组,其目的是为了在路由器中创建路由表,并由此导出为转发分组而使用的转发表。这一类信息的传送是为了第一类数据的传送而服务的。

数据层面(分组转发)

  • 路由器根据本路由器生成的转发表,把收到的分组从查找到的对应接口转发出去,纳秒量级
  • 独立工作
  • 采用硬件进行转发,快

控制层面(路由选择)

  • 根据路由选择协议的路由算法计算路由,创建出本路由器的路由表,慢,一般是秒的量级
  • 许多路由器协同动作
  • 采用软件计算

软件定义网络SDN(Software Defined Network)

路由器:查找转发表,转发分组,在SDN中不负责生成路由表并导出转发表了

远程控制器(在物理上可以由不同地点的多个服务器组成):掌握和控制主机和整个网络的状态,能够为每个分组计算出最佳的路由,然后在路由器中生成器正确的转发表

2. 网际协议IP

网际协议IP是TCP/IP体系里面最重要的两个主要协议之一

网际协议IP是用来使得互联起来的许多计算机网络能够进行通信的,因此TCP/IP体系中的网络层通常被称为网际层

与网际协议配套的3个协议

地址解析协议ARP(Address Resolution Protocol):其作用进行网络地址MAC地址之间的转换,ARP协议在最下面的一层,IP经常需要使用这个协议

网际控制报文协议ICMP(Internet Control Message Protocol)

网际组管理协议IGMP(Internet Group Management Protocol)

ICMPIGMP经常需要使用IP协议

2.1 虚拟互联网络

虚拟互联网络是为了实现网络互通、将异构的网络互相连接起来

其中一种方案就是使用中间设备进行互联,将网络互相连接起来要使用一些中间设备,根据层次可以有以下四种不同的中间设备

中间设备
运输层及以上 网关(GateWay),连接两个不兼容的系统需要在高层进行协议的转换
网络层 路由器(router)
数据链路层 网桥或者桥接器(bridge),交换机(switch)
物理层 转发器

当中间设备是网桥或者转发器的时候,这仅仅是把一个网络扩大了,仍然是一个网络,一般不称为网络互联

参与互联的计算机网络都使用相同的网际协议IP,因此可以把互联以后的计算机网络看作为一个虚拟互联网络,如图(b)所示,意思就是互联起来各种物理网络的异构性本来是客观存在的,但是利用协议IP就可以使得这些性能各异的网络在网络层上看起来好像是一个统一的网络,这种使用协议IP的虚拟互联网络就可以称为IP网

IP网上的主机进行通信的时候,就好像在单个网络上进行通信一样,它们对于互联的网络的异构细节(如具体的编址方案,路由选择协议,等等)是透明的

当主机H1要把一个IP数据报发送给目的主机H2,它首先会先查找这个路由器的分组转发表,如果这个目的主机是在本网络中的,那么不需要经过任何路由器就可以直接交付

否则的话就必须把IP数据报发送给某个路由器,交给下一个路由器之后,同样查找是否在本网络中,如果在本网络中则直接交付,否则就转发到下一个路由器,这个过程我们叫做间接交付

最后只有当某个路由器知道自己和H2连接在同一个网络上的时候,这时候就可以直接将数据报直接交付到目的主机上。

路由器的协议栈只有下三层

  • 跳(hop):分组传送途中的每次转发都称为一跳

2.2 IP地址及其表示方法

整个的互联网就是一个单一的抽象的网络,IP地址就是给连接到互联网上的每一台主机(路由器)的每一个接口。分配一个在全世界范围内是唯一的32位标识符。ICANN

点分十进制法:为了便于人门书写和记忆,通常将这32位的标识符表示为4段的十进制数字

给每个主机(或者路由器)的接口分配一个IP地址,其含义就是这个IP地址不但标志这个主机(或者路由器),还标志了此接口所连接的网络,因此32位的IP地址采用的是两极结构,由两个字段组成

  • 网络号:用来标志主机或者路由器所连接到的网络,一个网络号在整个互联网范围内必须是唯一的
  • 主机号:标志该主机(路由器)

一个主机号在所连接的网络也就是前面的网络号所指明的网络中必须是唯一的,而网络号在整个互联网的范围内又是唯一的,因此一个IP地址在整个互联网范围内都是唯一的

IP地址 ::={<网络号>,<主机号>}

::=表示定义为

一定要记住,IP地址指明了连接到某个网络上的一个主机或者路由器。

IP地址的前n位是主机所连接的网络号,而IP地址后面的32-n位就是主机号

2.3 IP地址的特点

(1)每一个IP地址都由网络前缀和主机号两部分组成,从这个意义上说,IP地址一种分登记的地址结构

  • IP地址管理机构在分配IP地址的时候只分配网络前缀,剩下的主机号则由获得该网络前缀的单位自行分配

  • 路由器根据目的主机所连接的网络前缀也就是地址块来转发分组,可以使得转发表中的项目数量大大减少,从而减少转发表所占的空间缩短查找转发表的时间

(2)实际上的IP地址是标志一台主机或者路由器和一条链路的接口,当一台主机同时连接到两个网络上的时候,这个主机就必须同时具有两个响相应的IP地址,它的网络前缀必须是不同的,这种主机称作为多归属主机。

(3)一个网络或者子网是指具有相同网络前缀的主机的集合,用转发器或者交换机连接起来的若干个局域网依然是一个网络,因为他们具有相同的网络前缀,具有不同网络前缀的局域网必须使用路由器进行连接

(4)在IP地址中,所有分配到网络前缀的网络,都是平等的,处理这些IP地址的算法与机制都是一样的。

路由器总是具有两个或者两个以上的IP地址,也就是路由器的每个接口的IP地址的网络前缀都不同

当两个路由器直接相连的时候,在连线两端的接口处,可以分配也可以不分配IP,如果分配了IP地址,那么这一段连线的线路就构成了只包含一段线路的网络,只所以叫做网络,是因为它有IP地址,这个网络仅需要两个IP地址,使用了/31地址块,也就是形成了点对点链路,通常把这样的特殊网络叫做无编号网络或者匿名网络

2.4 IP地址和MAC地址的关系

  • IP地址:虚拟地址、软件地址、逻辑地址,在网络层以及以上的各层使用的地址
  • MAC地址:硬件址或者物理地址,固化在网卡(适配器)的ROM上,在数据链路层使用

  • MAC帧在传送的时候使用的源地址和目的地址都是MAC地址,这两个MAC地址都写在MAC帧的首部
  • 连接在通信链路上的设备根据MAC首部中的MAC地址决定收下或者丢弃,只有在剥去MAC帧的首部,提取出IP数据报的首部的时候,才能找到源IP和目的地址IP

从最终的结果这个角度上来讲,数据包的目标IP地址决定了数据包最终将会到达哪一台计算机,而目标MAC地址决定了该数据包下一跳将由哪个主机进行接收,不一定是终点。

从这张图可以简单总结一下,首先数据包包含了起点的IP地址和终点的IP地址,这是在数据链路层以上定义的。而在发送交换过程中,需要记录下一跳的硬件MAC地址,因此在每次运输到新的以太网的路由器的时候,都会经过拆解数据链路层封装的帧信息,也就是将帧中的目标MAC地址更新,直到到达目标硬件被接收。

其中路由器起到了比较重要的作用,也就是将源地址和目标地址进行了路由转换,从而找到合适的端口将其转发出去。可以简单归纳为:在不同的网段中转发数据包

如果只有MAC地址而没有IP地址会怎么样?

如果没有IP地址,那么交换机在转发数据的时候,需要记住所有设备的MAC地址,并记住这些MAC地址所对应的端口映射,姑且不谈当设备的MAC地址发生变化的时候(不是指MAC地址本身发生变化,而是说MAC地址所对应的设备链接的端口发生了变化),与之相关的所有交换机都要发生对应的更新,这将会是非常巨大的开销,至于IP地址所具有的好处,下面将会开始讲解。

子网掩码:叫做网络掩码,地址掩码,它是用来指明一个IP地址的哪些位标识的是主机所在的子网以及哪些位标识的是主机的位掩码,子网掩码只有一个作用,就是将某个IP地址区分为网络部分主机部分

子网掩码的计算过程是与运算,这样做的目的是为了屏蔽主机位上的值,从而确认网络部分

  • 在IP层抽象的互联网上只能看到IP数据报,即使IP数据报需要经过间接交付,但是在它的首部源地址和目的地址始终都是IP1IP2,数据报中间经过的IP地址并不出现在IP数据报的首部中
  • 虽然IP数据报首部有源站的IP地址,但是路由器只根据目的站的IP地址进行转发
  • 在局域网的链路层只能看到MAC帧,MAC帧在不同网络上进行传递的时候,其源地址和目的地址要发生变化

如图所示,开始在H1到R1传送的时候,写的是MAC1传送到MAC3,而到了R1中,我们发现IP数据报中的目的地址和源地址没有发生变化,但是这时候MAC的首部中的源地址变成了MAC4MAC5

这个工作机理是:路由器在收到MAC帧后,在数据链路层上就要剥去原来的MAC帧的首部和尾部,提取IP数据报的信息,在转发IP数据报的时候,就要重新添加MAC帧的首部和尾部

  • IP层抽象的互联网屏蔽了下层这些很复杂的细节,能够使用统一的、抽象的IP地址研究主机和主机或者路由器之间的通信。

2.5 ARP地址解析协议

实现IP通信时使用了两个地址

  • IP地址(网络层地址)
  • MAC地址(数据链路层地址)

ARP(Address Resolution Protocol):从IP地址解析出MAC地址

问题:在一个网络上可能经常会有新的主机加入进来或者撤走一些主机,更换网络适配器也会使得主机的MAC地址改变,主机的MAC地址实际上就是适配器ROM固化的MAC地址

ARP地址解析协议解决这个问题的方法是在主机的ARP高速缓存中存放一个从IP地址到MAC地址的映射表,并且动态更换维护(新增或者超时删除),每一台主机都设置有一个ARP cache也就是ARP高速缓存,里面存有本局域网上各个主机和路由器IP地址到MAC地址的映射表,如图所示

ARP协议工作的原理

当主机A要向本地局域网上的某台主机B发送IP数据报的时候,就先要在它的ARP高速缓存中查看有没有主机B的IP地址(找key),如果有的话,那么就可以在ARP cache中查找出其对应的MAC地址,再把这个MAC地址写入MAC帧,然后通过局域网MAC发往对应的MAC地址

当查找不到B的地址的时候,这时候可能是B才入网,也有可能是适配器A刚加电,还没有对应的信息存入到cache中,在这种情况下,主机A就会自动运行ARP,按照以下步骤执行主机B的MAC地址

(1)ARP进程在本地局域网上发送一个ARP请求分组,这个分组是封装在以太网帧中的。

请求的内容是:”我的IP地址是209.0.0.5,MAC地址是xxx,想要知道IP地址为209.0.0.6的主机的MAC地址”

(2)在本地局域网上的所有主机运行的ARP进程都收到此ARP请求分组

(3)主机B的IP地址和ARP请求分组中要查询的IP地址是一样的,就收下这个ARP请求分组,并且向主机A发送ARP响应分组,同时要在这个ARP响应分组中写入自己的MAC地址,其余的主机由于检测到IP地址不相同,因此不理睬这个请求分组

(4)主机A收到主机B的ARP响应分组之后,就在它的ARP高速缓存中写入主机B的IP地址到MAC地址的映射

当主机A向B发送数据报的时候,很有可能不久以后主机B就要向A发送数据报,因此主机B也可能想要向A发送ARP请求分组,在这种情况下,主机A在发送其ARP请求分组的时候,就顺便把主机的IP地址到MAC地址的映射写入到ARP请求分组,当主机B收到A的ARP请求分组的时候,就把主机A的这一地址写入到主机B自己的ARP高速缓存中。减少了网络的通信量

在通信过程中,如果遇到需要查找对方的MAC地址的时候

  • 请求分组是广播的
  • 响应分组是单播的

关于生存时间

ARP对保存在高速缓存中的每一个映射地址项目都设置生存时间,凡是超过生存时间的项目就从高速缓存中删除掉,设置这种地址映射项目的生存时间是很有必要的。

主机A和主机B进行通信,A的ARP高速缓存中保存有B的MAC地址,但是此时B的适配器坏了或者在网络上离线,B立即更换了一块,因此这时候主机B的MAC地址就改变了。

A在其ARP的高速缓存中查找到关于B原先的MAC地址,并且用该MAC地址向B继续发送数据帧,但是原来的MAC地址已经失效了,因此A无法找到主机B,但是当生存时间过去之后,A的ARP高速缓存中已经删除了B原先的MAC地址,于是这时候A要重新广播发送ARP请求分组,找到了B

ARP用于解决同一个局域网上的主机或者路由器的IP地址和MAC地址的映射问题,如果所要找的主机和源主机不在同一个局域网上,主机就无法解析出另一个局域网上的主机

这这种情况下,如图所示,主机A和主机B跨网络进行通信

主机A发送给主机B的IP数据报首先需要通过与主机A连接在同一个局域网上的路由器R1来转发,因此主机A必须知道关于路由器R1的IP地址,于是A使用ARP协议将路由器R1的IP解析为MAC地址,然后将IP数据报传送到路由器R1

之后R1知道要将数据报从R1发送到B,于是运用ARP协议将B的IP解析为MAC地址,将IP数据报从R1传送到路由器B

从IP地址到MAC地址的解析是自动进行的,而用户对这种地址的转换过程是透明的,只要主机或者路由器和本网络上的另一个已知IP地址的主机或者路由器进行通信,协议ARP就能够自动地把这个IP地址解析为链路层所需要的MAC层地址,然后插入到MAC帧中。

使用ARP的四种典型情况

(1)发送方是主机(如H1),要把IP数据报发送到同一个网络上的另一台主机,这时候H1发送ARP请求分组,在网络N1上进行广播(发送ARP请求分组),找到目的主机H2MAC地址

(2)发送方是主机(如H1),要把IP数据报发送到另一个网络上的一台主机(如H3),这时候H1发送ARP请求分组(在N1上进行广播),找到N1上的一个路由器R1的MAC地址,剩下的工作由路由器R1来完成,R1要做的事情是下面的(3)(4)

(3)发送方式路由器,要把数据报转发到与R1连接在同一个网络N2上的主机,这时候R1发送ARP请求分组,在N2上广播,找到目的主机H3的MAC地址

(4)发送方式路由器R1,要把IP数据报转发到网络N3上一个一台主机,H4R1并不是连接在同一个网络上的,这时候R1发送ARP请求分组,找到R2的MAC地址,然后将数据报传送到R2上,剩下的工作交给R2

既然在网络链路上传送的帧最终是按照MAC地址找到目的主机的,那么为什么还需要使用两种地址?只用一个MAC地址似乎可以免除使用ARP协议

由于全世界存在各种各样的网络,它们使用不同的MAC地址,要使得这些网络能够互相通信就必须进行非常复杂的MAC地址转换工作,由用户和主机来完成这项工作是不可能的事情,对全世界的以太网的MAC地址进行寻址,是非常困难的事情,其根本原因还是MAC地址之间的转换是非常复杂的

然而IP编址将这个复杂的问题给解决了,连接到互联网上的主机只需要各自拥有一个IP地址,它们之间的通信就像连接在同一个网络上那样简单方便。

在虚拟的IP网络上使用IP地址进行通信是非常方便的

2.6 IP数据报的格式

IP数据包首部的格式能够说明IP协议都具有什么功能

IP数据包由首部数据两部分组成,首部的前一部分是固定长度,共20个字节,是所有IP数据包必须有的,在首部的固定部分的后面是一些可选的字段,其长度是可变的。

而描述首部格式的宽度是32位,也就是4个字节

这个图该如何来看呢?首先要看懂这个图的单位,竖着下来的首部具有20个字节,是表示固定部分具有20个字节,横着过来的写着的是0~31位,也就是说在分成每层4个字节的情况下,在这一层中,每4个字节中,有多少位是用来表示这些数据的。

比如说第03个字节,其中第03个二进制位用来表示版本号。

值得注意的是,由于数据的封装,我们认为传输层下来的东西都在数据部分中

(1)版本

版本占4位,指IP协议的版本,IP协议目前有ipv4和ipv6,通信双方使用的IP协议必须一致,目前广泛使用的IP协议版本号为4

(2)首部的长度

首部长度占4位,可表示的最大十进制数为15,请注意,这个字段所表示的数的单位是32位二进制数(4个字节),因此,当IP的首部长度为1111的时候,也就是十进制的15的时候,首部的长度就达到了60个字节。

而固定部分是20个字节,因此首部长度字段的最小值就是5(也就是首部长度为0101),因为一个宽度为4个字节,固定长度是20个字节,因此最小值就是5

当IP分组的首部长度,不是4字节的整数倍的时候,也就是不是宽度的整数倍的时候,必须利用最后的填充字段加以填充,因此IP数据报的数据部分永远在4字节的整数倍的时候开始,这样在实现协议IP的时候比较方便

(3)区分服务

简单来说,区分服务就是一个优先级字段,它的作用是在出口队列中给这个数据包指定转发次序,优先级高的先转发出去,以便获得较高的带宽。但是这种服务是有要求的,它要求请求方和接收方都认可这种标记,否则的话这个字段就起不到作用。

它占8位,配置计算机给特定应用程序的数据包添加一个标志,然后再配置网络中的路由器优先转发这些带标志的数据包,在网络带宽比较紧张的情况下,也能确保这种应用的带宽有保障,这就是区分服务,为这种服务保证服务质量。

(4)总长度

总长度指的是首部和数据之和的长度,单位为字节,总长度字段为16位,因此最大长度就是2^16-1=65535个字节,总长度占的地位是第0个字节的第16-31个比特。

但是回顾之前数据链路层的内容的话,一个帧的数据部分不能超过1500个字节,而65536个字节是远远超过了的,因此需要进行分片

最大传送单元(Maximum Transfer Unit):一个数据帧中的数据字段最大长度

数据报的长度首部加上数据部分,一定不能够超过下面数据链路层所规定的MTU的值,在这种情况下必须将过长的数据报进行分片处理

IP数据报越短,路由器转发的速度就越快,为此,协议IP规定了在互联网中所有的主机和路由器必须能够接收长度不超过576字节的数据报

假设上层交下来的数据长度有512个字节,加上最长的IP首部60个字节,加上4个字节的富余量,就得到576个字节,当超过了576个字节的时候,需要了解对方主机是否能够接受所要发送的数据报长度,否则就要进行分片

在进行分片的时候,数据报首部中的总长度字段是指分片后的首部长度与该分片的数据长度的总和

(5)标识

占16位,IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就+1,并将这个值赋值给标识字段,但是这个标识并不是序号,因为IP提供的是无连接的服务,数据报就不存在按序接收的问题,当数据报由于长度超过网络的MTU必须分片的时候,这个标识字段就被复制到所有的数据报片的标识字段中。

在后面的组装过程中,能够根据相同的表示字段使得分片之后的各数据报片最后能够正确地重装为原来的数据报

(6)标志(flag)

分片标志占3位,但只有前两位有意义

  • MF(More Fragment):分片标志的最后一位(最低位)作用是用来标志是否是最后一个分片,如果是最后一个分片,则分片标志为0,否则为1
  • DF(Dont Fragment)第二位的作用是用来标志是否允许分片,如果是1,那么就不允许分片,否则可以

(7)片偏移

片偏移指出:较长的分组在分片之后,某片在原分组中的相对位置,也就是说,相对于用户数据字段的起点,该片从何处开始,片偏移以8个字节为偏移单位,这也就是说除了最后一个数据片之外,其他每个分片的长度一定都是8个字节的整数倍

如图所示,这个数据报的总长度是3820个字,其数据部分是3800个字节,现在需要分片为长度不超过1420字节的数据报片,因固定首部的长度是20个字节,因此每个数据报片的数据部分长度不能够超过1400个字节,因此这样划分,将原数据报划分为1400,1400,1000个字节,原始数据报首部被复制为各数据报片的首部,但是必须修改有关字段的值,如图所示

其中具有相同表示的数据报片在目的站就可以无误地重装为原来的数据报

现在如果假定数据报片2经过某个网络还需要进行再分片,也就是划分为数据报片2-1(携带数据800字节)和数据报片2-2(携带600数据字节),那么这两个数据报片的总长度、标识、MF、DF和片偏移分别是820,12345,1,0,175620,12345,0,0,175+800/8=275

解读一下这个片偏移是怎么理解的

片偏移指的是相对于用户的数据字段的起点,这个片从哪开始

对于这个例子而言,数据片1的数据部分是第一个切片,因此其片偏移就是0

数据片2的数据部分是第二个切片,相对于原始的数据字段,是在第一个切片之后的,因此其片偏移就是1400/8=175

如果对数据片2进行切片,那么相对于原始的数据字段,2-1是在第一个切片之后的,因此其片偏移还是1400/8=175

然后2-2是在第二个切片的第一个子切片之后的,因此其片偏移还要计算上子切片之后的偏移量,也就是1400/8+800/8=275

然后第三个切片就是在第二个切片之后的,也就是275+600/8=275+75=350

(8)生存时间

生存时间字段的常用的英文缩写是TTL(Time To Live),占8位,指示数据报在网络中可通过的路由器的最大值,防止无法交付的数据报无限制地在互联网中兜圈子,当TTL减少为0的时候就丢弃这个数据报,TTL的单位是跳数,数据报能在互联网中经过路由器的最大数目是225,如果设置为1就值能在本地局域网上传输。

这是因为路由器在传输数据之前就将这个字段的值减少1,如果判断为0那么就直接丢弃这个数据报。

(9)协议

占8位,指出此数据携带的数据使用的协议,以便目的主机的IP层将数据部分上交给哪个处理进程

(10)首部检验和

首部校验和,占16位,只校验数据包的首部,不校验数据部分。这是因为数据报每次经过一个路由器,路由器都要重新计算一次首部检验和一些字段,比如说生存时间等可能发生变化

这里不采用CRC检验码而采用简单的计算方法,计算方法如下:

在发送方,先将数据报的首部划分为许多16位字的序列,并且把检验和字段置为0,通过反码计算把这些所有16位字相加之后,将得到的和的反码写入检验和字段。

接收方收到数据报之后,把首部所有的16位字再使用反码算术计算一次,将得到的值取反码,就得到接收方检验和的结果,如果首部没有发生任何变化,那么结果肯定就是0,于是就保留这个数据,否则的话就认为出错了。

关于首部校验和的例子

首先以16位为一个单位划分这个首部,也就是

0100 0101 0000 0000
0000 0000 0001 1100
0000 0000 0000 0001
0000 0000 0000 0000
0000 0100 0001 0001
0000 0000 0000 0000
0000 1010 0000 1100
0000 1110 0000 0101
0000 1100 0000 0110
0000 0111 0000 1001	  
列/行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 1 0 0
2 1
3 1 0 0
4 1 1
5 1 0
6 0
7 0
8 0
9 1 0
10 1 1
11 1 0 1
12 1 1
13 0
14 0
15 1
16 0 (+1) (+1) (+1) (+1) (+1) (+1)
结果 0 1 1 1 0 1 0 0 0 1 0 0 1 1 1 0
检验和 1 0 0 0 1 0 1 1 1 0 1 1 0 0 0 1

计算过程大致就是上面的过程,比较麻烦,建议用excel表格来做,这样不容易乱

(11)源地址

占32位,发送IP数据报的主机的IP地址

(12)目的地址

占32位,接收IP数据报的主机的IP地址

IP数据报首部的可变部分

就是一个选项字段,选项字段支持排错、测量以及安全,从1个字节到40个字节不等,这些选项一个个拼接起来,中间不需要分隔符,最后用全0的填充字段补充为4字节的整数倍

3. IP地址分类

分类的方式的概述

  • A类(网络号8位)
  • B类(网络号16位)
  • C类(网络号24位)

ABC类地址都是单播地址,是最常用的

  • D类:多播地址,一对多通信

3.1 A类地址

A类地址的网络号占1个字节,只有7个bit可以使用。因为这个网络号的第一个bit固定为了0,

  • 网络号全部为0的IP地址有特殊的用途,它表示本网络
  • 网络号为127也就是0111 111保留作为本地软件换回测试本主机进程之间通信之用

如果主机发送一个目的地址为换回地址(例如127.0.0.1)的IP数据报,那么本主机之中的协议软件就处理这个数据报之中的数据,而不会数据报发送到网络上,因此A类地址可以指派的网络号就是2^7-2=126

A类地址的主机号占3个字节,但是全0和全1是不指派的

  • 主机号全为0表示的是本主机所连接到的单个网络地址,比如说某个主机被指派了一个A类地址为(5.6.7.8),如果要表示这个网络的网络地址,那么就是将主机号设置为0,也就是5.0.0.0
  • 主机号全为1表示的是所有的,因为这个全为1的主机号字段表示的这个网络上的所有主机

因此A类地址可以指派的主机号就是2^24-2

3.2 B类地址

B类地址的网络号字段有2个字节,因为这2个字节的前两个bit被固定为10,因此可以被分配的网络数就是2^14,IP地址第一部分取值范围是128-191,因此不存在本地环回网络和本网络

而对于主机号其中全为0依然是作为网络的网络地址,全为1作为广播地址而不被指派,因此主机号可以使用的地址就是2^16-2

B类地址的默认子网掩码是255.255.0.0

3.3 C类地址

C类地址的网络号由3个字节组成,其中前三个bit被指定为110

IP地址的第一部分取值是192-223

C类地址的默认子网掩码是255.255.255.0,主机ID由第四部分组成,每个C类网络可以容纳的最多的主机数就是256-1(全1)-0(全0) = 254

3.4 D类地址和E类地址

网络地址的最高位是1110的地址是D类地址,D类地址的第一部分的取值范围是224-239,用于多播组播的地址,组播地址是没有子网掩码的。

子网掩码的目的是为了区分主机号与网络号,如果是多播,那么就是广播到多个主机,子网掩码就失去了其作用。

网络地址的最高位是11110地址为E类地址,第一部分取值范围240-254,保留为今后使用

其实所谓的分类也就是将所有的IP地址进行拼接与分离。

3.5 保留的IP地址

  • 网络ID全为0个主机号全为0的地址作为本网络上的本主机

  • 而当网络ID为全0而主机号不为0的时候,这时候表示位于同一个网络上的主机号为X的主机

  • 主机ID全为0的地址,特指某个网段,比如192.168.10.0 255.255.255.0指的是192.168.10.0网段

  • 主机ID全部为1的地址,特指该网段上的所有主机,数据链路层发送的将会是FF-FF-FF-FF-FF-FF

  • 127.0.0.1:是本地环回地址,指的是本机IP地址,一般用来测试和使用,回送地址127.x.x.x:是本地回送地址Loopback Address,也就是主机IP堆栈内部的IP地址

5. 分类域间路由选择CIDR

IP地址有类的概念,A类地址默认子网掩码255.0.0.0,B类地址的默认子网掩码是255.255.0.0,C类地址的默认子网掩码是255.255.255.0,等长子网划分和变长子网划分,打破了IP地址类的概念,子网掩码也打破了字节的限制,这种子网掩码被称为VLSM,可变长子网掩码

这种方式的也可以使得路由器上的路由表大大精简,被称为无分类域间路由选择CIDR(Classless Inter-Domain Routing),子网掩码中1的个数被称为CIDR

  • CIDR:无分类域间路由选择。
  • 消除了传统的A类、B类和C类地址以及划分子网的概念,可以更加有效地分配IPv4,但无法解决IP地址枯竭的问题

要点

  • 网络前缀
  • 地址块
  • 地址掩码

5.1 网络前缀

CIDR将网络号改称为网络前缀来之指明网络,剩下的后面的部分依然是主机号,用来指明主机

2级结构2个字段:网络前缀和主机号,IP地址::={<网络前缀>,<主机号>}

网络前缀的位数n是多少?

最大的区别:前缀的位数n不固定,可以在0~32之间选取任意值。

  • CIDR记法:斜线记法,二进制IP地址的前n位是网络前缀,例如128.14.35.7/20的前20位是网络前缀。

5.2 地址块

  • CIDR把网络前缀都相同的所有连接的IP组成一个CIDR的地址块
  • 一个CIDR地址包括的IP地址数目,取决于网络前缀的位数

我们通常使用地址块中的最小地址和网络前缀的位数指明一个地址块,比如说是128.14.30.0/20

  • 128.14.32.7是IP地址,但是没有指明网络前缀的长度,因此并不知道网络地址是多少
  • 128.14.32.7/20是IP地址,但是同时指明了网络前缀是20位,由此可以导出网络地址
  • 128.14.32.0/20是包含多个IP地址的地址块或者网络前缀,同时也是这个地址块中主机号全0的地址,有时候最后面的0可以省略。

那么在上面的例子中,我们地址块中导出的128.14.32.0是这个网络的网络地址吗?

在CIDR下,由于网络前缀的存在,那么我们就一定要指定网络前缀n,在这种情况下128.14.32.0无法确定你哪几位是网络,因此如果要指定网络地址,那么就应该表达出完整的CIDR

也就是128.14.32.0/20,这才是网络地址,因为通过/20这样的限制可以知道其主机号肯定是全0的。

一定要记住,仅从斜线左边的IP地址已经无法知道其网络地址了。

5.3 地址掩码(address mask)

CIDR使用斜线计数法可以让我们知道网络前缀的数值,但是计算机看不见斜线计数法,而是需要使用二进制来进行各种计算。

那么在进行计算的时候,必须使用32位的地址掩码,通过这个地址掩码做位运算,可以快速得到网络地址。也就是子网掩码,位数32位,目的让机器从IP地址迅速算出网络地址。

这其中的K代表2^10

子网:某个网络的一部分就可以称之为子网,一个网络对于整个互联网来说,就可以看做是一个子网

CIDR中的特殊地址块

  • 前缀=32,也就是32位的IP都是前缀,没有主机号,用于主机路由
  • 前缀=31,地址块只有两个IP地址,其主机号为0和1,用于点对点链路
  • 前缀=0,IP地址全部是0,用于默认路由

5.4 构造超网

路由聚合:一个大的CIDR地址块中往往包含很多小的地址块,在路由表中就可以用较大的一个CIDR地址块来代替许多较小的地址块。

其本质是对网络地址的合并,合并若干个x类网络,其具体手段可以是将子网掩码向左位移n位,达到合并的效果。什么场景下需要子网的合并?

当有一个交换机A下有200台计算机,交换机B下有200台计算机,由于超出了其向上的最大一个数量限制是255,因此分配地址的时候需要两个网段,比如说是192.168.0.0192.168.1.0,如果没有子网合并(超网)技术,那么就需要在路由器中建立路由表,记录下192.168.0.0192.168.1.0这也就意味着:

这两个交换机下的设备是可以直接通过交换机的相互交换来进行通信的,可是现在需要多了一层路由器来进行转发。

可见,并不是任何连续的网段都能被合并,比如说我想合并1和2,那这时候由于有两位不一样,因此需要子网掩码向左移动两位才足够,但是这时候就把0和3都一起合并进来了,这时候可能就会合并了冲突的网段,可能导致有问题产生。

结论:判断连续的2个网段是否能够合并,只要第一个网络号能被2整除,就能够通过左移1位子网掩码合并

这句话有两个关键点,连续以及网络号有序

推广的,对于n个网段是否能够被合并,只要第一个网络号能被n整除,就能够通过左移(log2n)位子网合并

5.5 判断一个网段是子网还超网

通过左移子网掩码合并多个网段,右移子网掩码将一个网段划分为了多个子网。

如果要判断一个网段到底是子网还是超网,就要看该网段是A类网络还是B类网络,还是C类网络,默认A类子网掩码/8,B类子网掩码/16,C类子网掩码/24

如果该网段的子网掩码比默认子网掩码要长,那就是子网,如果该网段的子网掩码比默认掩码要短,那就是超网。

这个比较好理解,子网掩码左移的话就证明网络号缩短,主机号增长,主机号增多,网段下的主机数量增加,网段被合并,子网掩码右移的话网络号增长,主机号缩短,网段下的主机数量减少,网段被划分。

所谓默认子网掩码的话就是要看网络号,根据网络来判断其是哪一类地址

6. IP层转发分组的过程

6.1 基于终点的转发

分组在互联网上是逐跳转发的,分组在互联网上的传送和转发如果是基于分组首部中的目的地址的话,那么这种转发就称作为基于终点的转发

因此,当分组到达一个路由器的时候,路由器就根据分组中的终点目的地址查找转发表,然后就可以得知下一跳应该到达哪一个路由器了。

压缩转发表的大小

转发表不是按照目的地址来直接查出下一跳的路由器的。也就是说不是直接查找目标主机,而是查找目的网络(网络的前缀),在找到了目的网络之后,就把这个分组在这个网络上直接交付目的主机。

这种做法能够大大压缩转发表的大小,加速分组在路由器中的转发。

当路由器在收到一个待转发的分组之后,从转发表中得出下一跳路由器中的IP地址后,不是把这个地址填入分组的首部,而是把这个地址送交数据链路层的网络接口软件

网络接口软件负责将下一跳路由器的IP地址转换成MAC地址(使用ARP协议),并将此MAC地址放在数据链路层的帧首部,然后利用这个MAC地址传送到下一跳路由器的链路层,然后再取出MAC帧的数据部分交给网络层。

当发送一连串的分组的时候,上述的这种查找转发表,调用ARP解析出MAC地址、将MAC地址写入到MAC帧首部都是必须做的,而且都是基于机器软件自动完成的。

能不能在转发表中不使用IP地址而直接使用MAC地址呢?这样的话就不需要维护IP协议的细节而节省开销了?

不行,我们使用抽象的IP地址,本来就是为了隐藏各种底层网络的复杂性,而MAC地址本身是属于数据链路层的内容,这就意味着我们在设计网络层是如何工作的时候,就还需要考虑到底层的MAC地址兼容性(包括MAC地址的不同格式,MAC地址合法性,MAC地址存活周期,MAC解析),存储等基本问题,这将会带来更高的耦合性,甚至无法找到对方的机器等问题。

例子说明分组转发的过程

主机H1发出一个分组,其目的地址是128.1.2.132,现在源主机是H1,而目的主机是H2,追踪分组转发的过程

[1]目的主机是否在本网络上?

  • 如果在本网络上,那么就直接交付
  • 如果不在本网络上,那么就将这根分组发送到本网络上的路由器,以后的事情都交给路由器进行处理

[2]判断是否在本网络上

主机H1首先把要发送的分组中的目的地址和本网络N1的子网掩码按位进行AND运算,得出一个运算结果。

  • 如果运算结果等于本网络N1的前缀,那么就表明分组的目的主机连接在本网络上
  • 否则的话就必须将分组发送到路由器R1,由路由器完成后续的任务

由于采用了CIDR记法,转发表中给出的都是网络前缀,而没有明显给出其子网掩码,我们可以通过网络前缀的位数推出子网掩码

如图所示,计算出来的结构不等于H1的网络前缀,那么也就是说目的主机不是连接在本网络上的

[3]分组是如何匹配前缀的?

寻找前缀匹配:就是在查找转发表,从转发表中顺序比较前缀,如果相同则匹配成功,否则匹配失败

6.2最长匹配前缀原则

如图所示,R1收到一个目的地址为128.1.24.1的分组,请你给出分组的转发接口。

请注意,公司B包含了3个子网,但是这些网络前缀并没有出现在路由器R1的转发表中,这是因为公司采用了路由聚合,把三个子网的所有地址聚合为一个网络前缀128.1.24.0/22

我们把进入到路由器R1的分组的目的地址分别和路由器R1的转发表进行AND运算,计算过程如下

128.1.24.0/22
128.1.24.0/24
-------------
128.1.24.1

可见两个都是匹配的,可是哪一个结果才是正确的?

网络前缀128.1.24.0/22可以划分为4个更小的/24前缀

#将128.1.24.0/22划分为4个子网
10000000 00000001 000011/00 00000000#128.1.24.0
#划分为4个子网
#subnet1
10000000 00000001 00001100/ 00000000#128.1.24.0/24
#subnet2
10000000 00000001 00001101/ 00000000#128.1.25.0/25
#subnet3
10000000 00000001 00001110/ 00000000#128.1.25.0/26
#subnet4
10000000 00000001 00001111/ 00000000#128.1.25.0/27

A分配到subnet1,而B分配到subnet2-4

公司B将这3个前缀合并为一个更大的前缀128.1.24.0/22,作为路由表中的一个项目

请注意,这个前缀和原来的前缀在形式上是一样的,但是实际的区别是很大的

比如说左边的那个是包含了128.1.24.1的,但是128.1.24.0/22(公司B聚合后的前缀)是不包含这个地址的

注意,路由聚合是允许聚合这样的地址,尽管会产生歧义

因此在采用CIDR编址的时候,如果一个分组在转发表中可以找到多个匹配的前缀,那么就应该要选择前缀最长的一个作为匹配的前缀,这个原则叫做最长前匹配原则,网络前缀越长,其地址块就越小,因而路由就越具体,因而要把前缀最长的排在第一行,加速查表。

主机路由和默认路由

主机路由(host route):又叫做特定主机路由,对特定目的的主机的IP地址专门指明一个路由

其网络前缀就是a.b.c.d/32,这个是放在转发表的最前面的

默认路由(default route)

不管分组的最终目的在哪里,都是由这个指定的路由器R来进行处理,用一个特殊的前缀0.0.0.0/0来表示默认路由,这个前缀的掩码是32个0,用全为0的掩码和任何目的的地址进行按位AND运算,结果一定全部都是0,是一定匹配的,然后就按照转发表中的项目,把这个分组送交到下一跳路由器进行处理。

分组转发算法

(1)从收到分组的首部提取目的主机的IP地址D(也就是目的地址)

(2)如果查找有特定的主机路由(D),那么就按这条路由的下一跳来转发分组,否则就从转发表中查找下一行开始检查

(3)把这一行的子网掩码与目的地址D进行AND运算

  • 运算结果与本行的前缀匹配,那么查找就结束了,按照下一跳所指出的进行处理
    • 检查与自己相连的网络前缀和运算结果是否相同,如果相同则直接发送到对应的网络
    • 否则的话就转发到对应的路由器的接口
  • 否则转发表还有下一行,继续检查

(4)如果转发表中有一个默认路由,则按照指明的接口,把分组传送到指明的默认路由,否则报告转发分组出错。

7. 网际控制报文协议(ICMP)

为了更加有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议(Internet Control Message Protocol)ICMP允许主机或者路由器报告差错情况提供有关异常情况的报告,ICMP不是高层的协议,ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。

7.1 ICMP报文的种类

ICMP报文有两种,也就是ICMP差错报告报文ICMP询问报文

ICMP报文的前4个字节是统一的格式,一共有三个字段类型代码检验和。接着的4字节的内容和ICMP的类型有关,最后面是数据字段,其长度取决于ICMP的类型

  • 代码字段用来进一步区分某种类型中的几种不同的情况
  • 检验和字段用来检验整个ICMP报文

IP数据报的首部的检验和并不检验IP数据报的内容,因此IP数据报中的首部检验和不能保证经过传输的ICMP的报文不产生差错。

差错报告报文类型

(1)终点不可达

路由器或者主机不能交付数据报的时候就向源点发送终点不可达的报文

(2)时间超过

  • 当路由器收到生存时间为零的数据报的时候,除了要丢弃这个数据报之外,还要向源点发送数据超过的报文。
  • 当终点在预先规定的时间内不能收到一个数据报的全部数据报片的时候,这时候应该要丢弃全部已经收到的数据报片,并向源点发送时间超过报文

(3)参数问题

当路由器或者目的主机收到的数据报的首部中有字段的值不正确的时候,这时候就应该要丢弃数据报,并向源点发送参数问题报文

(4)改变路由(重定向)

当找到了更好的路由的时候,路由器把改变路由报文发送给主机,让主机知道下次应该将数据报发送给另外的路由器

出于效率的考虑,这些主机不和连接在路由器定期交换路由信息,在主机刚开始工作的时候,一般都会在转发表中设置一个默认的路由器的IP地址。

不管数据报发送到哪个目的地址,都一律将这个数据报传送给这个默认路由器,而这个默认路由器知道每一个目的网络的最佳路由,通过和其他路由器交换路由信息,如果默认路由器发现主机发往某个目的地址的数据报的最佳路由应该是网络上的另一个默认路由器R,就把改变路由报文告诉主机,于是就在主机的转发表中添加一个项目:到某某地址应该经过路由器R

所有的ICMP差错报告报文中的数据字段都具有相同的格式

把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段

然后在加上相应的ICMP差错报告报文的前8个字节,就构成 了ICMP差错报告报文

提取数据字段的前8个字节是为了获取运输层中的端口号

然后组成好了的ICMP报文作为IP数据报的数据字段进行分组发送

ICMP差错报告报文不发送的情况

  • ICMP差错报告报文,不再发送ICMP差错报告报文,就是说如果ICMP报文本身出错,那么不会追加ICMP
  • 对第一个分片的数据报片的所有后续数据报片,都不发送ICMP差错报告报文
  • 对具有多播地址的数据报,不发送ICMP差错报告报文
  • 对具有特殊地址(127.0.0.0或者0.0.0.0)的数据报,不发送差错报告报文

常见的ICMP询问报文有两种

(1)回送请求或者回送回答:ICMP回送请求报文是由主机或者路由器向一个特定的目的主机发出的询问,收到此报文的主机必须给源主机或者路由器发送ICMP 回送回答报文,这种询问报文可以用来测试目的站是否可达以及了解有关的状态

(2)时间戳请求或者时间戳回答:在ICMP时间戳请求报文发出之后,就能够收到对方响应的ICMP时间戳护回答报文,利用在报文中记录的时间戳,就可以计算出当前网络的往返时延

7.2 ICMP应用举例

PING(Packet InterNet Groper):分组间探测,使用了ICMP回送请求与回送回答报文,是直接使用网络层ICMP的一个例子,没有通过运输层的TCP/UDP

traceroute/tracert:可以用来追踪从源点到终点的路径

工作流程简述

从1开始逐渐增大TTL,不断让途径的路由器向源主机发送一个ICMP时间超过差错报文,当到达主机的时候,这时候的TTL=1,由于不执行转发,因为目标地址已经到了,但是由于UDP报文无法交付,这时候:

  • 不转发数据报
  • TTL不减1

目的主机向源主机发送一个ICMP终点不可达的差错报告报文

8.子网划分

8.1 等长子网划分

子网划分:就是借用现有网段的主机位做子网位,划分出多个子网。

等长子网划分:就是将一个网段等分成多个网段,也就是等分成多个子网

  • 需要确定子网掩码的长度
  • 需要确定子网中第一个可用IP地址和最后一个可用的IP地址

8.2 变长子网划分

简单来说就是根据设备的个数来划定网段,并且根据网段来确定子网掩码,最简单的办法是根据最大的设备数量来确定基础网段,然后再根据基础网段进行位运算,根据位运算后的结果来确定子网掩码。

如果一个子网地址块是原来网段的$$(\frac{1}{2})^n$$,子网掩码就在原网段的基础上后移n位,不等长子网,其子网掩码也不相同。

在上述的划分中,还有D和E网段还没有被使用,而且这两个网段所需要的IP地址数量为2,加上全0和全1的限制,那么就是需要4个IP地址。

观察到032还没有被用,因此接下来考虑如何使用`032`的地址

9. IPv6和IPv4的对比

  • 拥有更大的地址空间:将地址从IPv4的32位增大到了128
  • 扩展的地址层次结构:可以划分为更多的层次
  • 灵活的首部格式:定义了许多可选的扩展首部
  • 改进的选项:允许数据报包含有选项的控制信息,其选项放在有效载荷中
  • 允许协议继续扩充:更好地适应新应用
  • 支持资源的预分配:支持实时影响等要求保证一定的带宽和时延的应用
  • IPV6首部改为8字节对其:首部长度必须是8字节的整数倍

10.互联网的路由选择协议简介

互联网的路由选择协议要解决的问题是转发表中的路由是怎样得出的。路由选择协议属于网络控制层面的内容。规定了互联网有关的路由器应该如何交换信息并且生成路由表,再由路由表导出转发表

10.1 有关路由选择算法的几个基本概念

理想的路由选择算法

路由选择协议的核心是就是路由算法,也就是说需要哪种算法来获得路由表中的各种项目

  • 算法必须是正确的和完整的,正确指的是沿着各路由表所指引的路由,分组一定能够最终到达目的网络和目的主机
  • 算法在计算上应该要简单
  • 算法能够适应通信量和网络拓扑结构的变化,要有自适应性,当网络中的通信量发生变化的时候,算法能够自适应地改变路由以均衡各链路的负载,当某个节点或者某些节点、链路发生故障不能工作的时候,或者修理好了再投入运行的时候,算法也能够及时地改变路由,有时候称这种自适应性为稳健性
  • 算法应该具有稳定性
  • 算法是公平的
  • 算法是最佳的,相对于某一种特定要求下得到的要求比较合理

如果从路由算法能随着网络的通信量或者拓扑自适应地调整变化来划分,那么就可以分成静态路由选择策略动态路由选择策略。静态路由选择叫做非自适应路由选择,不能及时适应网络状态的变化,由人工配置每一条路由。

动态选择路由叫做自适应路由选择,较好地适应网络状态的变化,实现起来比较复杂,开销也大,动态选择适用于比较复杂的大网络

分层次的路由选择协议

互联网采用的路由选择协议主要是自适应的(也就是动态的)、分布式路由选择协议

可以把整个互联网划分为许多个较小的自治系统(autonomous system),一般都记为AS,自治系统AS是在单一技术管理下的许多网络、IP地址以及路由器,这些路由器使用一种自治系统内部的路由选择协议共同的度量。每一个AS对其他AS表现出来的是一个单一的和一致的路由选择策略,这样的话就可以把路由选择协议分成两大类

  • 内部网关协议IGP(Interior Gateway Protocol):在一个自治系统内部使用的路由选择协议,在互联网中的其他自治系统选用什么路由选择协议无关,如RIP和OSPF
  • 外部网关协议EGP(External Gateway Protocol):如果源主机和目的主机处在不同的自治系统中,这两个自治系统可能使用不同的内部网关协议,那么在不同的自治系统AS之间的路由选择,就需要使用外部网关协议EGP,目前使用得比较多的是BGP-4

注意:这里所说的自治系统并不是一个单一的网络,而是使用了相同的技术架构的一组(一个或者一个以上)的网络组成的一个系统

自治系统之间的路由选择就叫做域间路由选择(interdomain routing)而在自治系统内部的路由选择就叫做域内路由选择(intradomain routing)

如图所示,每个自治系统内部可以决定本自治系统内部运行哪一个内部路由选择协议,而在每个自治系统可能有一个或者多个路由器如图中的R1和R2等需要运行除了本系统内部的路由选择协议以外的外部网关协议。

对于比较大的自治系统,还可以将所有的网络再进行一次划分。例如以链路速率作为标准进行划分

11.静态路由

11.1 路由-网络层实现的功能

网络层的功能就是给传输层协议提供简单灵活的、无连接的、尽最大努力交付的数据包服务

通俗地来说,网络中的路由器为每一个数据包单独选择转发路径,网络层不提供服务质量的承诺

也就是说路由器直接丢弃传输过程中出错的数据包,如果网络中待发的数据包太多,路由器处理不了也会直接丢弃,路由器也不判断数据包是否重复,也不确保数据包按照顺序发往目标地址

网络畅通的条件:数据包有去有回

11.2 静态路由

在初始时,路由器只知道直连的网络地址,但是如果间隔某个节点,也就是目标节点对于这个路由器不是直连的,这个路由器就不知道怎么走了,这时候就需要网络管路员告诉路由器,这个地址该怎么走。

添加静态路由的基本指令

ip route <目标网段> <子网掩码> <出去的地址>
#如果想要单独发送给某个地址id
ip route <目标ip> <255.255.255.255> <出去的地址>

点到点的链路的下一跳可以是路由器的出口

删除路由的基本指令

no ip route <目标网段> <子网掩码> <出去的地址>

11.3 路由汇总与默认路由

路由汇总指的是将一部分具有相同前缀的网络地址的路由网络汇总起来,这样的话边缘理由只需要转发数据包到一个汇总路由上就可以完成转发功能。

简而言之,就是路由器在转发数据的时候,会先检查子网掩码长的,后检查子网掩码短的,这样的话可以保证子网掩码长的ip地址被检查到,否则会因为子网掩码长的ip把子网掩码短的ip给覆盖了而永远检查不到子网掩码长的ip地址。运用最长前缀匹配算法

默认路由

添加默认路由

ip route 0.0.0.0 0.0.0.0 10.0.0.2

其中0.0.0.0这个地址涵盖了所有的网段,是最大的路由,这个路由称为默认路由

默认路由的使用场景

如何理解这个操作呢?我们以路由器B为例,路由器B是一个末端路由器,连接在网段为10.1.0.0/24的以太网的末端上,可以看到B如果要转发数据到其他网段,其必经之路是10.2.0.1/24,那么就存在一种甩锅的手段,也就是说如果我B路由表中查找不到了下一跳地址,那么我就会把这个查询交给我的必由之路,让它去查询有没有,一层层地发过去,直到找到为止。

对于C这种而言,它处于有多边连接的,这种默认路由的选择就是先指定其他路由地址,然后剩下任意一个的时候,把它作为默认路由即可。

12.内部网关协议RIP

内部网关协议RIP(Routing Information protocol)是一个基于距离向量的路由选择协议

RIP协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录(因此,这是一组距离,也就是距离向量,比如说<<R1,2>,<R2,2>>)这样的形式距离的定义如下

  • 从一路由器到直接连接的网络的距离定义为1(从路由器的端口出来,然后发送到网络中)
  • 从一个主机到非直接连接的网络的距离=所经过的路由器数+1
  • RIP中距离也称为跳数(hop count),每经过一个路由器,跳数就+1
  • RIP只允许一条路径最多包含15个网络

注意:其实对于从路由器到直连网络的距离就可以定义为1也可以定义为0,这对最佳路由的选择并没有什么影响

如图所示,这个关于路由器之间的跳数的定义,这里的话并没有说主机之间传递数据

对于主机之间传递数据,有:

在主机之间的距离计算如图所示。

总的来说,就是从一个节点传输到另外一个节点,就是一跳

12.1 RIP协议工作原理

RIP是分布式路由选择协议,它们的共同特点就是每一个路由器都要不断地和其他一些路由器交换路由信息,

  • [1]和哪些路由器交换信息?:仅和相邻的路由器交换信息,不相邻的路由器是不交换信息的
  • [2]交换什么信息:路由器交换的信息就是当前本路由器所知道的全部信息,也就是自己现在的路由表,也就是本路由器到本自治系统中所有网络的最短距离,以及到每个网络应该要经过的下一跳路由器
  • [3]在上面时候交换信息:按照固定的时间间隔交换路由信息,例如,每隔30s,然后路由器根据收到的路由信息更新路由表,当网络拓扑发生变化的时候,路由器也及时向相邻路由器通告拓扑变化后的路由信息,网络中主机也是运行RIP协议的,但是它只能被动地接收来自路由器的信息

路由器在刚刚开始工作的时候,它的路由表是空的,然后路由器就得出到直接相连的几个网络的距离(定义为1)因为跨越了一次,每一个路由器也只和数目非常有限的相邻路由器交换并且更新路由信息,经过若干次的更新之后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址

RIP协议的收敛:在自治系统中所有节点都得到正确的路由选择信息的过程

路由表中最主要的信息

  • 到达某个网络的距离,最短距离
  • 应该要经过的下一跳地址
目的网络 距离(最短) 下一跳地址

12.2 距离向量算法

算法描述

每一个相邻路由器发过来的RIP报文,执行以下步骤

  • [1]对地址为X的相邻路由器发来的RIP报文,先修改此报文中的所有项目,将下一跳字段中的地址都修改为X,并且把所有的距离字段都+1
  • [2]对修改后的RIP报文中的每一个项目,进行以下的步骤
    • [2-1]如果原来的路由表中没有目的网络Net,那么就把这个项目添加到路由表中
    • [2-2]否则,也就是原来的路由表有目的网络Net,这时候查看下一跳的路由地址
      • [2-2-1]如果下一跳的路由地址为X,那么就把原路由表中的项目替换为收到的项目
      • [2-2-2]否则的话就是这个项目是到目的网络Net,但是下一跳的路由地址不是X
        • [2-2-2-1]如果收到的项目中的距离d是小于路由表的距离的,那么就进行更新
        • [2-2-2-2]否则什么都不做
  • [3]如果3分钟还没有收到相邻路由表的更新路由表,那么就把这个相邻的路由器设置为不可达的路由器,也就是把距离设置为16
  • [4]返回

设X是节点A到节点B的最短路径上的一个节点,如果把路径A->B拆成两段路径,也就是A->X、X->B,也就是说每一段路径A->XX->B分别是节点A到X和节点X到B的最短路径

对上述距离向量算法的四点解释

[1]为什么要把下一跳的地址都修改为X?为什么要把距离的字段+1?

这样做是为了便于进行本路由表的更新。假设从位于地址X的相邻路由器发来一个RIP报文中的一个项目是<Net2,3,Y>,意思就是说路由器X如果经过路由器Y的话,那么到Net2还需要3跳,那么本路由器要到Net2必然要经过X,那么也就是多了一跳,也就是我经过路由器X到达Net2还需要4跳,于是根据语义,就把原始的报文修改为<Net2,4,X>供自己的路由表更新使用,注意到原本项目中的Y对本路由器是没有用的,因为这个路由器并没有连接到本路由器上

[2]为什么要将本路由表中没有的目的网络加入到路由表中?

表明这是新的目的网络,应当加入到路由表中

[3]为什么原本路由表中含有下一跳路由地址为X的项目,要用新的项目来替代呢?

因为这是最新的消息,要以最新的消息为准,到目的网络的距离有可能增大或者减小,也有可能没有改变。比如说不管原本路由表中的项目是<Net2,3,X>还是<Net2,5,X>都将要替换为新来的<Net2,4,X>,保证了信息的准确性,从而保证信息是正确的

实例:路由表的更新

已知路由器R6有如表所示的路由表,现在收到来自相邻路由器R4发来的路由更新信息,请你说出R6的路由表是如何更新的?

R6的路由表

目的网络 距离 下一跳
Net2 3 R4
Net3 4 R5

R4发来的路由更新信息条目

目的网络 距离 下一跳
Net1 3 R1
Net2 4 R2
Net3 1 直接交付

第一步,执行+1并且修改下一跳,也就是

目的网络 距离(执行+1) 下一跳(修改为发送RIP报文的路由器地址)
Net1 4 R4
Net2 5 R4
Net3 2 R4

第二步,对照原本的路由表,更新路由表的信息

首先遍历,找到RIP报文中有Net1,而原本路由表中没有Net1,因此需要添加新的项目

找到RIP报文中的Net2,发现有对应的项目,这时候比较下一跳的地址

如果下一跳地址一样,那么就直接替换,这里观察发现RIP报文中的下一跳也是R4,因此直接替换,将距离替换为5

找到RIP报文中的Net3,发现有对应的项目,这时候比较下一跳的地址,发现不一样,执行打擂算法

发现RIP报文中给出的经过R4的距离是更小的,因此直接更新为R4
解题结果:

目的网络 距离 下一跳
Net2 5 R4
Net3 2 R4
Net1 4 R4

实例:使用距离向量算法的路由表生成过程

看图说话

我们以网段192.168.10.0为例进行一个流程的讲述。首先路由器4.0.0.1会收到来自网段192.168.10.0的信息,这时候E0路由器会先将网段192.168.10.0的距离记入路由表,由于是直连的,因此距离为0,然后到了一定的时间片之后,触发RIP协议,相邻路由器之间交换路由表,然后4.0.0.1将路由表交给了B,B路由器开始推算,由于要到达网段192.168.10.0(下称N)是要经过路由器A,而A到网段N是要距离0的,因此B记录下字段目标网络192.168.10.0 距离1 下一跳2.0.0.1,同样,路由表交换到C的时候也是相同的步骤,它推算的依据是B交换过来的路由表

这是基本的工作流程,如果有交换过来的路由表,到达目标网络的距离比当前路由表中的距离要更小,这时候就会打擂替换掉原来的下一跳以及距离。

简单来说,RIP协议选择路由器的标准就是跳数,每隔30秒就更新路由信息,向整个网络中的路由器广播自己,从而达到信息更新的目的

  • RIPv1:靠的是广播信息,不带子网掩码,不支持变长子网,支持等长子网
  • RIPv2:使用的是多播通告,带子网掩码,支持变长子网

12.3 RIP数据包的格式

RIP报文作为运输层用户数据报UDP的数据部分进行传送,使用UDP的端口520

RIP由首部和路由部分组成,在路由部分要写入自治系统号ASN(Automous System Number),这是考虑使RIP有可能受到本自治系统以外的路由选择信息,除此之外还要指出目的网络地址(包括子网掩码)、下一跳的路由地址以及到此网络的距离,这个RIP报文最多可以包括25个路由,如果超过了必须用另外一个RIP报文进行传送。

  • 路由部分:由若干个路由信息组成,每个路由信息共20个字节
    • 地址族标识符(又称为地址类别):这个字段用来标志所使用的地址协议
    • 路由标记填入自治系统的号码
    • 后面是具体路由,指出某个网络地址、该网络的子网掩码、下一跳路由器地址以及到此网络的距离

12.4 坏消息传播得慢

好消息传播得快,坏消息传播得慢,当网络出现故障的时候,要经过比较长的时间才能够将此信息(坏消息)传送到所有的路由器。

现在假定R1Net1的链路出故障了,于是路由器更新路由表,修改项目<Net1,1,直接交付><Net1,16,直接交付>,表示不可达,但是很有可能要经过30s之后R1才把这个更新信息发送发给R2,然而R2可能先把自己的路由表发送给了R1,其中就有<Net1,2,R1>这一项

R1拿到路由信息之后,执行RIP协议,首先将<Net1,2,R1>这个项目修改为<Net1,3,R2>,然后执行比较

比较自己路由表中的信息<Net1,16,直接交付><Net1,3,R2>

这时候发现下一跳地址不一样,就比较距离,发现给过来的RIP报文中的距离更短,于是更新表<Net1,3,R2>

然后更新时间到,发送路由信息到R2,R2收到信息后如法炮制,修改项目为<Net1,4,R1>,比较自己的路由表

<Net1,2,R1>和传过来的<Net1,4,R1>这时候发现下一跳是一样的,因此它是单纯觉得网络拓扑发生改变,于是修改为<Net1,4,R1>

然后回传给R1,R1也执行相同的流程,修改自己的为<Net1,5,R2>

这样一直传来传去,直到两个都增大到16的时候,R1和R2终于直到Net1是不可达的。

但是如果一个理路由器发现了更短的路由,那么这种更新信息就传播得很快

为了使得坏消息传播得快些,可以采取的措施是让路由器记录收到某特定路由的接口,而不让同一路由信息再通过此接口反方向传送。

13.内部网关协议OSPF

13.1 OSPF的基本特点

这个协议的名字为开放最短路径优先OSPF(Open Shortest Path First)。它是为了克服RIP的缺点而出现的,最短路径优先使用了迪杰斯特拉提出的最短路径路径算法SPF

最短路径优先算法

将计算机拓扑图中的节点看作为图中的节点,然后各条链路之间为其指定权值 ,然后从任一点出发,计算从这一条到其他任意点的最小权值和,这就是最短路径优先算法。

OSPF最主要的特征就是使用了链路状态协议(link state protocol),而不是距离向量算法,其特点是:

  • 向本自治系统内的所有路由器都发送信息,使用的方法是洪泛法(flooding),这就是路由器通过所有输出端口向所有相邻的路由器发送信息,而每一个相邻路由器又再将此信息发往其他所有的相邻路由器(不发给发送这个信息的路由器),这样最终整个自治系统内部的路由器都得到了这个信息的一个副本。
  • 发送的信息是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。所谓链路状态就是说明本路由器和哪些路由器相邻,以及该链路的度量,OSPF将这个度量用来表示费用、距离、时延、带框等等,有时为了方便也把这个度量叫做带宽
  • 链路状态发生改变或者每隔一段时间,路由器就要向所有路由器用洪泛法发送链路状态信息
  • OSPF允许管理员设置不同的代价,对于不同的业务可以计算出不同的路由
  • 如果到同一个目的网络有多条相同代价的路径,那么就可以将通信量分配给这几条路径,实现多路径间的负载均衡(load balancing)
  • 所有在OSPF路由器之间交换的分组都具有鉴别的功能,因而保证了仅在可信赖的路由器之间交换链路信息
  • OSPF支持可变长度的子网划分和无分类的编址CIDR
  • 由于网络中的链路状态可能经常发生变化,因此每一个链路状态都带上一个32位的编号,序号越大就越新。

由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库(link-state database),这个数据库实际上就是全网的拓扑结构图,这个拓扑结构图在全网内的范围内都是一致的(这叫做链路状态数据库的同步)

因此,每一个路由器就就可以知道全网网络节点,以及连通情况,其代价等情况。

每一个路由器查询这个链路状态数据库,构建出自己的路由表

而对于RIP而言,它是不知道全网的拓扑结构的

OSPF的链路状态数据库可以较快地进行更新,使得各个数据库能够及时地更新路由表,OSPF的更新过程收敛地快是其重要优点。

为了使得OSPF能够用于大规模的网络,OSPF能够将一个自治系统再划分为若干个更小的范围,叫做区域(area),其好处是把利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个自治系统,这样就减少了整个网络上的通信量。每一个区域内部的路由器只知道本区域内的完整网络拓扑而不知道其他区域的网络拓扑结构。

OSPF使用层次结构的区域划分

在上层的区域叫做主干区域(backbone area):主干区域的标识符规定为0.0.0.0主干区域的作用是连通其他在下层的区域。

其他区域来的信息都由区域边界路由器(area border router)进行概括,如图所示,R3,R4,R7这些路由器都是区域边界路由器,每个区域都应该有一个区域边界路由器

在主干区域内的路由器叫做主干路由器(backbone router),比如说R3,R4,R5,R6,R7,一个主干路由器可以同时是区域边界路由器,在主干区域内还要有一个路由器专门和本自治系统外的其他自治系统交换路由信息,这样的路由叫做自治系统边界路由器

13.2 OSPF的五种分组类型

有以下五种分组类型

(1)类型1,Hello问候分组,其作用是发送和维持邻站的可达性

(2)类型2,DataBase Description数据库描述分组,向邻站给出自己的链路状态数据库中所有链路状态项目的摘要信息

(3)类型3,Link State Request链路状态请求分组,向对方请求发送某些链路状态项目的详细信息,是向对方索要信息

(4)类型4,Link State Update链路状态更新分组,用洪泛法全网更新链路状态

(5)类型5,Link State Acknowledgment链路状态确认,对链路更新分组的确认

OSPF分组格式

OSPF不用UDP而是直接使用IP数据报进行传送,其构成的数据报是很短的,可以减少路由信息的通信量

13.2 OSPF术语

  • Router-ID

网络中运行OSPF协议的路由器要有一个唯一的标识,这就是Router-ID,并且Router-ID在网络中绝对不可以有重复

  • COST(开销)

OSPF协议选择最佳的路径的标准是带宽,带宽越高计算出来的开销越低。到达目标网络的各个链路累计开销最低的,就是最佳路径

  • LINK

就是路由器上的接口,指的是OSPF进程下的接口

  • LINK-STATE

链路状态(LSA)就是OSPF接口上的描述信息,例如接口上的IP地址,子网掩码,网络类型,Cost值等等,OSPF路由器之间交换的并不是路由表,而是链路状态LSAOSPF通过获得网络中所有的链路状态信息信息,从而计算出每个目标精确的网络路径。OSPF路由器会将自己所有的链路状态毫不保留的发给邻居,并且在传递的过程中不会有任何的修改,通过这样的过程,最终,网络中所有的OSPF路由器都拥有网络中所有的链路状态,并且所有的路由器的链路状态应该能描述出相同的网络拓扑

  • Neighbor

OSPF只有邻居才会交换LSA

13.3 OSPF工作流程描述

OSPF规定,每两个相邻路由器每隔10s就要交换一次问候分组,这样就能够确认哪些站是可达的。只有可达邻站的链路状态才存入到链路状态数据库中,在正常的情况下网络中传送的绝大多数OSPF分组都是问候分组。

如果有40s都没有收到某个相邻路由器发来的问候分组,那么这时候就认为这个路由器是不可达的。应该要立即修改链路状态数据库,重新计算路由表。

其他的四种分组都是用来进行链路状态数据库的同步,所谓同步就是指不同路由器的链路状态数据库的内容是一样的,两个同步路由器叫做完全邻接的(fully adjacent)路由器。

如果在物理上相邻而其链路状态数据库不是同步的话,那么就不是完全邻接的

OSPF让每一个路由器用数据库描述分组相邻路由器交换本数据库中已经有的链路状态的摘要信息

摘要信息主要就是指出哪些路由器的链路状态信息及其序号已经写入了数据库,经过与相邻路由器交换数据库描述分组之后,路由器就使用链路状态请求分组,向对方请求发送自己所缺少的某些链路状态项目的详细信息。

通过一系列的这种分组交换,全网同步的链路数据库就建立了。

在网络运行的过程中,只要有一个路由器的链路状态发生了变化,那么这个路由器就要使用链路状态更新分组,用洪泛法向全网广播更新链路状态。

OSPF使用的是可靠的洪泛法,其要点如图所示,设路由器R用洪泛法发出链路状态更新分组,第一次先发给相邻的三个路由器,这三个路由器将收到的分组进行转发的时候,要将其上游的路由器除外,可靠的洪泛法需要在收到更新分组之后发送确认,收到重复的分组时候只需要发送一次确认。

为了确保链路状态数据库与全网的状态是保持一致的,OSPF还规定每隔一段时间,要刷新一次数据库中的链路状态,也就是发送洪泛分组,更新状态

由于一个路由器的链路状态只涉及到了与相邻路由器的连通状态,因此和整个互联网的规模是无关的,而且没有坏消息传播得慢的问题。

注意,这句话是很关键的,如果看得懂,那么就说明OSPF完全懂了

首先我们要知道,运行OSPF的网络中,协议是分布式地运行在每个网络上的,这些节点有几个关键要素

  • 链路连接状态
  • 链路状态数据库

当网络中的拓扑发生变化或者到了30分钟的周期的时候,就会触发更新机制,发送链路状态更新分组,这个分组含有什么信息?含有的是这个路由器的链路连接状态表。

而如果想要达到获取全网的结构的话,那么肯定是各个节点都发送自己链路连接状态表,其他互联网中的其他节点负责转发,最终达到共识,也就是数据库一致。

那么对于这句话来说,链路状态是一个路由器负责的,它负责的是与它相连的节点的链路情况探测,而对于不与它直接相连的链路状态,它只负责转发、存储、达成共识。

如果N个路由器连接在一个以太网上,那么每个路由器要向其他(N-1)个路由器发送链路状态信息,一共会有N(N-1)个链路状态分组要在以太网上传输,对这种多点接入的局域网采用了指定的路由器的方法

也就是选取DR/BR的方法,减少连通的数量

14. 外部网关协议BGP

14.1 协议BGP的主要特点

内部网关协议RIP或者OSPF主要设法使得数据报在一个AS内部尽可能地从源点传送到主站,而BGP需要考虑的问题有:

[1]互联网的规模太大,使得自治系统AS之间的路由选择非常困难,连接在互联网主干网上的路由器,必须能够对任何有效的IP地址都找到匹配的网络前缀,无论是使用RIP协议还是OSPF,所花费的时间代价和空间代价都会非常昂贵。另外,各个AS内部的度量的标准可能不一样。

比较合理的做法是在自治系统之间交换可达性信息,也就是说可到达或者不可到达,一种消息格式就是到达网络前缀N可以经过自治系统AS-1

[2]自治系统AS之间的路由必须考虑有关的策略。自治系统之间的路由选择要允许多种路由选择策略。

基于上述的情况,BGP有如下特点

[1]用于自治系统AS之间的路由选择

[2]只能是力求选择出一条能够到达目的网络而且比较好的路由(不能兜圈子),而并非有一定要计算出一条最佳的路由

[3]在设计上采用了路径向量(path vector)路由选择协议。

RIP:距离向量算法

OSPF:链路状态协议

14.2 BGP路由

在一个自治系统AS中有两种不同功能的路由器

  • 边界路由器(边界网关)
  • 内部路由器

一个AS至少要有一个边界路由器和相邻AS的边界路由器直接相连,因为有了边界路由器,AS之间才能利用BGP协议交换可达性的路由信息。

如图所示,当边界路由器R1R2进行通信的时候,必须先建立TCP连接(端口号是179),这种TCP连接被叫做是半永久性的连接,也就是双方在交换完信息之后依然保持着连接的状态。

R1R2的这种连接就称为eBGP(external)连接,现在边界路由器R1就可以通过eBGP向对等端R2发送BGP路由X,AS1,R1,翻译为,从R1经过AS1可以到达X,注意顺序是倒着来的

<目的地,途径自治系统,经过路由器>,这样,通过eBGP,AS2中的边界路由器R2就知道了到达AS1中的目的网络的BGP路由

但是,仅有边界路由器R2知道这条路由是远远不够的,边界路由器R2应该要把获得BGP路由再转发给AS内部的其他路由器。

因此在内部还需要建立iBGP(internal)连接,iBGP也是使用TCP连接进行数据的传输的,如图(b)所示,它会将获得的BGP路由在iBGP上传送给自己内部的路由器。

协议BGP并非仅允许在AS之间,而且也要运行在AS的内部

同时协议BGP规定,在一个AS内部的所有的iBGP必须是全连通的,即使两个路由器之间没有物理连接,但是它们之间依然会有iBGP连接,逻辑连接

可以根据管理员指定的策略,拒绝掉某些路由,拒绝的方法是收到这种路由后马上删除掉

关于IGP、iBGP、eBGP之间的关系

虽然iBGPeBGP的最后一个字母P是代表Protocol,但是需要指出的是iBGPeBGP并不是两个不同的协议。

  • eBGP在不同的AS的两个对等端上的BGP连接
  • iBGP在同一个AS的两个对等端之间的BGP连接

他们具有相同的报文格式,属性类型,唯一不一样的地方就是在发送BGP路由通告的时候通告的规则有所不同

  • eBGP对等端获得BGP路由,可以通过iBGP告诉同一个AS内部的对等端
    • 这是iBGP存在的最根本的意义,就是转发从外部自治系统来的BGP路由
  • iBGP对等端获得的BGP路由,可以通过eBGP告诉不同AS的对等端。
    • 这是BGP路由产生的一个途径,也就是特定外部自治系统的网络,通过AS内部的路由器,发送到边界路由器,然后通过边界路由器发送到本自治系统的边界路由器。
  • 但是从iBGP对等端收到的BGP路由,不能转告给同一个AS内不同iBGP对等端
    • 也就是说,同一个AS内建立的iBGP,只能是来自eBGP所获得的路由,而内部产生的路由不会通过iBGP进行传输,而是有更加精准的RIP或者OSPF等内部网关协议进行操控。

理解:BGP就是为了更加方便地执行BGP路由交换而产生的,而你iBGP的产生实际上是为了自治系统内部的网络接收eBGP捕获到的路由信息,内部节点产生的BGP路由对于本网络内部的节点来说没有意义。

注:IGP(内部网关协议)

BGP路由的一般格式BGP路由=<前缀,BGP属性>=<前缀,AS-PATH,NEXT-HOP>

  • 前缀:BGP的终点,子网前缀
  • AS-PATH:自治系统的路径,是通过的BGP路由所经过的自治系统,它每经过一个AS,就把自治系统号加入到AS-PATH中,但是不指出中途要通过哪些路由器
  • NEXT-HOP:通过BGP路由的穷点

转发表如何构造?

如图所示,AS2中的边界路由器收到一个BGP路由 <X,AS1,R1>,它就知道了要到达网络X,那么就要经过AS1,而且下一跳是R1,那么对于R4来说,它的转发表应该怎么导出呢?

首先,从定义上来讲,下一跳被定义为起点,但是R1不在AS2里面,R4肯定无法直接转发分组到R1这时候:

R4要把这条BGP路由的起点进行转换,原来的BGP路由可以描述为R1->X

但是不能识别,因此要把起点转换为它能够识别的路由器地址,也就是R2(R1对等端)

因此AS2里面所有的路由器都能够把分组转发到R2,然后就能够再经过R1,最后再到达X。

其次R4要利用内部网关协议,找到从R4到R2的最佳路由的下一跳,我们假设最佳路由的下一跳是R3,那么

R4最终就在转发表中添加了项目<X,R3>

总之,每一个路由器在收到一条新的BGP通告后,都必须执行上述的算法。

实例:BGP路由信息

看图说话

这个图中为我们绘制了两条路由路径,这两条路由路径分别有两个关键发言人,分别是IP3a和IP3c, 我们以这两个关键发言人进行分组

对于IP3a,如果要经过IP3a找到X路由器,那么路由信息描述为[前缀,AS-PATH,NEXT-HOP]

其中:

  • 前缀:指明要到哪一个子网
  • BGP属性:最重要的两个属性,自治系统路径AS-PATH,下一跳NEXT-HOP

那么我要到X这个子网,然后我(AS1)要经过的自治系统的路径是AS2,AS3,我下一跳要发给IP2a。因此表述为[X,AS2,AS3,IP2a]

对于IP3c,那么就是

要到X这个子网,我要经过的自治系统是AS3,我下一跳要发给IP3c,因此描述为[X,AS3,IP3c]

要特别注意的是,这个下一跳是针对于整个自治系统而言的,因此总是边界发言人的端口(下一个自治系统的端口)

14.3 三种不同自治系统AS

在互联网自治AS的数量非常多,可以划分为如图所示的这三类

  • 末梢AS:不会把来自其他AS的分组再转发到另一个AS,必须向所连接的AS付费。
  • 多归属AS:同时连接到两个或者两个以上的末梢AS,增加连接的可靠性(存在冗余通路)
  • 穿越AS:为其他AS有偿地转发分组
  • 对等AS:经过事先协商的两个AS,彼此之间的发送或者接收都不收费

BGP路由是怎么避免兜圈子的?

如上图

  • AS3向AS1通告可到达AS6的BGP-AS-PATH是[AS3,AS6]
  • AS1在收到的BGP属性的BGP-AS-PATH添加自己的AS,也就是[AS1,AS3,AS6],通报给AS2
  • AS2在收到BGP路由之后,向AS3通报属性[AS2,AS1,AS3,AS6]
  • AS3在收到这个BGP路由之后,检查属性中已经有了AS3
    • 如果接收这个路由,并添加上对应的ASN,那么就会有两个AS3,这种情况下就构成了兜圈子的路由
    • BGP为了避免兜圈子,一旦发现出现相同的BGP就马上删除这个路由

14.4 BGP的路由选择算法详解

如果从一个AS到另外一个AS中的前缀X有两条以上的路由可以选择,那么就可以根据以下的原则进行选取。

本地偏好(LOCAL-PREF)值最高优先

在BGP路由中有一个选项叫做本地偏好,在属性中记录为LOCAL-PREF,本地偏好就说从本AS开始,到同一个前缀的不同BGP路由中,选择一个比较好的路由

如果从几条BGP路由中找不出本地偏好值最高的路由那么就执行下一条

AS数跳数最小优先

如图所示,从AS1AS5一共有两条路径,假设这两条路径的本地偏好值相同,那么就根据AS跳数最小的原则进行路由的旋转,如图所示,从上面那条走需要通过2个AS,而从下面走需要经过1个AS,因此选择下面这条

热土豆路由选择算法

如果按照前两种方法都无法选择,那么就在要进入BGP路由的AS,执行热土豆路由选择算法

BGP路由1:从R3离开AS1然后进入到AS2,再到AS3

BGP路由2:从R4离开AS1然后进入到AS4,再到AS3

这两条路径的本地偏好是相同的,同时它们经过的AS个数也是相同的,那么在这种情况下,AS1的每个路由器,都应该采用热土豆路由选择算法。

这时候要让分组经过最少的转发次数离开本AS,就要使用内部网关协议OSPF/RIP,对于不同的路由器,其得出到的结果是不一样的。

对于R1如果要使得转发的分组尽快离开AS1,那么应该要选择R4作为其下一跳,因此决策为BGP2

对于R2如果要使得转发的分组尽快离开AS1,那么就要选择R3作为下一跳,也就是BG91

路由器BGP标识符的数值最小的路由

当以上三种方法都失效的时候,就可以使用BGP标识符来选择路由,在首部中是4个字节,记作为BGP ID,被赋予一个无符号整数作为运行BGP的路由器的唯一标识符当具有多个接口的时候,使用该路由器中IP数值最大的那个

14.5 BGP的四种报文

当只需要在BGP路由发生变化的时候,才更新有变化的部分,规定了4种报文

  • OPEN(打开):用于与BGP连接对等端建立关系

相互识别对方,协商与一些协议的参数,连接建立后发送的报文,收到OPEN报文后的对等端发回KEEPALIVE来接受这个BGP连接

  • UPDATE(更新):用来通告某一路由的信息,以及列出要撤销的路由

用来撤销它以前曾经通知过的路由,或者宣布增加新的路由,可以撤销多条,但是增加只能增加一条

  • KEEPALIVE(保活):用来周期性地证实与对等端的连通性

报文只包含有BGP报文的通用首部(19个字节)

保持时间计时器:每收到一个BGP报文,这个计时器就重置一次,如果在商定的时间内没有收到对等端发来的任何一种BGP报文,那么就认为对方已经不能工作。

  • NOTIFICATION(通知):用来发送检测到的差错

怎么解决坏消息传递得慢的问题?

当某个路由器或者链路出故障的时候,可以不止从一个邻站获得路由信息,很容易选择出新的路由

15. 路由器及其构成

15.1 路由器的结构

路由器工作在网络层,是一种具有多个输入端口和多个输出端口的专用计算机,用于设备的互联,是互联网中的关键设备。

路由器的主要工作,进行转发分组,把从某个输入端口收到的分组,按照分组要去的目的地(也就是目的网络),把该分组从路由器的某个合适的输出端口转发给下一跳路由器

在这张图中,输入端口和输出端口里面都各有3个方框,用方框中的1,2,3分别代表的是物理层,数据链路层,网络层的处理模块

物理层负责比特的接收

数据链路层协议负责接收传送分组的帧

在剥去帧的首部和尾部之后,分组就被送入到网络层的处理模块

如果收到的帧是路由器之间交换路由选择信息的分组,那么就把这种分组送交到路由器的路由选择部分中的路由选择处理机。

如果接收到的是数据分组,那么就按照分组首部中的目的地址查找转发表,根据得出的结果,分组就经过交换结构到达合适的输出端口。

路由器整体来说可以分为两部分,一部分可以分为分组转发部分,一部分可以分为路由选择部分

  • 路由选择部分、控制部分、控制层面

核心构件是路由选择处理机,路由选择处理机的任务是根据所选定的路由选择协议构成出路由表,经常定期地和相邻路由交换路由信息而不断更新和维护路由表

  • 数据层面

由三部分组成:交换结构、一组输入端和一组输出端口

它决定了路由器收到分组之后,如何处理这些分组,将这些分组存储在何种机构当中,并且解释了为什么会有丢包现象的产生(这是因为分组被收到之后,如果存储设备无法存储下所有的分组之后,对于后续来的分组就会将其丢弃。)

  • 交换结构:根据转发表对分组进行处理,对某个输入端口进入的分组从一个合适的输出端口转发出去
  • 转发:就是路由器根据转发表把收到的IP数据报从路由器合适的端口转发出去,转发仅仅涉及到一个路由器
  • 路由选择:涉及到很多路由器,路由表示许多路由器协同工作的结果
  • 转发表:是由路由表得出的,转发表必须包含完成转发功能所必须的信息,必须包含要从要到达的目的网络到输出端口和某些MAC地址信息(如下一跳以太网)的映射
  • 路由表:一般仅包含从目的网络到下一跳的映射

在讨论转发原理的时候,经常不讨论转发表和路由表的区别,通常都可以用路由表来表达

路由器进行分组转发的整个流程

从线路中接收分组,从输入端口接收比特(物理层工作),然后对于数据链路上包装而来的数据进行首部和尾部的剥除。

然后就开始网络层的解析,若收到的分组是交换路由信息的分组,送交路由选择处理机

如果收到的是数据分组,按目的查找转发表,根据得出的结果,经过交换结构到达合适的输出端口,若某分组正在查找转发表,则该分组排队等待。

接着就是分发到其他路由器/网络了,输出的端口会从交换结构中接收分组数据,当交换结构传输数据的速度过快而输出端口的输出速度跟不上的时候,这时候就会启用缓存队列,依次地将各个分组通过输出端口输出到外部,当分组处理的速率赶不上分组进入队列的速率的时候,队列满的时候,就会丢弃后面进入的分组

15.2 交换结构

交换结构是路由器的关键构件,正是这个交换结构把分组从一个输入端口转移到某一个合适的输出端口

如果存储器的带框读或者写是每秒M个分组,那么路由器的交换速率一定小于M/2,这是因为存储器对分组的读和写需要花费的时间是同一个数量级

交换结构一般有三种存在形式

  • 通过存储器进行交换,类似于缓冲队列

这种与早期的路由器的区别就是,目的地址的查找和分组在存储器中的缓存都是在输入端口中进行的

而早期的路由器对分组的处理是将分组复制到存储器中才进行首部的提取的

  • 通过互联网络进行交换,类似于交换机设备

通过纵横交换结构进行交换,这种交换机构通常叫做互联网络,它有2N条总线,可以使得N个输入端口和N个输出端口相连接,取决于相应的交叉节点是使得水平总线和垂直总线是接通还是断开,当输入端口收到一个分组的时候,就把这根分组发送到与该输入端口相连的水平总线上,如果通向所要转发的输出端口的垂直总线是空闲的,那么就把这个节点与水平总线接通,然后把该分组转发到这个输出端口。

如图所示,一个分组从I1到达交换结构,一个转发到O2,因此那个小绿点就闭合,如果这时候有一个分组想要从I1进来O3出去,那么这时候不会导致阻塞,水平方向上可以同时进行,如果输出端口被占用了,那么分组必须在输入端口进行排队等待

  • 通过总线型设备进行交换,类似于集线器设备

数据报从输入端口通过共享总线直接传送到合适的输出端口,而不需要路由选择处理机的干预,但是由于总线是共享的,因此在同一个时间只能有一个分组在总线上传送,当分组到达输入端口的时候发现总线正忙,则IO操作被阻塞,无法通过交换结构

16.VPN和NAT技术

  • 公网地址:公有地址和管理由Inter NIC负责,各级ISP使用的公网地址都需要进行申请,这样就能保证地址块不冲突
  • 私网地址:创建IP寻址方案的人也创建了私网IP地址,这些地址可以被用于私有网络,在Internet没有这些IP地址,Internet上的路由器也没有到私有网络的路由表

在机构内部使用的计算机可以由本机自行分配其IP地址,仅在本地机构使用有效的IP地址

但是如果随便选择一些IP地址作为本机构内部使用的本地地址,那么在某种情况下就会导致一些麻烦

比如说机构内部的IP和互联网上的某些IP一样,这时候就产生错误。

为了解决这个问题,保留了一些专用地址(private address),这些地址只能用来进行机构内部的通信而不用来与互联网上的主机进行通信,在互联网中的所有路由器,对目的地址是专用地址的数据报一律是不转发的。

  • 10.0.0.0/8:从10.0.0.0到10.255.255.255(A类网络)
  • 172.16.0.0/12,从172.16.0.0到172.31.255.255(16个连续的B类网络)
  • 192.168.0.0/16,从192.168.0.0到192.168.255.255(256个连续的)

采用这样专门的IP地址的互联网络被叫做专用互联网或者本地互联网,这些专用地址仅在本机构内部使用,专用IP地址也叫做可重用地址。

16.1 VPN技术

利用公用的互联网作为本机构各专用网之间的通信载体,这样的专用网叫做虚拟专用网(Vitural Private Network),如果专用网不同网点之间的通信必须通过公用的互联网,但是又有保密的要求,那么所有通过互联网传送的数据都必须进行加密,VPN能够在效果上做到和真正的专用网一样,好像形成了一条专属的通信线路为机构所用。

如果要组件VPN,那么必须购买相应的硬件和软件进行配置。

使用隧道技术实现虚拟专用网

XY在场所A和B建立了专用网,现在这两个场所需要通过公用的互联网构成一个VPN

显然,每个场所都必须有一个路由器具有一个合法的全球IP地址,在内部的接口是专用网的地址

在场所A或者B的内部的通信量都不经过互联网,但是如果场所A的主机X和另一个场所B的主机Y通信,那么就必须经过路由器R1R2

比如说,主机X向主机Y发送的IP数据报的源地址是10.1.0.1而目的地址是场所B的10.2.0.3,这个数据报首先作为本机构的内部数据报从X发送到与互联网连接的R1,R1在收到这个数据报之后,发现其目的网络必须通过互联网才会到达,就把整个内部数据进行加密,然后重新加上数据报的首部(把原本的IP数据报看作是数据部分),封装为:源地址是125.1.2.3而目的地址是目的路由器R2的全球地址194.4.5.6,路由器R2收到数据报之后将其数据部分去除进行解密,恢复出原来的内部数据报10.2.0.3

最终在专用网内部进行传送,交付到主机Y,

由场所A和B的内部往来所构成的虚拟专用网VPN又称为内联网VPN

和某些外部机构参与的,叫做外联网VPN

远程接入VPN:可以在个人的电脑与机构的服务器建立VPN隧道

16.2 NAT技术

VPN解决的是两个跨互联网的专用网主机如何通信

而NAT技术解决的是专用主机如何和互联网上的主机进行通信

简单来说,NAT就是提供一个转换技术,内网使用一个私有的网段地址,当要与互联网通信的时候,将私有的地址转换为公网地址,让公网地址去与外部通信。

NAT技术需要专用网络连接到互联网的路由器上安装NAT软件,装有NAT软件的路由器叫做NAT路由器,它至少需要一个有效的外部地址

来回顾一下私网与公网的交互过程,首先就是私网的计算机要与公网的计算机进行通信,那么必然就要发送分组,分组中会包装源地址和目的地址,假设我们包装私网的IP去访问公网,是没问题的,因为路由器的特性决定了我只关注你要去哪里,而不关注你从哪里来,因此尽管你这个私网地址是无法从公网到达的,我也能将数据报发送到公网的计算机去。

然后公网的计算机要响应数据给私网的计算机了,这时候路由器就会蒙圈,因为你之前用的是私网的IP路由器转发表中并没有私网的IP啊,这时候响应的数据就会发不回去,就会出现ping失败的现象。

那么怎么办呢?提供一个可在路由转发表的公网IP,作为私网的数据出口,每一个要与公网通信的私网IP都通过此路由器,将私网IP修改为公网IP,然后依次转发,这样就能确保响应数据的时候,数据能够回来。

image-20221215235223224

专用网192.168.0.0是专用网地址

NAT路由器的全球地址是172.31.1.5

NAT路由器收到从专用网内部的主机A发往互联网上主机B的IP数据报①(S(192.168.0.3),D(213.28.2.4))

NAT路由器通过内部的NAT转换表,将专用网的IP地址192.168.0.3转换为全球IP地址172.38.1.5后改写到数据报的首部作为新的源地址,然后将新的IP数据报②(S(172.38.1.5,D(213.28.2.4)))

主机B收到数据报之后,发送应答③(S(213.18.2.4),D(172.38.1.5))

当NAT路由器收到应答③,还要进行一次IP地址的转换,通过NAT转换表,把收到的B发来的应答还原为原本A的地址,也就是内部数据报④(S(213.18.2.4),D(192.168.0.3))然后发送到A

专用网的内部的主机不能直接充当服务器使用,因此NAT并不能节省IP地址

为了更加有效地利用NAT路由器上的全球IP地址,目前常用的NAT转换表把运输层的端口号也用上了,这样就可以使得多个拥有本地地址的主机,共用NAT路由表上的一个全球IP地址,因而同时可以和互联网上的不同主机进行通信。

使用端口的NAT又叫做网络地址与端口号转换NAPT

如图所示,对于不同的IP地址和端口号组合,当传送到NAT路由器的时候,会做对应的转换

17.IP多播(不考)

17.1 基本概念

  • 多播(multicast):一对多通信,从一个源点发送到多个终点

在网络上进行多播就叫做IP多播,互联网范围内的多播要依赖于路由器进行实现,能够运行多播协议的路由器称为多播路由器,多播是单播的扩展,多播路由器也支持普通的单播。

  • 多播IP地址:在IP多播数据报的目的地址需要写入多播组的标识符,多播组的标识符就是IP地址中的D类地址(多播地址),地址范围:224.0.0.0~239.255.255.255,每一个D类地址标志一个多播组

多播数据报

目的地址:使用D类的IP地址

协议字段=2,表示使用网际组管理协议IGMP

尽最大努力进行交付,不保证一定能够交付多播组内的所有的成员

对多播数据报不产生IGMP差错报文,在Ping多播地址后将永远不会收到回应。

17.2 在局域网上进行硬件多播

17.3 网际组管理协议IGMP和多播路由选择协议

网际组管理协议IGMP:使得多播路由器知道多播组成员信息(有无成员)

多播路由选择协议,使得多播路由器协同工作,把多播数据报用最小代价传递给多播组的所有成员

IGMP的作用是使得多播路由器知道多播组成员的信息,也就是及时通报知道本地局域网上是否有主机参加或者退出了某个多播组,IGMP不知道IP多播包含的成员数,也不知道这些成员都分布在哪些网络上

IGMP的工作流程

第一阶段:加入多播组,当某个主机加入多播组的时候,该主机向多播组的多播地址发送IGMP报文,声明自己要成为该组的成员,本地的多播路由器收到IGMP报文之后,将组成员关系转发给互联网上的其他多播路由器

第二阶段:本地多播路由器周期性地探询本地局域网上的主机,以便知道这些主机是否组的成员,只要对某个组有一个主机进行了响应,那么多播路由器就认为这个组是活跃的。但是如果一个组在经过几次的探询之后没有主机进行响应,则不再将该组的成员关系转发给其他的多播路由器。

课后练习题

4-19

这道题考察的是关于子网划分的相关内容

4000台主机,平均分布在16个地点,如果每一个地点划分为一个子网,那么每一个子网的可用地址应该要有4000/16=250个地址,由255>250>128因此划分成的子网的主机号至少要有8

题目中给的网络地址是129.250.0.0/16,也就是

129.250.0.0
1000 0001.1111 1010.0000 0000.0000 0000

通过观察,可见16位均可用来分配,而至少需要8位的主机号,需要划分为16个子网,

地点 子网前缀 IP最小值 IP的最大值
1 129.250.0.0/8 129.250.0.1 129.250.0.254
2 129.250.1.0/8 129.250.1.1 129.250.1.254
3 129.250.2.0/8 129.250.2.1 129.250.2.254
4 129.250.3.0/8 129.250.3.1 129.250.3.254
5 129.250.4.0/8 129.250.4.1 129.250.4.254
6 129.250.5.0/8 129.250.5.1 129.250.5.254
7 129.250.6.0/8 129.250.6.1 129.250.6.254
8 129.250.7.0/8 129.250.7.1 129.250.7.254
9 129.250.8.0/8 129.250.8.1 129.250.8.254
10 129.250.9.0/8 129.250.9.1 129.250.9.254
11 129.250.10.0/8 129.250.10.1 129.250.10.254
12 129.250.11.0/8 129.250.11.1 129.250.11.254
13 129.250.12.0/8 129.250.12.1 129.250.12.254
14 129.250.13.0/8 129.250.13.1 129.250.13.254
15 129.250.14.0/8 129.250.14.1 129.250.14.254
16 129.250.15.0/8 129.250.15.1 129.250.15.254

4-22

这道题考察的是构造超网的技术,这道题的解决算法如下

首先将地址块分别用二进制进行表示

1101 0100.0011 1000.(1000 0100).0000 0000
1101 0100.0011 1000.(1000 0101).0000 0000
1101 0100.0011 1000.(1000 0110).0000 0000
1101 0100.0011 1000.(1000 0111).0000 0000

可以看到其地址前缀统一是

1101 0100.0011 1000.1000 01

那么就将子网掩码左移两位

1101 0100.0011 1000.1000 0100.0000 0000
#212.56.132.0/22

聚合后的网络前缀是212.56.132.0/22,子网掩码为255.255.252.0

4-26

这道题考察的是划分子网的相关知识,一般来说做题步骤为

  • 根据主机数确定每个子网所需要的主机号的位数
  • 从大到小,依次划分子网

在划分子网的过程中特别需要注意哪些IP是不能用的,哪些IP是能用的

由公司分配到的网络前缀是192.77.33.0/24,那么也就是后8位可供作为子网划分,由于前面24位是不变的,因此我们重点讨论后8位的情况。

  • 因为LAN1需要50为50个主机分配IP地址,由64>50>32,因此LAN1需要6位的主机号

LAN1分配00/26的子网,也就是192.77.33.00/26

后八位中,可用的子网还有

01/26
10/26
11/26
  • 因为LAN3需要28个主机,由32>28>16,因此LAN3需要5位的主机号

选用01/26划分子网,划分为

01/26 =>{010/27,011/27}

选用010/27作为LAN3的网络前缀,也就是192.77.33.64.0/27

可用的子网还有

10/26
11/26
011/27
  • 因为LAN8需要25个主机,由32>25>16,因此LAN8需要5位主机号

于是使用011/27,也就是192.77.33.96/27

可用的子网还有

10/26
11/26
  • 由于LAN6需要20个主机,由32>20>16,因此LAN6需要5位主机号

于是使用10/26进行子网的划分,也就是

10/26=>{100/27,101/27}

100/27分配给LAN6,也就是192.77.33.128/27

可用的子网还有

101/27
11/26
  • 由于LAN7需要20个主机,由32>20>16,因此LAN7需要5位主机号

于是使用101/27分配给LAN7,也就是192.77.33.160/27

可用的子网还有

11/26
  • 由于LAN2LAN4需要相同的主机数,因为16>10>8,因此需要4位主机号

于是使用11/26进行划分,也就是

1100/28
1101/28
1110/28
1111/28

可将1100/28分配给LAN2,也就是192.77.33.192/28

可将1101/28分配给LAN4,也就是192.77.33.208/28

可用的子网为

1110/28
1111/28
  • 由于LAN5还需要4个主机号,由于4==4<2,如果仅分配2位的主机号,由于广播地址和网络地址的特殊地址的用途,仅用2位主机无法分配,因此至少需要3位主机号

于是使用1110/28进行划分

1110/28=>{11100/29,11101/29}

使用11100/29分配给LAN5,也就是192.77.33.224/29

最终还未分配的网络前缀有

1111 0000 /28
1110 1000 /29

也就是

192.77.33.240/28192.77.33.232/29没有使用。


文章作者: 穿山甲
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 穿山甲 !
  目录