IERS-OSPF基本工作原理
IERS-OSPF基本工作原理
一、邻居建立建立过程
1、Router ID
用于在自治系统中唯一标识一台运行OSPF的路由器,每台运行OSPF的路由器都有一个ROUTER ID
Route ID 是一个32位的无符号的整数,其格式和IP地址是一样的,Route iD 的选举规则如下:
1)、手动配置OSPF路由器的Router ID通常建议手配置
2)、如果没有手动配置Router ID,则路由器使用LoopBack接口中最大的IP地址作为Router ID;
3)、如果没有配置loopback 接口,则路由器使用物理接口中最大的ip地址作为route id
OSPF的路由器Router ID重新配置后,可以通过重置OSPF进程来更新router id;
2、发现并建立邻居-hello报文
2.1、hello报文的作用
邻居发现:自动发现邻居路由器
邻居建立:完成Hello报文中的参数协商,建立邻居关系
邻居保持:通过keepalive机制,检测邻居运行状态
2.2、OSPF邻居建立过程
邻居建立过程如下:
1)、现在RTA和RTB的router id 分别为1.1.1.1 和2.2.2.2 ,当RTA启动OSPF后,RTA会发送第一个hello报文,此报文中邻居列表为空,此时状态为down,RTB收到RTA的这个hello报文,状态置为init.
2)、RTB发送发送hellor报文,此报文中邻居列表为空,RTA收到RTB的hello报文,状态置为init.
3)、RTB向RTA发送邻居列表为1.1.1.1的hello报文,RTA在收到的hello报文邻居列表中发现自己的router id ,状态置为2-way。
4)、RTA向RTB发送邻居列表为2.2.2.2的hello报文,RTB在收到的hello报文邻居列表中发现自己的router id ,状态置为2-way;
因为邻居都是未知的,所以hello报文的目的IP地址不是某个特定的单播地址,ospf采用组播的形式发送hello报文(目的地址为224.0.0.5)。
5)、对于不支持组播的网络,ospf路由如何发现邻居呢?
ospf支持通过单播的方式建立邻居关系,对于不支持网络可以通过手动配置实现邻居的发现与维护,
ospf路由器之间建立邻居关系是为了同步链路状态信息,接下来学习OSPF如何实现链路状态数据库同步。
二、链路状态信息
1、OSPF链路状态信息主要包括
链路的类型、接口ip地址及掩码、链路上所连接的邻居路由器、链路的带宽(开销)
OSPF有丰富的数据链路层能力,数据链路层协议类型多种多样,工作机制也各不相同,为适配多种数据链路层协议必须考虑各类链路层协议在组网时的应用场景
2、OSPF是如何定义多种网络的?
p2p网络:仅两台路由互连,支持广播、组播,
广播型网络:两台或两台以上的路由器通过共享介质互连,支持广播,组播,广播型网络的例子:通过以太网链路相连的路由器网络。是OSPF最常见的网络类型
NBMA网络:两台或两台以下路由器通过VC互连,不支持广播、组播,在NBMA网络上OSPF模拟在广播网络上的操作,但是每个路由器的邻居需要手动配置;NBMA型网络的例子,通过全互连的帧中继链路相连的路由器网络
P2MP网络:多个点到点网络的集合,支持广播、组播,没有一种链路层协议默认属于P2MP类型网络,也就是说必须是由其他的网络类型强制更改为P2MP,常见的做法是将非完全连接的帧中继或ATM必为P2MP网络。
3、OSPF链路状态信息中的开销值是如何度量的呢?
某接口COST=参考带宽/实际带宽,默认参考带宽为100M,当计算有小数位时,只取整数位,结果小于1时,COST取1
标记: 优先级 1
更改COST的两种方式:1、直接在接口下配置;2、修改参考带宽(所有路由器都需要修改,确保选中一致性)
三、报文类型及作用
1、OSPF协议报文头部
OSPF使用IP承载其报文,协议号为89
在OSPF packet部分,所有的OSPF报文均使用相同的OSPF报文头部
version:对于当前所使用的OSPFV2,该字段的值为2.
type:OSPF报文类型
packet length:表示整个OSPF报文的长度,单位是字节。
router ID:表示生成此报文的路由器的router ID。
area ID:表示此报文需要被通告的到的区域。
checksum :校验字段,其校验的范围是整个OSPF报文包括OSPF报文头部
auth type:为0时表示不认证,为1时表示简单的明文密码认证;为2时表示加密MD5认证
authentication:认证所需的信息,该字段的内容随autype的值不同而不同。
OSPF的报文头部定义了OSPF路由器之间的通信标准与规则
2、OSPF报文类型
type=1为hello报文,用来建立和维护邻居关系,邻居关系建立之前,路由器之间需要进行参数协商
type=2为数据库描述报文(DD),用来向邻居路由器描述本地链路状态数据库。使得邻居路由器识别出数据库中的LSA是否完整。
type=3为链路状态请求报文(LSR),路由器根据邻居的DD报文,判断本地数据库是否完整,如不完整,路由器把这些LSA记录进链路状态请求列表中,然后发送一个LSR给邻居路由器
type=4为链路状态更新报文LSU,用于响应邻居路由器发来的LSR,根据LSR中的请求列表,发送对应LSA给邻居路由器,真正实现LSA的泛洪与同步
type=5为链路状态确认报文(LSACK),用来对收到的LSA进行确认,保证同步过程的可靠性。
3、DD报文和LSACK中包含LSA头部信息:包括 LS type ls id advertising router ls sequence ls checksum; LSU报文中包含完整的LSA信息, LSR 包含LS type ls id advertising router
四、LSDB同步过程
五种报文可以高效地完成LSA的同步 ,那么实际的报文交互过程是什么样的呢?
同步状态图
各个状态含义:
exstart:邻居状态变成此状态后,路由器开始向邻居发送DD报文。master和slave关系是在此状态形成的,初始DD序列号也是在此状态下确定的,在此状态下发送的DD报文不包含链路状态描述。
exchange:在此状态下,路由器与邻居之间相互发送包含链路状态信息摘要的DD报文。
loading:在此状态下,路由器与邻居之间相互发送LSR报文,LSU报文,LSAck报文
full:lsdb同步过程完成。路由器与邻居之间形成了完全的邻接关系。
LSDB同步过程如下:
1、RTA和RTB的router ID 分别为1.1.1.1 和2.2.2.2并且二者已经建立 了邻居关系,当RTA的邻居状态变为exstart后,RTA会发送第一个DD报文,此报文中,DD序列号被随机设置为X,I-bit设置为1,表示这是第一个DD报文,M-bit设置为1,表示后续还有DD报文要发送,MS-bit设置为1,表示RYA宣告自己为master。
2、当RTB的邻居状态变为exstart后,rtb会发送第一个dd报文,此报文中,dd序列号被随机的设置为Y(i-bit=1,m-bit=1,ms-bit=1,含义同上)。由于rtb的router ID较大,所在rtb将成为真正的master,收到此报文后,rta会产生一个negotiation-done事件,并将邻居状态从exstart变为exchange。
3、当RTA的邻居状态变为exchange后rta会发送一个新的dd报文,此报文中包含了LSDB的摘要信息,序列号设置为RTB在步骤2中使用的序列号Y, I-bit=0,表示这不是第一个DD报文,M-bit=0,表示这是最后一个包含LSDB摘要信息的DD报文,MS-bit=0,表示RTA宣告自己为SLAVE,收到此报文后,RTB会产生一个negotiation-done事件,并将邻居状态从exstart变为exchange。
4、当RTB的邻居状态变为exchange后RTB会发送一个新的DD报文,此报文包含了LSDB的摘要信息,DD序列号设置为Y+1,MS-bit=1,表示RTB宣告自己为master
5、虽然RTA不需要发送新的包含LSDB摘要信息的DD报文,但是作为slave,RTA需要对master发送的第一个DD报文进行确认,所以RTA向RTB发送一个新的DD报文,序列号为Y+1,该报文内容为空,发送完此报文后,RTA产生一个exchange-Done事件,将邻居状态变为loading。RTB收到此报文后,会将邻居状态变为full。(假设RTB的LSDB是最新最全的,不需要向RTB请求更新)
五、LSA头部
LSA是OSPF链路状态信息的载体
LS type,link state id 、advertising router的组合共同标识一条LSA
IERS-OSPF基本工作原理的更多相关文章
- OSPF的基本工作原理
OSPF的基本工作原理 1.定义 2.特点 3.基本概念 4.OSPF五种分组类型 5.DR/BDR 6.区域 1.定义 开放最短路径优先OSPF,是为了克服RIP的缺点在1989年开发出来的. &q ...
- DDNS 的工作原理及其在 Linux 上的实现--转
http://www.ibm.com/developerworks/cn/linux/1305_wanghz_ddns/index.html DDNS (Dynamic DNS) 扩展了 DNS 将客 ...
- CentOS 6.5环境下heartbeat高可用集群的实现及工作原理详解
Linux HA Cluster高可用服务器集群,所谓的高可用不是主机的高可用,而是服务的高可用. 什么叫高可用:一个服务器down掉的可能性多种多样,任何一个可能坏了都有可能带来风险,而服务器离线通 ...
- 菜鸟学Struts2——Struts工作原理
在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...
- 【夯实Nginx基础】Nginx工作原理和优化、漏洞
本文地址 原文地址 本文提纲: 1. Nginx的模块与工作原理 2. Nginx的进程模型 3 . NginxFastCGI运行原理 3.1 什么是 FastCGI ...
- HashMap的工作原理
HashMap的工作原理 HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...
- 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)
RAC 工作原理和相关组件(三) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...
- ThreadLocal 工作原理、部分源码分析
1.大概去哪里看 ThreadLocal 其根本实现方法,是在Thread里面,有一个ThreadLocal.ThreadLocalMap属性 ThreadLocal.ThreadLocalMap t ...
- Servlet的生命周期及工作原理
Servlet生命周期分为三个阶段: 1,初始化阶段 调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...
随机推荐
- 3dsmax2020卸载/安装失败/如何彻底卸载清除干净3dsmax2020注册表和文件的方法
3dsmax2020提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dsmax2020失败提示3dsmax2020安装未完成,某些产品无法安装,也有时候想重新 ...
- 更新Mac双系统多分区
前言制作Mac USB系统安装盘安装Mac OS 10.12制作win10 USB系统安装盘安装win10windows多分区实现 前言 同事有一台mac pro,系统是mac os 10.9+win ...
- 使用group by rollup和group by cube后的辅助函数
本文主要介绍,报表在使用group by rollup和group by cube后的辅助函数. CREATE TABLE TEST8 ( "ID" NUMBER, "O ...
- 我的Python升级打怪之路【五】:Python模块
模块,是一些代码实现了某个功能的集合 模块的分类: 自定义模块 第三方模块 内置模块 导入模块 import module from module.xx.xx import xx from modul ...
- 【debian】给用户添加sudo权限
新装的debian系统默认是没有sudo功能的. 于是,在root用户权限下: apt-get install sudo 然后再修改文件 /etc/sudoers : chmod +w /etc/su ...
- 8.14_end
the first interview 事件委托(ul.li) jsonp原理实现 印象最深的项目 each的实现 ajax的实现 性能优化的方法 判断Function和Boolean 印象最深的项目 ...
- 九度oj 1031 xxx定律 2009年浙江大学计算机及软件工程研究生机试真题
题目1031:xxx定律 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5153 解决:3298 题目描述: 对于一个数n,如果是偶数,就把n砍掉一半:如果是奇数,把n变成 3*n ...
- JavaScript中类型检测
文章首发: http://www.cnblogs.com/sprying/p/4349426.html 本文罗列了一般Js类型检测的方法,是构建Js知识体系的一小块,这篇文章是我很早之前总结的. 一. ...
- 问题集录06--SpringBoot创建Maven项目
1. 如下图,打开idea之后,file -> new -> project2. 如下图,在弹出的new project 页面,选择maven -> 勾选Create from ar ...
- Exists 和 Not Exists
只注重子查询是否有返回行,如有返回结果为真,否则为假,并不适用子查询的结果,仅用于测试子查询是否有返回结果. 语法: if exists (子查询) begin 语句块 end 例子: if exis ...