1. 链路开销减少
原本如上图所示👆(只关注y,z),t时刻x->y的开销变为1
t | x | y | z |
---|---|---|---|
y | 4 | 0 | 1 |
z | 5 | 1 | 0 |
t0时刻y检测到变化
t0 | x | y | z |
---|---|---|---|
y | 1 | 0 | 1 |
z | 5 | 1 | 0 |
t1时刻,z接收到y的更新信息
t1 | x | y | z |
---|---|---|---|
y | 2 | 1 | 0 |
z | 1 | 0 | 1 |
当开销减小,总共只需要t->t1->t2,两次迭代即可变为静止状态—“**好消息传得快**”
**
2. 链路开销变大
2.1 三个节点
原本如上图所示👆(只关注y,z),t时刻x->y的开销变为60
t | x | y | z |
---|---|---|---|
y | 4 | 0 | 1 |
z | 5 | 1 | 0 |
t0时刻y检测到变化:min{60+0,1+5}=6,(y,x)=>6
t0 | x | y | z |
---|---|---|---|
y | 6 | 0 | 1 |
z | 5 | 1 | 0 |
t1时刻y更新数据给z:min{50+0,1+6}=7,(z,x)=>7
t1 | x | y | z |
---|---|---|---|
y | 7 | 1 | 0 |
z | 6 | 0 | 1 |
… …
t44时刻
y: **min{60+0,1+49}=50,(z**,x)=>50 | z: **min{50+0,1+50}=50,(z,x)=>50,此时对于z终于直接选路z->x而非不切实际的z->y->x** | ||||||
---|---|---|---|---|---|---|---|
t45 | x | y | z | t44 | x | y | z |
y | 51 | 1 | 0 | y | 50 | 1 | 0 |
z | 50 | 1 | 0 | z | 49 | 1 | 0 |
t45时刻
y: min{60+0,1+50}=51,(z,x)=>51,此后确定最小开销为51,不再改变 | z不变 | ||||||
---|---|---|---|---|---|---|---|
t44 | x | y | z | t44 | x | y | z |
y | 50 | 1 | 0 | y | 50 | 1 | 0 |
z | 49 | 1 | 0 | z | 49 | 1 | 0 |
之后进入静止状态
分析⭐:当开销变大,总共需要44次迭代才能到达静止状态,这种”震荡”即路由环路,由于pkt的TTL每次减一,震荡极易产生丢包,而问题原因在一:自于x-y的开销增大后,z-y-x的开销没有及时更新,y误以为z-x的开销仍然很小从而选择y-z-x,从而开销加一;反过来z-x时发现y-x开销加一啊,因此z-y-x的开销也加一…如此反复
解决:毒性逆转
由于z的路径本身就是是z-y-x,因此z要告知y,z-x=∞,才能避免由于y-x变化产生的不可数问题
修改:
t0时刻y检测到变化,毒性反转限制:此时z->x是z-y-x,因此z给y的信息为z-x=∞
min{60+0,1+∞}=60,(y,x)=>60,路径直接y-x
t0 | x | y | z |
---|---|---|---|
y | 60 | 0 | 1 |
z | ∞ | 1 | 0 |
t1时刻y更新数据给z,且y-x,无z为中间节点,传递真实数据
min{50+0,1+60}=50,(z,x)=>50
t0 | x | y | z |
---|---|---|---|
y | 50 | 1 | 0 |
z | 60 | 1 | 0 |
此后进入静止状态,问题看似解决,但重点在于应用毒性逆转后,**对于节点个数>3的情况,会出现问题**
2.2 大于三个节点
如图所示(AB等效),t时刻c-d变化,但由于C作为必经之路,使得A(B)->D始终受毒性逆转
t | A | B | C | D |
---|---|---|---|---|
C | 1 | 1 | 0 | 1 |
A | 0 | 1 | 1 | ∞ |
B | 1 | 0 | 1 | ∞ |
t0时刻c更新,受毒性逆转限制,A(B)->D调整为∞
t | A | B | C | D |
---|---|---|---|---|
C | 1 | 1 | 0 | 100 |
A | 0 | 1 | 1 | ∞ |
B | 1 | 0 | 1 | ∞ |
t1时刻A(B)更新,min{∞,1+2,1+100}=3
t | A | B | C | D |
---|---|---|---|---|
A | 0 | 1 | 1 | 3 |
B | 1 | 0 | 1 | 2 |
C | 1 | 1 | 0 | 100 |
t2,C更新
t | A | B | C | D |
---|---|---|---|---|
C | 1 | 1 | 0 | 100 |
A(B) | 0 | 1 | 1 | ∞ |
t3时刻A(B)更新,min{∞,1+3,1+100}=4
t | A | B | C | D |
---|---|---|---|---|
A | 0 | 1 | 1 | 4 |
B | 1 | 0 | 1 | 3 |
C | 1 | 1 | 0 | 100 |
…不可数问题再次出现,因为B-D始终不经过A,普通毒性逆转无法觉察
解决:毒性逆转plus版本
当**来自邻居节点的开销上升,且通过其选路**时才逆转
修改:
初始C
t | A | B | C | D |
---|---|---|---|---|
C | 1 | 1 | 0 | 1 |
A | 0 | 1 | 1 | 2 |
B | 1 | 0 | 1 | 2 |
t0时刻开销改变,min{100+3,1+2,1+2}=3
t | A | B | C | D |
---|---|---|---|---|
C | 1 | 1 | 0 | 3 |
A | 0 | 1 | 1 | 2 |
B | 1 | 0 | 1 | 2 |
⭐t1时刻A(B)更新,min{∞,1+2,1+3}=3,此时:
①邻居C的C-D开销变大
②A-D更新后依据A-C-D选路,满足毒性逆转
则A->C发送开销为{0,1,1,∞}
t | A | B | C | D |
---|---|---|---|---|
A | 0 | 1 | 1 | 3 |
B | 1 | 0 | 1 | 2 |
C | 1 | 1 | 0 | 3 |
B同理发送给C{1,0,1,∞}
t | A | B | C | D |
---|---|---|---|---|
B | 1 | 0 | 1 | 3 |
A | 0 | 1 | 1 | 2 |
C | 1 | 1 | 0 | 3 |
t2,C更新,min{100+0,1+∞,1+∞}=100
t | A | B | C | D |
---|---|---|---|---|
C | 1 | 1 | 0 | 100 |
A | 0 | 1 | 1 | ∞ |
B | 1 | 0 | 1 | ∞ |
t3,A更新,min{∞,1+∞,1+100}=101
t | A | B | C | D |
---|---|---|---|---|
A | 0 | 1 | 1 | 101 |
B | 1 | 0 | 1 | ∞ |
C | 1 | 1 | 0 | 100 |
毒性逆转plus版本相当于先不管毒性逆转,直到出现节点A上发现两个指征时,自己的信息依旧按照+1更新,但在给其余任何相邻节点的消息中都把变化的开销谎报为∞