1、引言
前段時間編寫了一個網絡監聽工具。為了分析抓到的數據包,要熟悉各種網絡協議。本人痛苦的發現網上很少有集中講解這方面的文章,而圖書大部分講解得不夠仔細,小部分專門研究網絡協議的圖書又太大,不適合我們的要求。故把常用的以太網協議寫出來和大家分享。
2、以太網的特點
以太網采用的是CSMA/CD技術,即帶碰撞檢測的載波偵聽多址訪問。在CSMA/CD技術中,如果網絡上沒有數據,則任何時候都可以將數據傳送出去。如果網絡被使用,那就要等到網絡空閒時再傳送。在以太網中傳輸的數據是無選擇的發送到所有網卡的。這就為網絡監聽創造了條件。
3、以太網數據包
在以太網中,數據是以被稱為幀的數據結構體為單位進行交換的。這種數據包結構如下圖所示:
報頭 報文
在以太網桢的報頭中包含接收端及發送端的地址,桢的報文部分包含的是數據種類。最後放置的是錯去校驗和修正碼。通常我們抓到的數據包已經去掉了同步碼和桢分界符。下面先給出報頭部分的定義:
以太網桢報頭格式 接收端MAC地址(48位) 發送端MAC地址(48位) 類型字段(16位)
注意:這裡提到的是位,一位就是二進制數據中的一位。通常,一個字節是由8位組成的。
類型字段意義(參考RFC1700) 類型(十六進制) 協議 0800 IP 0806 ARP 8035 RARP 809B Appletalk 8137-8138 Novell 814C SNMP
4、IP數據報的構成
當以太網數據桢的類型字段為十六進制0800時,表示以太桢報文部分是一個IP數據報。其格式如下所示,其中報頭部分存儲了版本、頭長度、生存時間、接收和發送端IP地址等重要信息。
報頭 報文
IP數據報報頭定義 字段 位數 說明 版本 4 表示IP的版本。現目前的版本號為4 報頭長度 4 表示報頭的長以32位為一個單位 服務類型 8 優先級和可靠性等服務品質要求的數值 數據報長度 16 IP數據報的全部長度,以8位(字節)為單位 標識 16 識別IP數據報的編號 標志 3 標示有無碎塊 數據塊偏移 13 產生碎塊時應該比達到的數據塊早到的數據塊大小 生存時間 8 存放控制IP數據報壽命長短的數值 協議 8 標示上層協議 報頭校驗碼 16 檢查報頭錯誤用的校驗碼 發送端地址 32 發送端的IP地址 目的地地址 32 接收端的IP地址
5、TCP協議
傳輸控制協議(TCP)是在傳輸層使用的協議。當IP數據報的協議字段的值為6時,表示本IP數據報的報文部分是TCP數據報。
TCP數據報頭定義 字短名 長度(位) 意 義 發送端端口 16 發送端及客戶夫端程序的端口號 接收端端口 16 接收端及服務器端程序得端口號 順序號 32 標示消息段的數據位於全體數據塊的眸字節的數值 確認號 32 表示接受端對於發送端接收到的數據塊數值 數據偏移 4 報頭長,以32位為一個單位 預留 6 擴展用(預留) 控制位 6 表示某字段意義的位 窗口 16 窗口的大小(一次可以發送的數據量) 校驗碼 16 錯誤檢查用 緊急數據指針 16 插入信號等緊急數據的結束位置 選項和填充 32 選相等
6、UDP數據報
當IP數據報的協議字段的值等於17,表示IP數據報的報文部分攜帶的是UDP數據報。下面是UDP數據報頭的構造。
UDP數據報 發送端端口(16位) 接收端端口(16位) 數據報長度(16位) 校驗碼(16位) 數據
7、關於程序
為了更好的理解本文提到的協議,及它們之間的一些簡單關系,作者開發了一個簡單的網絡監控軟件,讀者可以參照程序的運行理解本文。
本文配套源碼