CS144-lab6-the IP router

lab 地址 :lab6-doc
代碼實現 :lab6-code

1. 目標

lab6 主要要實現一個路由的機制,首先互聯網由多個局域網組成(不太嚴謹的說法),在 lab5 中我們只能支持在單個局域網中傳遞消息,確定目標地址(arp)。
而跨局域網的情況下,需要確定跨局域網的路由器地址,這裏就需要用到路由表。

路由器的主要工作就是爲經過路由器的每個數據包尋找一條最佳的傳輸路徑,並將該數據有效地傳送到目的站點。由此可見,選擇最佳路徑的策略即路由算法是路由器的關鍵所在。爲了完成這項工作,在路由器中保存着各種傳輸路徑的相關數據——路由表(Routing Table),供路由選擇時使用,表中包含的信息決定了數據轉發的策略。打個比方,路由表就像我們平時使用的地圖一樣,標識着各種路線,路由表中保存着子網的標誌信息、網上路由器的個數和下一個路由器的名字等內容。路由表可以是由系統管理員固定設置好的,也可以由系統動態修改,可以由路由器自動調整,也可以由主機控制。

lab6 中主要要實現的是兩個接口

//! Send a single datagram from the appropriate outbound interface to the next hop,
//! as specified by the route with the longest prefix_length that matches the
//! datagram's destination address.
void route_one_datagram(InternetDatagram &dgram);

//! Add a route (a forwarding rule)
void add_route(const uint32_t route_prefix,
const uint8_t prefix_length,
const std::optional<Address> next_hop,
const size_t interface_num);

添加路由規則和正確路由一個數據報。

2. 實現

2.1 add_route

添加路由的邏輯比較簡單,其實就是將參數中路由規則添加到路由表中,需要自定義一個路由表緩存結構。其中比較關鍵的參數爲 route_prefixprefix_length ,這兩者可以構建出一個 ip 範圍。
假設有 ip “18.47.0.0/16”,那麼它的 route_prefix 就是 305070080 (18 × 224 + 47 × 216) ,而 prefix_length 則是 16。
這裏選擇將參數都塞到一個結構體 RouteRule,然後用 vector 存放 RouteRule

2.2 route_one_datagram

路由表的目的是爲了確認數據報的目標地址是否在路由表中有匹配的路由,路由匹配規則參考下圖

由此可以確定,匹配一個路由的規則爲:
route_prefix 右移 32 - prefix_length 位,目標 ip 地址也同樣右移相同位數,然後比較兩者是否相等,相等表示路由規則匹配。此外需要區別一種特殊情況,即 prefix_length 爲 0,這時路由是滿足匹配條件的。
接口的大致流程如下:

  1. 根據路由匹配規則,遍歷路由表獲取匹配的路由
  2. 當存在多條路由匹配的時候,選擇 prefix_length 最長的路由規則
  3. 如果沒有匹配的路由,則 drop 數據報
  4. 遞減 datagram 的 ttl,如果遞減完後 ttl 爲 0 或者遞減前 ttl 爲 0,則 drop 數據報
  5. 條件滿足的情況下,發送數據報

TTL是 Time To Live的縮寫,該字段指定IP包被路由器丟棄之前允許通過的最大網段數量。TTL是IPv4報頭的一個8 bit字段。

3. 測試結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章