day 3:ICMP,网络层次架构,AS,路由,最短路径算法

ICMP属于网络层

ICMP格式

例如:如果A想发一份IP报文datagram1给B,结果传到第一个路由器时,该路由器就说:“哎呀我不知道怎么发去给B啊!”。于是该路由器就会发一份ICMP回去给A。
该路由器要做的事情有:
1.取原IP报文datagram1的IP头和IP数据的前八个字节(也就是TCP头里面的src port和dst port),
2.在前面加上出错type和出错code(例如type=3,code=0,合起来就是出错类型30。分为出错类型和检测类型),合起来就是ICMP信息
3.该路由器还要将ICMP信息加上新的IP头,合起来变成全新的IP报文,发回去原本IP报文datagram1的发送方A,告诉A对应的出错类型。

新的IP头的创建格式和一般的IP头的格式一样,相当于此时该路由器要发一份IP报文给A

ICMP是不可靠的,因为它发回给原发送方以后,就不会留意原发送方是否收到,不会再重新发一遍,而是拍拍屁股走人

常用的ICMP应用:
1.ping:检测某段链路花费的时间。使用TCP,发送方发一个检测类型为80的ICMP,接收方发送一个检测类型为00的ICMP。

2.traceroute:检测到达目的url途中经过的路由,以及每一段链路花费的时间。使用UDP,每段链路都发送给原始发送方一个出错类型为11的ICMP


网络的层次架构hierarchy:

网络实际上是分为一个个的Autonomous System自治系统(简称AS),
AS内部可以使用不同的IRP协议建立路由表,
每个AS都有各自的AS number来区分不同的AS
每个自治系统可以是single exit的也可以是multiple exit的(也就是一个AS有多少个路由可以连到其他AS),

linux下可以输入 traceroute -a netflix.com 得到连接到netflix.com途中经过的路由以及所属的AS

常用IRP:
1.RIP:使用距离向量,RFC 2453

2.OSPF:使用flooding,RFC 2328,每个路由器使用Dijkstra算法,使用OSPF的系统如果太大,还需要再划分成areas

flooding是最简单的找到路由的方法

single exit的AS可以使用default routing的形式,即:
1.每个路由都知道AS的前缀prefix

前缀的含义:参考CIDR地址块的网络前缀含义

2.同一AS内的分组都要通过default router发去其他AS,
3.default router是通往其他AS的边界网关border gateway
也就是说,一个AS的default router既知道怎样将分组发去其他AS,也知道怎样将接收的分组发到AS内的路由

multiple exit的AS有点像将default router从一个变为多个,
每个分组只需找到最靠近自己的default router(或者是离目标地址路径最短的default router)即可,其他步骤类似。
但是整体的结构,包括路由表,会更为复杂。

路由算法

一个AS中的路由i怎么知道到达路由j的最短路径?这个就涉及到各种大名鼎鼎的“最短路径算法”了,其中有:
1.Bellman-Ford:
原理:
1.每个路由都知道到达临近路由所需的cost,但初始时并不知道到达除此以外的路由所需的总cost值,在最初都设置为【总cost为无限大】。
2.松弛relax:例如,
原本R1记录了【路由R1到达路由R8的总cost为8】,
但是后来发现【路由R2到达路由R8的总cost为5】,
而路由R2是路由R1的临近路由,
且【路由R1到达路由R2的总cost为2】,
那么就修改成【路由R1到达路由R8的总cost为7】,这就是松弛
遵循松弛的原则,从目的路由反向推导,经历足够多次测试,总cost必定会收敛于某个值,每个路由就能知道到达其他路由的最短路径。
视频讲解过程:https://www.bilibili.com/video/BV137411Z7LR?p=96
3.要设定每个路由到达另一个路由的最大生命周期TTL,或者形象地说,目的路由经过的自身以外的路由数目要有上限,否则会加大找最短路径的工作量

猜你喜欢

转载自blog.csdn.net/jieyannn/article/details/105484205