CS168 Project#1

大三學習計網時所做的實驗,今年換我做助教来驗收,當然,是幾乎全忘了。所以又重新做了一遍,那麼就做个記録。

Stage 1/10: Static Routes

靜態路由初始化,一開始就與主機相連的路由器应當將該主機的信息作為靜態路由加入路由表中。於是需要創建一個新的 TableEntry,具體如何實現祗需看看 dv.py 中的類定義就能明白,参數依實驗文檔。

Stage 2/10: Forwarding

轉發數據包,每當路由器收到一個有效的包,檢查路由表中有無終點條目,有則轉發。其它情況,丢棄。(注意,此處的 latency 是指從當前的路由器至終點的延遲,若超過 INFINITY,則不必轉發。)

Stage 3/10: Sending Routing Tables Advertisements

顯然路由表中祗有靜態路由是不夠的,所以需要不斷向旁邊的路由器轉發自己的路由去更新對方的路由表。遮裏源碼已考慮了發送時機,祗需實現發送路由的函數就行。並且在該測試點,祗需完成 force=Ture 的情況,也就是全部路由都予以轉發。

Stage 4/10: Handle Route Advertisements

轉發路由,自然需要處理。逻輯在文檔中已給出。遮裏需要注意的是,若新的 latency 與舊的相同,是不更新的。

Stage 5/10: Handling Routing Tables Timeouts

延遲在網絡中是變化的,網絡中的連接關係也是變化的,於是路由也是有時效的。當路由的 expire_time 已是過去時,則删除該路由。

Stage 6/10: Split Horizon (Let’s Get Loopy)

若例子所示,當網絡中的某一連接斷開時,兩个主機已無法 ping 通,此時網絡的相邻兩點可能會相互認為對方可達目的主機而造成數據包不斷在兩者之間來回發送。解決方法很容易,那就是對於每個路由,若其由端口 $port$ 更新,則 advertise 時則不將該數據包由此發出。然而遮樣還是會產生在環長大於二的環中的無限轉發。

Stage 7/10 Poison Reverse (Still loopy)

水平分割會導致壞死的路由仍然留存,所以收斂較慢。毒性逆轉方法不是不轉發,而是發送一個投毒的路由來迅速消除該路由的影响。

Stage 8/10: Counting to Infinity

當路由器組成環,而實際通往主機的連接斷開,路由之開不斷更新路由使得 expire_time 未及,導致 latency 記數到無窮,遮也是前面方法可能出現的問題。解決方法就是設定一個 latency 的大閾值 INFINITY,當達到遮個值時就丢棄遮個包。具體逻輯細節見文檔。

Stage 9/10: Poisoning Expired Routes

路由表收斂時間太長,類似毒性逆轉的思路,對過期路由投毒。

Stage 10/10: Becoming Eventful

優化,多維護一個數據結構記録最新的目的、端口對應轉發的路由,當 force=False 時,祗轉發那些改變的了路由。在新增一條連接時,從新增的端口轉發路由。在減少一條連接時,在對應端口轉發投毒路由,并删除該路由。隨便一寫,祗過了 12/31,似乎無寫也是差不多,有時間再想吧。

// 12.14.2023 更新

明白了,在 handle route packets 後要主動調用一次 send_routes。

References

project guide

Leave a Reply