更新于
2024-04-29 20:32:48
不同于电信网络面向连接的通信方式,网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。
也就是说网络层不提供服务质量的承诺。
1. 网际协议: 协议
协议是用来使互连起来的**许多计算机网络(网络之间,网际)**能够进行通信的。
1.1 虚拟互连网络
在市面上有很多种性能不同、不同网络协议的网络,供不同的用户选用。
从一般的概念讲,将网络连接在一起需要一些中间设备。
(1) 物理层使用的中间设备叫做转发器(repeater)。
(2) 数据链路层使用的中间设备叫做网桥或者桥接器(bridge)。
(3) 网络层使用的中间设备叫做路由器(router)。
(4) 在网络层以上使用的中间设备叫做网关(gateway),用网关连接两个不兼容的系统需要在高层进行转换。
网关的使用非常复杂,因此如今使用的很少了。转发器和网桥是在物理层和数据链路层拓展网络,但这只是把一个网络扩大了,并没有产生新的网络。
因此讨论网络互联一般就指用路由器进行网络互连和路由选择。
如果参加互连的计算机网络都是用同一种网际协议,那么可以忽略这些网络本身客观存在的异构性,而把它们都看成是一个虚拟互连网络相连接的。
协议使得性能各异的网络看上去就像是一个统一的网络。看不到每个网络具体的细节。
1.2 地址
1.2.1 分类的地址
把网络分为这5个类。
类别 | 开头 | 网络号范围 | 主机号范围 |
---|---|---|---|
A | 0开头,8位网络号 | ||
B | 10开头,16位网络号 | ||
C | 110开头,24位网络号 | ||
D | 1110开头,多播地址 | - | - |
E | 1111开头,未用 | - | - |
注意类每类第一个网络号[最小的网络号]都是不可用的,并且类的网络号用作本地软件的环回测试。
特别的类地址中的网络号为的网络,名为,表示这个网络。
主机号全0表示该网络本身。主机号全1表示广播。
特殊的:
网络号 | 主机号 | 是否可做源地址 | 是否可做目的地址 | 用处 |
---|---|---|---|---|
全0 | 全0 | 是 | 否 | 本网络的本主机(this) |
全0 | host-id | 是 | 否 | 本网络(this)的host-id主机 |
全1 | 全1 | 否 | 是 | 只在本网络上广播 |
net-id | 全1 | 否 | 是 | 在net-id上广播 |
127 | 非全1也非全0 | 是 | 是 | 本地软件环回测试(端口转发) |
1.2.2 子网的划分
2级利用率非常低,原因就在于被分配了某一级地址以后,该级别的地址的主机号往往用不完。另外2级地址也不够灵活,没办法立刻在一个地区新开一个网络。
于是1985
年在原来二级的基础上增加一个子网号字段
。使二级地址变为级地址。主要的做法是把一个网络分割成几个小的子网,但是对外仍然表现出同一个大网络的特性。
子网划分是建立在分类的基础上。这些子网对外仍然表现为一个大网络,然而当数据报传到大网络后,又会被路由器分开送到不同的子网。实现的方式是使用子网掩码(subnet mask)
在子网划分中,子网号一般不全0全1。
以划分一个类地址为例,假设子网位数是位,那么子网个数为个,主机个数为个。总共有个可分配地址。比不划分子网要少一些
子网划分提升了分配的灵活性,但是是以减少可以在网络上连接的主机数量为代价的。
1.2.3 无分类编制[构成超网]
1.2.3.1 划分
无分类编制不基于地址分类,是一种2级。
使用子网掩码把网络分为:
另外也可以直接用斜线记法,记为这样的记法。
网络前缀都一样的地址构成一个**地址块**。
编址就没有子网号全为0这样的概念,因此位网络前缀就有个网络号,
另外,编码方式还有其他简写方式:
比如可以表示为(把网络前缀用2进制表示后,表示主机号任意。)
使用了划分得到大网络以后,可以继续使用进行二级、多级划分。
1.2.3.2 地址聚合
也可以继续多级划分,就会造成网络号还是非常多,路由器查找、存储非常慢。地址聚合指的是在路由器表中,路由器往往会把一些处于同一个大的网络的并且下一跳都是同一个路由的表项聚合到一起,有效地减少表项。
在路由时,如果有很多表项都能够匹配成功,则选择网络前缀最长的那一个表项。
网络聚合时往往也是寻找的最长公共网络前缀。而且要注意网络聚合的时候不能有父网络和其子网络的聚合[重叠]。不能引入其他的网络。
1.2.3.4 二叉线索查找路由表(树)
具体看书…似乎和trie树几乎一致。
有时会为这棵树做压缩,压缩掉公共路径部分,以提高查找速度。
另外,地址聚合实际上就是在这棵树上查询。
1.2.4 地址和物理地址
物理地址()是物理层和数据链路层使用的地址,而地址是网络层及以上使用的逻辑地址。
但从网络层上看,协议把下层复杂的细节全屏蔽了,只是用单一的、抽象的地址进行通信,这极大简化了互联网的传输过程。
但数据报在数据链路层进行传输时就变成帧(frame),只能使用物理地址(),在跨局域网时会变。
另外在数据报传输时有以下几个特点:
- 网络层上只能看到数据报,源地址和目的地址根本不变
- 尽管数据报中有源地址,但是路由选择时只看目的地址。
- 数据链路层中只能看见地址,每当从一个主机/路由器转发到另一个主机/路由器时,主机/路由器都要封装帧,把源和目的都告诉数据链路层。
要解决的问题有:
- 主机/路由器如何根据得到要发送的帧的目的(协议)
- 路由器/主机如何在只知道最终目的的情况下找到下一跳()
1.2.4.1 协议
地址解析协议通过地址解析出局域网内的目的地址,过去还有逆地址解析协议,通过地址解析出地址。
协议在每台主机/路由器中都设立一个缓冲区,表中存放了地址向地址的映射,以及**生存时间**。
1.2.4.1.1 同一局域网下
当终端(可以是主机,也可以是路由器)要向同一局域网中的终端发送数据报时,协议的基本工作模式是:
- A查找自身的ARP缓冲区,如果A中缓冲区存在B的表项,则直接根据表映射出的地址,结束
- 如果缓冲区中没有的表项,则向局域网内所有终端广播请求分组,内容是,请问的终端的地址是?
- 非终端都无视该帧,而主机发现此数据报文是发送给自己的,则收下这个数据报,并且回复给一个单播的响应分组,内容是我的地址是xx.xx.xx.xx,是XX-XX-XX-XX
- 主机收到的响应分组后,就在自己的缓冲区里更新的到的映射,并且也知道了的相关信息,因此再发送数据报就很方便了!
1.2.4.1.2 不同局域网下
实际上,不同局域网中的和通信时,是没办法通过协议解析出的地址的,因为没有必要解析的出来,只需要把数据报转发给可以转发数据报的路由器即可。要做的事情应该是根据下一跳的地址解析出该终端的地址,这个过程还是在同一个局域网下的。
所以每次跳转的时候重复同一局域网下的过程就能完成不同局域网下的协议工作过程。
通过协议让网络通信时要完成的复杂物理地址的转换变得很透明,只需要主机和的有独立的,就好像和连在同一个网络下。
1.2.5 数据报的格式
字段值 | 位数/字节数 | 说明 |
---|---|---|
版本 | 4/0.5 | 。通信双方的IP版本必须一致! |
首部长度 | 4/0.5 | 指示首部长度为个字节,由于首部至少20字节,所以值域在之间(首部最长60字节!且首部长度一定为4字节的倍数!) |
服务类型 | 8/1 | 只有在区分服务(Differentiated Services)下才使用 |
总长度 | 16/2 | 指示首部+数据部分一共有个字节,值域 |
标识 | 16/2 | 指示该数据报属于哪一个数据报,而不是该数据包属于源数据报的 |
标志 | 3/- | 分别是,以及一位空闲。 |
片偏移 | 13/- | 指示该数据报的数据部分(只有数据部分)在源数据报中起始位置处于字节处,(每个分片大小都是个字节的整数倍) |
生存时间 | 8/1 | ,指示仍能跳的次数,值域为,则丢弃该数据报,1表示该局域网内的数据报 |
协议 | 8/1 | 用协议指示该数据报传输的是上层协议中的哪一种,具体见协议-id表。 |
首部校验和 | 16/2 | 使用反码算数加法+变为反码的方式算出校验和。使用同样的方式在接收端校验,全0则视为无差错。 |
源地址 | 32/4 | 源地址 |
目的地址 | 32/4 | 目的地址 |
可选字段 | 0-320/0-40 | 补充字段,可自己选用,但是会影响传输效率一般不用。注意一定要全0填充为4字节的整数倍!!! |
下层的数据链路层帧有最大传送单元的限制,数据报就不能无限制地长,要通过分片的方式切分数据报文,这也就是数据报首部存在的意义。
数据报尽可能长会让传输效率变大(),但是在路由器转发时会让速度下降。数据报长度比较短能在转发时速度变快。
协议规定,任何主机/路由器都至少能处理字节的数据报,576字节以下的数据报不用分片就一定可以处理,但是576字节以上的数据报就要先了解途径的路由器/主机的处理能力。
数据报中的标志字段有字段,只有当时该数据才允许分段,而表示该数据报后还有其他分片数据报。同一个源数据报的不同分组都具有同一标识,并且用片偏移确定当前分片的数据部分在源数据报中的位置。
通过标识和片偏移就能够在接收端恢复出源数据报。
请特别注意每个字段的单位是什么:
首部长度: 4字节 总长度: 字节 片偏移: 8字节
另外,还有标识上层协议的协议-表:
协议名 | ||||||
---|---|---|---|---|---|---|
协议 | 1 | 2 | 4 | 6 | 17 | 41 |
其中指的是该数据报是由,(有2个首部?)
1.3 网络层的分组转发
1.4 网际控制报文协议
的所有信息都被封装在数据报内,包括自身的首部。
的首部包括类型、代码、校验和,以及额外的4个字节。首部是所有报文都不变的。
其中报文的类型主要分**差错报告报文和询问报文**。
的校验和校验的是整一个报文!不是只有首部!
1.4.1 差错报告报文
主要有:
- 报文不可到达
- 超时(TLL=0)
- 报文参数有误
- 重定向
这几种差错。
对于差错报告报文的数据部分,取的是:出错的数据报的首部[定位该出错数据报]和该数据报数据字段的前8字节[和协议中的端口号]
然鹅,并非所有出差错的数据报都需要发送差错报告报文,
比如:
- 对装有差错报文的数据报不再发送差错报文
- 除了分片的第一个数据报以外,其余所有后续的数据报都不再发送数据报
- 多播数据报都不发送数据报
- 对具有(应该包括源地址和目标地址)的特殊地址的数据报都不再发送数据报。
1.4.2 询问报文
主要有:
- 回送请求和回答报文: 由主机或路由器询问另一台特定目的主机,需要由该目的主机回答自己的有关状态。用这种方式来获得目的主机的是否可达和有关状态。
- 时间戳请求和回答报文: 请某台特定目的主机回答自己的时间戳,在时间戳回答报文里有一个位的字段,表示从到当前经过的秒数。用这种方式进行时钟同步和时钟测量。
1.4.3 的应用
1.4.3.1 ping
命令
ping
命令是一个应用回送请求和回答报文的例子。
发起ping
的主机一下子发送个回送请求报文,而接受方响应这个请求报文并且回答报文。
由于往返的报文都带了时间戳,因此也很容易得出往返时间。
1.4.3.2 tracert
命令(中为tracerroute
)
tracert
命令主要应用的是差错报告报文中的超时这一种报文。
发送方依次发送的报文,并且该报文的端口号是非法的,也就是不能交付的。
的报文在发送给第一个路由器后,变为0,因此由发送超时报文给发送主机。
的报文在发送给第一个路由器后,变为0,因此由发送超时报文给发送主机。
的报文在发送给最后一个路由器后,变为0,因此由发送超时报文给发送主机。
的报文在发送给最后路由器后,变为1,该报文是可以转发到目的主机上的!但是因为源报文是不可交付的,目的主机收到报文后,会发送一个目的不可达差错报告报文。
有这个过程,就得到了发送方到目的主机上的所有路由器和最后的目的主机的。
1.5 路由选择协议: 路由器中的路由表从何而来
希望有一个理想的路由选择算法,它:
- 必须是正确且完整的
- 计算简单
- 能够适应网络状况和网络拓扑的变化
- 算法应该稳定
- 算法公平
- 算法在某一种角度下是”最佳”的
路由选择分为静态路由选择策略(人工设置)和动态路由选择策略(自适应路由选择)。
一般路由选择总会分层次,把一个大网络分为较小的自治系统(Autonomous System)。
自治系统(Autonomous System)指的是在单一技术管理下的一组路由器。
让一个自治系统对同层次的都表现为一个单一的、一致的路由选择策略。原因在于:
- 网络规模比较大,如果每个路由表中存放了这个大网络的所有网路,那路由表会很大,浪费时间和效率
- 某些子网络部分并不希望其他部分知道内部网络的状况,但也希望能连接到互联网上。
在分层次的网络上进行路由选择就有2种形式:
- 内部网关协议(Interior Gateway Protocol): 在域内进行路由选择
- 外部网关协议(External Gateway Protocol): 在域间进行路由选择 [注意: 每一个中至少有一个或多个路由器要运行协议和其他交换路由]
比如在内部进行路由选择就是域内路由选择。
而与其他相连接的路由器则需要进行域间路由选择。
如果一级划分的仍旧很大,达不到需求,可以进行二级甚至是多级划分。
1.5.1 内部网关协议
1.5.1.1 路由信息协议
是一种分布式的基于距离向量的路由选择协议。但是很少被使用。它最大的特点是简单,开销很小。
协议定义距离:
- 从一路由器到直接连接的网络的距离定义为1。
- 从一路由器到非直接相连接的网络的距离定义为经过的路由器数+1。
- 定义距离为16及以上就为不可达。
要求路由器不仅记录网络号
和下一跳地址
,还要为每一表项记录到该网络的距离
。
那么的路由表大致长这样:
网络号[注意:网络号往往携带子网掩码信息] | 到该网络的距离 | 下一跳地址 |
---|---|---|
如此一来,协议就能够选择一条经过最少路由器的一条路径。
1.5.1.1.1 如何交换信息
交换信息的要点是:
- 和谁交换 协议要求每个路由器仅和直接相邻的路由器交换信息。
- 交换什么样的信息 整一个路由表中所有的信息,就是”我到本自治系统中所有网络的(最短)距离,下一跳的地址”。
- 什么时候交换 按照固定的时间间隔交换信息,比如间隔秒,保证路由中的信息是最新的。
1.5.1.1.2 交换信息算法
得到相邻路由器发送的路由信息
先进行”初始化”:把距离都+1,把下一跳地址都改为。
接着对**每一个表项**都执行以下过程:
查看该表项对应的网络号是否存在于当前路由表,如果不存在,就把直接加入到路由表中。否则执行下一步
该网络号已在路由表中,则查看该表项对应的下一跳地址,如果就是路由表中的下一跳地址,则直接更新路由表中的表项为[确保路由表中的信息总是最新的]。否则执行下一步
该网络号在路由表中且下一跳地址并不相同,则查看该表项的距离,如果才更新[确保路由表中的距离总是最近的],否则就什么也不做,扫描下一个表项。
如果某个时间间隔里(3分钟)总接受不到某个相邻路由表的更新报文,就在路由表中把该路由器的表项都设置为不可达(距离为16)。
但是这样的算法会带来一定的问题,比如中最大的问题**“好消息传得快,坏消息传得慢”**。
当一个网络出现故障时,协议往往要经过比较长的时间才能把这个信息传递给所有的路由器。
但是如果有一个路由器发现了一个更加短的路由,这种信息就传播的很快。
可以考虑以下事件:
坏消息传的慢事件:到路由器的网络不可达从可达变成不可达,更新自己的路由表,把到的表项的距离改为不可达。且在路由器把更新的路由表传给前,路由器先把路由表传递给了。
1.5.1.1.3 协议报文格式
协议支持子网划分和无分类编址网络。
协议数据报使用协议进行传输!因此应该是数据报文封装在数据报中再封装数据报里传输。
自身的数据报文由首部和路由部分组成。
特别地,由于一个路由部分最多可以放入个路由信息,因此一个数据报的最大长度是字节。
协议还可以进行简单地鉴别功能,使用鉴别功能时将第一个路由信息作为鉴别信息。把地址族标识改为x(全1),而路由标记写入鉴别类型,剩余的16个字节全都可以作为鉴别数据。
1.5.1.2 开放最短路径优先协议(Open Shortest Path First)
最大的特征是使用了分布式的链路状态协议。它就是为了克服协议的缺点而开发的。
协议的目的是让每一台路由器都能够维护一个链路状态数据库,也就是全网的带权拓扑图。在这张带权图上跑就能找到该路由器到其他路由器的最短路径。
链路状态数据库的同步是指使得不同路由器的链路状态数据库变得一样。
完全邻接指的是相邻的 同步路由器。
的另一特征是更新收敛的速度非常快。(比较慢)。
1.5.1.2.1 如何交换信息
交换信息的要点有3条:
- 和谁交换信息 协议要求每台路由器和自治系统内的所有路由器都发送信息。使用的方法是泛洪法。
- 交换哪些信息 协议要求路由器分享和本路由器相邻的所有路由器的链路状态(路由器知道的部分信息)。其中链路状态包括
相邻路由器的地址
和连接到该路由器的度量
(可以被称为是代价)。- 何时交换信息 中无需路由器定时发送自己的链路状态信息。只需要链路状态发生改变时发送链路状态信息即可。
由于每台路由器都要和自治系统内部所有路由器都发送信息,想必网络拥塞程度会非常大,为了能让可以在大网络上运行,往往会把一个自治系统划分为几个区域(用32位标识)。并且把泛洪法交换信息的范围从整个AS变为整个区域。
把区域分为2大类:
- 主干区域(backbone Area): 标识符为,联通其他区域
- 其他区域
并且划分出3类特殊的路由器:
- 区域边界路由器(area border router): 处于每个区域和主干区域交接处的路由器。其他区域来的信息都由区域边界路由器进行概括。
- 主干路由器(backbone router): 处于主干区域的路由器。
- 自治系统边界路由器:处于主干区域中,专门处理本自治系统和其他自治系统之间的路由交换。
层次划分又一次使得网路变得容易在大规模的情况下变得适用。
1.5.1.2.2 协议报文格式
协议不再使用协议传输报文,而是直接使用协议传输报文。
字段 | 位数/字节数 | 描述 |
---|---|---|
版本 | 8/1 | 版本,现在为2 |
类型 | 8/1 | 描述该数据报传输哪一种OSPF分组,一共有5种分组 |
分组长度 | 16/2 | 标识该分组的长度,若为,则长度为字节 |
路由器标识符 | 32/4 | 发送方路由器端口的地址 |
区域标识符 | 32/4 | 分组属于哪一个区域 |
校验和 | 16/2 | 检测分组中的差错,猜测是检验整一个数据报 |
鉴别类型 | 16/2 | 目前只有0(不鉴别),1(鉴别) |
鉴别口令 | 64/8 | 如果不鉴别则全0填充,鉴别则可填入字节(8字符)的口令 |
5种分组是:
类型 | 描述 |
---|---|
问候(Hello)分组 | 用以发现和维持相邻站点的可达性 |
数据库描述(Database Description)分组 | 向邻站给出自己的链路状态数据库的摘要信息 |
链路状态请求分组 | 请求对方发送某个链路的状态 |
链路状态更新分组 | 用泛洪法更新链路状态 |
链路状态确认分组 | 用来确认链路状态更新分组 |
规定每秒钟都要交换一次问候分组,以此知晓哪些邻站可达。如果间隔秒钟没有收到某个相邻路由器的问候分组,则认为该路由器不可达。
协议一般并不采用泛洪法来从空白链路状态数据库建立完整的链路状态数据库,只有在链路状态发生改变的时候才进行泛洪法。
而建立的方法一般是:
- 路由器和邻站交换状态数据库的摘要[哪些链路已经被写入数据库]
- 向邻站请求缺少的链路状态
以此大大减少了网络的负担。
而当有路由器的邻接链路状态发生改变时,采用可靠的泛洪法(泛洪法+确认信息)来向整个区域内的路由器都通知这个消息。
协议还有以下几个特点:
- 协议允许管理员给一条链路设置不同的度量以适应不同的业务。(比灵活)
- 允许负载均衡的情况,即当多条路径的总度量都一样时,可以允许把起点到终点的数据报分散到这几条路径中去。(只会选其中一条,比高效)
- 所有在中的链路之间都可以进行鉴别,可以仅在信任的路由器之间同步链路状态
- 也可以支持子网划分和无分类编址方式。
- 让每一段链路都带上一个**的序号**,序号越大,链路状态越新。
- 每隔秒,刷新一次链路状态数据库。
- 为了更多地减少路由器之间的信息交换,又选定某些特殊路由器作为指定路由器(其他所有的路由器的信息都传递给他,由它转交给其他路由器),从两两之间的减小到。