【乙太網資料結構】乙太網頭部
阿新 • • 發佈:2019-02-08
乙太網封包格式如圖所示:
乙太網目的地址和源地址各佔6個位元組,該地址即平常所說的網絡卡的MAC。每個網絡卡在全球擁有唯一的MAC!
在地址後面有兩個位元組表示型別,如:0800表示此真資料是IP資料,0806表示ARP請求。後面部落格會針對講解。
型別欄位之後是資料,對於乙太網,資料段大小為46-1500位元組,不足46位元組的資料將被自動補足到46位元組。如ARP協議的資料格式為28位元組,為了符合規範,其後被填充了18個位元組以達到最少46位元組的要求。
CRC欄位用於對幀內資料進行校驗,保證資料傳輸的正確性,通常是硬體實現的。
乙太網資料包格式較為簡單,簡述到此!
最後留一個問題,乙太網資料包在網路中最終傳輸到目的地是用的IP來定址還是MAC來定址?(想一想,如果只是沒有目的地IP,資料會準確的送達到目的地嗎?倘若只是沒有MAC呢?)
在區域網內,協議棧根據MAC來精確的將資料送達到指定網絡卡,而在廣域網中,資料在網際中肆意穿梭,直到到達目的IP(當然,資料包有生存時間的限制,以防止資料包在網路中無限迴圈下去)
相關原始碼
在linux/if_ether.h檔案中,乙太網包頭結構體定義如下:
#define ETH_ALEN 6
struct ethhdr {
unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
unsigned char h_source[ETH_ALEN]; /* source ether addr */
__be16 h_proto; /* packet type ID field */
} __attribute__((packed)); //packed屬性:使用該屬性可以使得變數或者結構體成員使用最小的對齊方式,即對變數是一位元組對齊,對域(field)是位對齊。
獲取乙太網包頭函式(提示:測試該函式返回值不為空後再使用)
static inline struct ethhdr *eth_hdr(const struct sk_buff *skb)
{
return (struct ethhdr *)skb_mac_header(skb);
}