計算機網絡實驗代碼與文件可見github:計算機網絡實驗整理
實驗名稱 IPv4 分組收發實驗&IPv4 分組轉發實驗
實驗目的:
(注:實驗報告模板中的各項內容僅供參考,可依照實際實驗情況進行修改。)
本次實驗的主要目的。
- IPv4 分組收發實驗 IPv4 協議是互聯網的核心協議,它保證了網絡節點(包括網絡設備和主機)在網絡層能夠按照標准協議互相通信。IPv4 地址唯一標識了網絡節點和網絡的連接關系。在我們日常使用的計算機的主機協議棧中,IPv4 協議必不可少,它能夠接收網絡中傳送給本機的分組,同時也能根據上層協議的要求將報文封裝為 IPv4 分組發送出去。本實驗通過設計實現主機協議棧中的 IPv4 協議,讓學生深入了解網絡層協議的基本原理,學習IPv4協議基本的分組接收和發送流程。另外,通過本實驗,可以初步接觸互聯網協議棧的結構和計算機網絡實驗系統,為后面 進行更為深入復雜的實驗奠定良好的基礎。
- IPv4 分組轉發實驗 通過前面的實驗,我們已經深入了解了IPv4 協議的分組接收和發送處理流程。本實驗需要將實驗模塊的角色定位從通信兩端的主機轉移到作為中間節點的路由器上,在IPv4分組收發處理的基礎上,實現分組的路由轉發功能。網絡層協議最為關注的是如何將 IPv4 分組從源主機通過網絡送達目的主機,這個任務就是由路由器中的 IPv4 協議模塊所承擔。路由器根據自身所獲得的路由信息,將收到的 IPv4 分組轉發給正確的下一跳路由器。如此逐跳地對分組進行轉發,直至該分組抵達目的主機。IPv4 分組轉發是路由器最為重要的功能。本實驗設計模擬實現路由器中的 IPv4 協議,可以在原有 IPv4 分組收發實驗的基礎上,增加 IPv4 分組的轉發功能。對網絡的觀察視角由主機轉移到路由器中,了解路由器是如何為分組選擇路由,並逐跳地將分組發送到目的主機。本實驗中也會初步接觸路由表這一重要的數據結構,認識路由器是如何根據路由表對分組進行轉發的。
實驗內容:
概述本次實驗的主要內容,包含的實驗項等。 - IPv4分組收發實驗
- 實現 IPv4 分組的基本接收處理功能對於接收到的 IPv4 分組,檢查目的地址是否為本地地址,並檢查 IPv4 分組頭部中其它字段的合法性。提交正確的分組給上層協議繼續處理,丟棄錯誤的分組並說明錯誤類型。
- 實現 IPv4 分組的封裝發送 根據上層協議所提供的參數,封裝 IPv4 分組,調用系統提供的發送接口函數將分組發 送出去。
- IPv4分組轉發實驗
- 設計路由表數據結構。設計路由表所采用的數據結構要求能夠根據目的 IPv4 地址來確定分組處理行為(轉發情況下需獲得下一跳的 IPv4 地址)。路由表的數據結構和查找算法會極大的影響路由器的轉發性能,有興趣的同學可以深入思考和探索。
- IPv4 分組的接收和發送。對前面實驗(IP 實驗)中所完成的代碼進行修改,在路由器協議棧的 IPv4 模塊中能夠 正確完成分組的接收和發送處理。具體要求不做改變,參見“IP 實驗”。
- IPv4 分組的轉發。對於需要轉發的分組進行處理,獲得下一跳的 IP 地址,然后調用發送接口函數做進一步處理。
實驗過程:
以文字描述、實驗結果截圖等形式闡述實驗過程,必要時可附相應的代碼截圖或以附件形式提交。
IPv4分組收發實驗
發送函數:在接口函數stud_is_Upsend()中,需要完成如下處理:
① 根據所傳參數(如數據大小),來確定分配的存儲空間的大小並申請分組的存儲空間。
② 按照 IPv4 協議標准填寫 IPv4 分組頭部各字段 ,標識符(Identification)字段可以使用一個隨機數來填寫。(注意:部分字段內容需要轉換成網絡字節序)
③ 完成 IPv4 分組的封裝后,調用 ip_SendtoLower( )接口函數完成后續的發送處理工作,最終將分組發送到網絡中。
發送函數流程圖如下:
接收函數:在接收函數stud_ip_recv()中,需要完成如下處理
① 檢查接收到的 IPv4 分組頭部的字段,包括版本號(Version)、頭部長度(IP Head length)、生存時間(Time to live)以及頭校驗和(Header checksum)字段。對於出錯的分組調用 ip_DiscardPkt( )丟棄,並說明錯誤類型。
② 檢查 IPv4 分組是否應該由本機接收。如果分組的目的地址是本機地址或廣播地址,則說明此分組是發送給本機的;否則調用ip_DiscardPkt( )丟棄,並說明錯誤類型。
② 如果IPV4分組應該由本機接收,則提取得到上層協議類型,調用 ip_SendtoUp( )接口函數,交給系統進行后續接收處理。
流程圖如下:
接收函數錯誤檢測原理:
① 版本號檢測原理:由於本實驗使用的是IPV4,因此需要檢測版本號是否等於4。
② 頭部長度檢測原理:提取頭部長度,如果小於5則可以判斷頭部長度錯誤。
③ TTL檢測原理:TTL應該是一個正數,如果提取出的TTL<=0,可以判斷TTL錯誤
④ 頭部校驗和檢測原理:將IP報文頭部信息使用十六進制表示,並兩兩組合相加,對於相加的結果如果大於0xffff,則將大於0xffff的部分和小於0xffff的部分相加作為最后結果,如果最后的結果等於0xffff,則正確,否則錯誤。
各種錯誤信息對應的實驗中出現的真實數據可見實驗結果部分。
IPv4分組轉發實驗
路由表初始化、路由增加、路由轉發三個函數的實現流程圖
路由表初始化函數:
路由增加函數
從stud_route_msg結構中取得dest, masklen, nexthop,轉為網絡字節序之后經過處理,構建結構體route,並添加到vector中。
路由轉發函數:
所新建數據結構的說明
結構體中共有四項,第一項是掩碼值,是根據掩碼長度計算出的,這也是唯一一個在創建的時候需要計算的項;第二項是目的地址,創建的時候直接從stud_route_msg獲取並轉換即可;第三項是掩碼長度,用於計算掩碼;第四項是下一跳地址,在創建路由表項的時候直接獲取轉換即可。詳細數據結構代碼如下:
struct Route//路由表表項
2. {
3. unsigned int mask;//掩碼
4. unsigned int dest;//目的地址
5. unsigned int masklen;//掩碼長度
6. unsigned int nexthop;//下一跳地址
7.
8. Route(unsigned int dest,unsigned int masklen,unsigned int nexthop)
9. {
10. this->dest=ntohl(dest);
11. this->masklen=ntohl(masklen);
12. this->nexthop=ntohl(nexthop);
13. this->mask=0;
14. if(this->masklen)
15. {
16. this->mask = (int)0x80000000 >> (this->masklen - 1);
17. }
18. }
19. };
請分析在存在大量分組的情況下如何提高轉發效率,如果代碼中有相關功能實現,請給出具體原理說明。
1.存儲結構由線性結構轉換為樹形結構,檢索過程中利用樹形結構性質,提高匹配效率。
2.由於轉發分組過程中對於每個分組的操作都類似,因此可以使用硬件來創建並行檢查與轉發過程。
實驗結果:
采用演示截圖、文字說明等方式,給出本次實驗的實驗結果。
IPv4分組收發實驗
實驗結果展示:
錯誤信息展示:
版本號錯誤:
版本號應該是4,但是發送的信息中版本號是3
頭部長度錯誤:
最小的頭部長度是20字節,但是發送的信息只有12字節,報錯
TTL錯誤:
TTL==0,錯誤
頭部校驗和錯誤:
頭部校驗和應該是0x4AFC,但是發送的信息中是0x03E8
IPv4分組轉發實驗
實驗結果展示:
問題討論:
對實驗過程中的思考問題進行討論或回答。
在IP分組轉發實驗中,如果存在大量的分組的情況下,如何提高轉發效率:
這一點在實驗過程部分就簡單討論過,在此展開討論。
1.首先最直接的一點就是改進存儲的結構,在本實驗中使用的是線性結構,因此查詢的時間復雜度就是O(n)。如果想把查詢時間優化到O(logn),可以根據IP目的地址進行有序存儲,在查詢的時候使用二分查找,這樣查詢時間就可以優化到O(logn),如果希望查詢時間復雜度為O(1),可以將路由表設置為一個哈希表,使用空間換取時間。
2.如果不考慮從查詢時間入手,那么由於存在大量分組,因此可以並行轉發,所有的檢測、匹配等過程都可以並行處理,這可以從硬件層面入手處理。
心得體會:
結合實驗過程和結果給出實驗的體會和收獲。
經過本實驗,對於IPV4的報文結構與檢測、轉發等功能有了更深入的認識,也對於路由表的建立、維護和工作過程有了較為深入的認識。