网络层
将运输层报文从发送主机送到接收主机,在发送侧将报文段封装成网络层分组,在接收侧将报文解出交给运输层。网络层协议位于每个主机和路由器上,路由器检查经过它的所有的IP数据包的头部字段。
|| 关键功能———选路、转发
选路:
建立路由表(路由算法),决定分组从源到目的地所走的路径。(就像规划一个从源到目的地的旅行路线的过程)
转发:
查路由表,将分组从路由器的输入端口转送到合适的输出端口。(就像通过一个中转站,如机场、车站的过程)
、、
|| 路由算法分类——静态 / 动态,全局 / 分布式
静态 VS 动态:
静态路径变化很慢;动态路径变化比较快,周期性更新,反映链路费用变化。
全局 VS 分布式:
全局:所有的路由器持有完整的网络拓扑和链路费用的信息,“链路状态”算法(L-S);
分布式:路由器知道它与物理上相连的邻居以及与邻居间链路的费用,仅与邻居交换信息,迭代计算路由,距离向量算法(D-V)。
@ D-V 路由算法:
异步的、迭代的:
引起每次迭代的条件: 本地链路费用发生变化,收到邻居的DV。
分布式的:
只有DV改变时才通知邻居节点。
自停止的:
当计算DV不变时就停止通告。
Bellman-Ford 算例:
基本思想:
链路耗费变化:
X是目的节点哦~
- good news travels fast
(1) 当Y检测到链路费用变化时,更新Dy(x) = 1, Dy(z) = 1;
(2) 通知Z更新: Dz(y) = 1, Dz(x) = 1+1 = 2.
(3) Z更新后通知Y更新:Dy(x) = 1, Dy(z) = 1;
(4) 发现不变后,停止通告。
- bad news travels slow
此时Y检测到它到X的路径费用由4增加到了60。此时节点Z的距离向量为:Dz(x) = 5, Dz(y) = 1 。
(1) Y在更新向量时发现,咦,Z到X的距离只有5诶,那可以先到Z再到X,于是Y的距离向量更新为:Dy(x) = 5 + 1 = 6, Dy(z) = 1。[ 注: 我们可以发现,这个逻辑显然是错误的,因为Z到X的距离为5的前提是要经过Y,但Y更新后的路径又要经过Z,这就形成了一个选路环路(routing-loop)问题。因为Y的距离向量更新了(虽然是错误的),但它还是向Z发送了更新报文。]
(2) Z收到更新报文后,比较了下邻居们到X的距离,发现经过Y的路径距离为1 + 6 = 7,小于直接到X的距离,于是Z也更新的自己的距离向量,Dz(y) = 1, Dz(x) = Dz(y) + Dy(x) =7。
(3) Z将更新后的距离向量发给Y。 Y收到后又更新向量Dy(x) = Dy(z) + Dz(x) = 8。
(4) 然后再发给Z…
解决方案——毒性逆转方法:
基本思想:
如果Z的最短路径要通过邻居Y,那么它将告诉Y自己到目的节点的距离是∞。这样,Z向Y撒了一个善意的谎言,使得只要Z经过Y选路到X,它就会一直持续讲述这个谎言,这样Y也就永远不会尝试从Z选路到X了,也就避免了环路问题。(可见,有时善意的谎言也不是件坏事,也是为了你好啊T^T)
实例解释:
起初:Dz(x) = 5, Dz(y) = 1 ,Z到X是经过Y的。
(1)Y在更新自己的距离向量时,发现Z到X的距离是∞,于是它将Dy(x)无奈地更新为60,并向Z发送了更新报文。
(2)Z收到报文后更新自己的Dz(x)为50(直接选路到X),并发给Y更新报文(此时因为Z不需要经过Y进行选路,因此将告诉Y自己到X的距离为50)。
(3)Y在接收到Z的报文后,重新将距离更新为Dy(x) = Dy(z) + Dz(x) = 1 + 50 = 51,并告诉Z自己到X的距离是∞(实际是51,y的最小路径已经经过了z,这么做是避免z再次选到y)。
(4)Z收到报文后,发现最低耗费并没有改变,因此算法进入静止状态。
@ L-S 路由算法:
基本思想:
所有的节点都知道网络拓扑和链路费用:通过链路状态广播实现,所有节点具有相同的信息。
以一个节点作为“源”,计算到其他所有节点的最短路径,Dijkstra算法,算出该节点的路由表。
Dijkstra 算法:
❤ L-S 与 D-V 的对比:
|| 相应协议:
@ RIP : 选路信息协议
- 采用D-V算法,距离度量最大15跳。
- RIP通告:RIP响应报文,每隔30秒邻居之间交换一次;
通告报文内容:到达AS内部最多25个目的子网的距离 - 示例:
- 链路故障与恢复:
- 报文格式:
@ OSPF(Open Shortest Path First)