TCP/IP之路由算法
转载自https://www.jianshu.com/p/e5cce2958790
网络层的重要功能就是路由和转发。而路由是根据路由器根据所维护的路由表进行路由选择。所以,如果创建和更新转发表就是一个很重要的问题。通常,在路由时,我们总是选取所需代价最小的一条路由。
首先,我们需要将网络进行抽象,最常见的抽象就是,将网络抽象成图结构。
每段链路的费用可以总是1,或者是,带宽的倒数、拥塞程度等。
关键问题: 源到目的(如u到z)的最小费用路径是什么?
所谓的路由算法: 寻找最小费用路径的算法。
路由算法的分类
静态路由 vs 动态路由
静态路由就是所有路由信息由人工静态配置好,以后需要更新的话,就要重新配置。
- 手工配置
- 路由更新慢
- 优先级高
动态路由就是在网络随时根据网络拓扑结构的结构的变化,进行动态更新
- 路由更新快
- 定期更新
- 及时响应链路费用或网络拓扑变化
全局信息 vs 分散信息
有的路由算法需要所有路由器掌握完整的网络拓扑和链路费用信息,也就是对网络的全局有一个了解
最有代表性的就是链路状态(LS)路由算法。
有的路由算法只需要路由器只掌握物理相连的邻居以及链路费用。通过邻居间信息交换、运算的迭代过程来更新路由信息。
最有代表性的就是距离向量(DV)路由算法。
链路状态路由算法
首先将网络抽象,然后利用图算法中的最短路径算法,Dijkstra 算法。
所有结点(路由器)掌握网络拓扑和链路费用
- 通过“链路状态广播”
- 所有结点拥有相同信息
利用Dijkstra 算法计算从一个结点(“源” )到达所有其他结点的最短路径。从而可以获得该节点的转发表。
然后对不同的节点进行迭代,就可以使所有节点都得到自己的转发表。
- c(x,y): 结点x到结点y链路费用;如果x和y不直接相连,则=∞
- D(v): 从源到目的v的当前路径费用值
- p(v): 沿从源到v的当前路径, v的前序结点
- N’: 已经找到最小费用路径的结点集合
1 初始化:
2 N' = {u}
3 for 所有结点v
4 if v毗邻u
5 then D(v) = c(u,v)
6 else D(v) = ∞
7
8 Loop
9 找出不在 N’中的w ,满足D(w)最小
10 将w加入N'
11 更新w的所有不在N’中的邻居v的D(v) :
12 D(v) = min( D(v), D(w) + c(w,v) )
13 /*到达v的新费用或者是原先到达v的费用,或者是
14 已知的到达w的最短路径费用加上w到v的费用 */
15 until 所有结点在N’中
算法复杂性: n个结点
- 每次迭代: 需要检测所有不在集合N’中的结点w
- n(n+1)/2次比较: O(n2)
- 更高效的实现: O(nlogn)
算法可能存在震荡现象
当链路状态更新的太快并且不断变化的时候,假设我们发出一个分组,结果还没到目的地,路由表就更新了,然后这个数据报就一直在路由间切换,最后由于ttl到0,直接丢弃。这就是震荡现象。
距离向量(Distance Vector)路由算法
重点:结点获得最短路径的下一跳, 该信息用于转发表中!
核心思想:
- 每个结点不定时地将其自身的DV估计发送给其邻居
- 当x接收到邻居的新的DV估计时, 即依据B-F更新其自身的距离向量估计:
Dx(y)将最终收敛于实际的最小费用 dx(y)
异步迭代:
- 引发每次局部迭代的因素
- 局部链路费用改变
- 来自邻居的DV更新
分布式:
- 每个结点只当DV变化时才通告给邻居
- 邻居在必要时(其DV更新后发生改变)再通告它们的邻居
距离向量路由算法:举例
如果链路发生变化,距离向量节点会怎么样呢?
链路费用变化:
- 结点检测本地链路费用变化
- 更新路由信息,重新计算距离向量
- 如果DV改变,通告所有邻居
交换过程
- t0 : y检测到链路费用改变 ,更新DV,通告其邻居.
- t1 : z收到y的DV更新,更新其距离向量表,计算到达x的最新最小费用,更新其DV,并发送给其所有邻居.
- t2 : y收到z的DV更新, 更新其距离向量表,重新计算y的DV,未发生改变,不再向z发送DV.
“好消息传播快! ”
“坏消息会怎么样呢? ”
如果是坏消息,很可能就会出现无穷计数的问题:
我们发现 坏消息传播慢!—“无穷计数(count to infinity)”问题!
无穷计数问题的解决方法
毒性逆转(poisoned reverse):
如果一个结点(e.g. Z)到达某目的(e.g.X)的最小费用路径是通过某个邻居(e.g.Y),则
通告给该邻居结点到达该目的的距离为无穷大
毒性逆转能否彻底解决无穷计数问题?
显然是不行的,如果过于复杂的网络,我们发现毒性逆转也需要经过很多的步骤。
定义最大度量(maximum metric)
定义一个最大的有效费用值,如15跳步, 16跳步表示∞
层次路由
我们前面的算法是将网络抽象成一张图,但实际上,网络都是很大的,节点数量远超过我们想象,如果我们单纯的使用以上的算法显然是不可行的。
将任意规模网络抽象为一个图计算路由-过于理想化
- 标识所有路由器
- “扁平”网络
——在实际网络(尤其是大规模网络)中, 不可行!
网络规模: 考虑6亿目的结点的网络
- 路由表几乎无法存储!
- 路由计算过程的信息( e.g. 链路状态分组、DV)交换量巨大,会淹没链路!
另一方面,就是网络管理自治的问题,不同的网络可以采取不同的方法进行路由。
管理自治:
- 每个网络的管理可能都期望自主控制其网内的路由
- 互联网(internet) = 网络之网络(network of networks)
层次路由就是解决这样的问题,和网络领域中的问题是一样,继续抽象出一层网络。
聚合路由器为一个区域:自治系统AS(autonomous systems)
然后再把自治系统看成节点进行路由,对于自治系统内就采取自己的路由方法。这就是抽象成了两层。
同一AS内的路由器运行相同的路由协议(算法)
- 自治系统内部路由协议(“ intra-AS” routing protocol)
- 不同自治系统内的路由器可以运行不同的AS内部路由协议
网关路由器(gateway router):
- 位于AS“边缘”
- 通过链路连接其他AS的网关路由器
转发表由AS内部路由算法与AS间路由算法共同配置
- AS内部路由算法设置AS内部目的网络路由入口(entries)
- AS内部路由算法与AS间路由算法共同设置AS外部目的网络路由入口
假设AS1内某路由器收到一个目的地址在AS1之外的数据报:
路由器应该将该数据报转发给哪个网关路由器呢?
AS1必须:
1.学习到哪些目的网络可以通过AS2到达,哪些可以通过AS3到达
2.将这些网络可达性信息传播给AS1内部路由器
以上这些都是
例: 路由器1d的转发表设置
假设AS1学习到(通过AS间路由协议):子网x可以通过AS3 (网关 1c)到达,但不能通过AS2到达,AS间路由协议向所有内部路由器传播该可达性信息
为了配置转发表,路由器1d必须确定应该将去往子网x的数据报转发给哪个网关?这个任务也是由AS间路由协议完成!
- 假设AS1通过AS间路由协议学习到:子网x通过AS3和AS2均可到达
- 为了配置转发表,路由器1d必须确定应该将去往子网x的数据报转发给哪个网关?
- 这个任务也是由AS间路由协议完成!
- 热土豆路由: 将分组发送给最近的网关路由器.
http://www.taodudu.cc/news/show-1475501.html
相关文章:
- 奇偶校验码浅谈
- 以太网CSMA/CD算法交换机自学习/转发简述
- 如何用结构型信号量实现互斥和同步
- 经典同步问题一——生产者和消费者问题
- CPU调度算法——FCFS算法/SJF算法/优先级调度算法/RR算法
- 经典同步问题二——哲学家进餐问题
- 经典同步问题三——读者写者问题
- 如何用管程实现生产者消费者问题?
- 第四次作业:猫狗大战挑战赛
- anaconda安装pytorch1.7.1和torchvision0.8.2的方法,亲测可用
- 高光谱图像分类
- Golang实现Server和Client的TCP通讯
- 原子操作和杀死goroutine两种方法,解决多协程调用同一个函数的问题
- C语言手写快排算法,两个值时也可以使用哦!
- 论文Attention-guided CNN for image denoising解读
- ES6函数参数的解构赋值,以及2种设置参数默认值方法的区别
- Javascript字符串长度返回错误的原因
- golang使用redis——redigo安装
- go使用redis——redigo使用HMSET存储结构体
- 解决Golang程序运行时占用内存不断增加的问题
- [leetcode]求数组的第k个最大值,python快排解法
- JS基础--子类型重写超类型方法原型链图解
- P1 Human Pose Estimation人体姿态综述估计调研
- P2 人体姿态估计的过去、现在和未来
- 金橙子打标软件学习流程
- P3 吴恩达推荐笔记:22张图总结深度学习全部知识
- P4 2019年人体姿态估计指引
- python入门——P36类和对象:给大家介绍对象
- python入门——P37类和对象:面向对象编程
- python入门——P39类和对象:拾遗
TCP/IP之路由算法相关推荐
- cisco 模拟器安装及交换机的基本配置实验心得_看完这份1113页的TCP/IP协议+路由与交换机,成功上岸字节跳动...
TCP是一个巨复杂的协议,因为它要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获. 之所以想写这篇文章,目的有三个: 一个 ...
- 【TCP/IP】检验和算法
在巨著<TCP/IP详解1>中有这样一句话:"ICMP,IGMP,UDP and TCP all use the same checksum algorithm".的确 ...
- 编程实现路由算法_TCP/IP 之路由算法
(给算法爱好者加星标,修炼编程内功) 作者:六尺帐篷 www.jianshu.com/p/e5cce2958790 网络层的重要功能就是路由和转发.而路由是根据路由器根据所维护的路由表进行路由选择.所 ...
- 【TCP/IP】Nagle算法
Nagle算法 1.为什么要引入Nagle算法 Nagle算法主要是为了防止网络连接中充斥着<MSS的分组.小的分组一方面会造成网络拥塞,另外一方面由于网络传输过程中,用户程序需要传递的内容需要 ...
- 计算机网络 -- TCP/IP
画图标准 OSI七层模型 7.应用层 作用:为用户提供软件/接口/界面 interface 协议:OICQ.HTTP.HTTPS.BT/P2P 6.表示层 作用:用于对用户数据进行数据呈现.(数据格式 ...
- 万字长文 | 全(小区局域)网最强 TCP/IP 拥塞控制总结
来源 | 后端技术指南针 头图 | CSDN付费下载自视觉中国 先唠唠嗑 在正式开始文章技术点之前,想先聊一下我对面试中的TCP/IP问题的一些拙见,希望对盆友们有所帮助. 在招聘岗位描述中,几乎必然 ...
- Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架 — iptables NAPT 网络地址/端口转换
目录 文章目录 目录 网络地址转换(NAT) SNAT DNAT 端口映射(PAT) 网络地址转换(NAT) IP 网络有公网与私网的区分,通常内网使用私网 IP,Internet 使用公网 IP,而 ...
- 【计算机网络】网络层 : 总结 ( 功能 | 数据交换 | IP 数据报 | IPv4 地址 | IPv6 地址 | 路由选择协议 | 路由算法 )★★★
文章目录 一.网络层功能 二.数据交换方式 ★ 三.IP 数据报 ★ 四. IPv4 地址 ★★ 1 . IP 地址 发展 : 2 . 分类 IP 地址 3 . NAT 转换 4 . 子网划分 5 . ...
- 【TCP/IP】IP:网际协议(寻址和路由)
IP是TCP/IP协议族中最为核心的协议,所有的TCP.UDP.ICMP及IGMP数据都以IP数据报格式传输. IP提供不可靠.无连接的数据报传送服务. 不可靠是指它不能保证IP数据报能成功地到达目的 ...
最新文章
- 大二上学数据结构和操作系统_毕业后的工作比上学要重要得多。 这是数据。...
- 单链表-逆置单链表(头插法且双指针)
- android线程控制UI更新(Handler 、post()、postDelayed()、postAtTime)
- codeblocks无法打开文件kernel32.lib
- 【一】Windows API 零门槛编程指南——MessageBox 基本使用及基础讲解
- 【转】C++ 存储类
- python导入mongodb_python实现mongodb的备份与导入
- iPhone 12还没出,iPhone 13开始了:将采用120Hz ProMotion显示屏
- 某大型IT公司招网络工程师认证试题精选(要求:CCNA或 HCNE以上)
- 优秀的用户体验设计,从讲好一个故事开始
- 活动丨想和大咖云风来场1对1的亲面交流吗?!快来分享你的《程序员修炼之道》学习心得!
- 使用DALSA采集卡进行采图(C#版)
- Ubuntu安装jdk8
- c语言编程分数化简,C语言编程实例:将真分数分解为埃及分数
- SWFTOOLS PDF2SWF 参数详解(转)
- [黑金原创教程] FPGA那些事儿《设计篇 I》- 图像处理前夕
- 无论产品经理是否逃离北上广,过硬的产品实力才能让自己始终拥有竞争力
- 2018全球高被引学者榜单出炉!中国上榜538人,计算机类排名第一
- 户口迁移一定要本人去办理的吗???
- H5端根据指定地址显示地图并且可调起三大主流地图软件(腾讯、百度、高德)
热门文章
- java 串口tcp客户端访问串口tcp服务器_怎么使用无线串口服务器
- python显示gif图片报错_用Python制作在地图上模拟瘟疫扩散的Gif图
- realtek网卡mac硬改工具_浅谈设备异常、手机硬改参数
- python冒号声明类型_Python 函数参数有冒号 声明后有- 箭头 返回值注释 参数类型注释...
- sql server列转行怎么提高效率_行转列、列转行
- java 程序打成.exe可执行程序
- 【习题 7-2 UVA-225】Golygons
- 理解 PHP output buffer
- strcpy vs memcpy
- zoj 3703(背包)