1. 程式人生 > >【乙太網資料結構】乙太網頭部

【乙太網資料結構】乙太網頭部

乙太網封包格式如圖所示:
乙太網封包格式如圖所示

乙太網目的地址和源地址各佔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);
}