【lwip】07-鏈路層收發以太網數據幀源碼分析

目錄

  • 前言
  • 7.1 鏈路層概述
  • 7.2 MAC地址的基本概念
  • 7.3 以太網幀結構
  • 7.4 以太網幀結構
  • 7.5 以太網幀報文數據結構
  • 7.6 發送以太網數據幀
  • 7.7 接收以太網數據幀
  • 7.8 虛擬局域網VLAN源碼分析
    • 7.8.1 以太網標準幀和VLAN幀的區別
    • 7.8.2 以太網發送帶VLAN數據幀
    • 7.8.3 以太網接收帶VLAN數據幀
    • 7.8.4 開啟VLAN功能ETHARP_SUPPORT_VLAN
  • 7.9 一個硬件映射到多個IP
前言參考lwip的ethernet.cethernet.h文件 。原文:李柱明博客園
7.1 鏈路層概述簡單概述 。
相關術語:
  • 結點(node):運行鏈路層協議的設備 。如主機、路由器、交換機和WiFi接入點 。
  • 鏈路(link):沿著通信路徑連接相鄰結點的通信信道 。
  • 數據?。毫綽凡忝懇恢∈蒞黶ize有限,如果上層傳遞下來的數據報size超出鏈路層每幀能接收的數據size極限,就會分片 。(這里不細說)
在TCP/IP協議族中,鏈路層主要有三個目的:
  1. 為IP模塊發送和接收IP數據報;
  2. 為ARP模塊發送ARP請求和接收ARP應答;
  3. 為RARP發送RARP請求和接收RARP應答 。
TCP/IP支持多種不同的鏈路層協議,這取決于網絡所使用的硬件 , 如以太網、令牌環網、FDDI(光纖分布式數據接口)及RS-232串行線路等 。
數據報從源主機傳輸到目標主機時 , 數據報必須通過端到端路徑上的各段鏈路才能達到目標主機 。
各種端到端的鏈路層協議由具體的端到端決定,鏈路層設備只需要把數據報封裝在自己的鏈路層幀并轉發到下一個端設備即可 。
7.2 MAC地址的基本概念MAC Address(Media Access Control Address),亦稱為EHA(Ethernet Hardware Address)、硬件地址、物理地址(Physical Address) 。
在OSI模型中 , 第三層網絡層負責 IP地址,第二層數據鏈路層則負責 MAC位址 。
所以一個主機會有一個IP地址,而每個網絡位置會有一個專屬于它的MAC位址 。
MAC地址組成(48字節):前3個字節表示組織唯一標志符(OUI)+后3個字節由廠家自行分配的擴展標識符 。
7.3 以太網幀結構IEEE 802.2/802.3(RFC 1042)和以太網的封裝格式(RFC 894)參考圖:
7.4 以太網幀結構IEEE 802.2/802.3(RFC 1042)和以太網的封裝格式(RFC 894)參考圖:
【lwip】07-鏈路層收發以太網數據幀源碼分析

文章插圖
目標MAC地址(6字節):這個字段包含目標網卡的MAC地址,當一個網卡收到一個以太網數據幀 。
  • 如果該數據幀的目標地址是網卡自身的MAC地址或者是MAC廣播地址,它都將該幀的數據字段的內容傳遞給網絡層;
  • 如果收到了其他MAC地址的?。蚪檬葜《?。
源MAC地址(6字節):這個字段包含了傳輸該幀到局域網上的適配器的MAC地址 。類型/長度字段(2字節):類型字段允許以太網復用多種網絡層協議 。是表示當前以太網幀的數據區是哪個協議的數據包 。
  • 0x0800:表示當前數據幀中裝載的數據為IPV4數據報 。
  • 0x0806:表示當前數據幀中裝載的數據為ARP數據報 。
  • 0x0835:表示當前數據幀中裝載的數據為RARP數據報 。
  • 注意:
    • Ethernet II和IEEE802.3的幀格式主要的不同點在于前者定義的2字節的類型,而后者定義的是2字節的長度 。類型字段和長度字段互斥,但是類型值和長度值是不相同的 , 以此來區別兩種幀格式 。
    • 如果該字段值大于等于0x0600時,表示數據包中的協議類型,反之表示長度 。
    • 長度字段表示它后續數據的字節長度,但不包括CRC校驗碼 。
數據字段(46~1500字節):這個字段承載了上層數據報 。
  • 以太網的最大傳輸單元(MTU)是1500字節 。這意味著如果IP數據報超過了1500字節,則主機必須將該數據報分片 。
  • 數據字段的最小長度是46字節,如果數據報小于46字節,數據報必須被填充到46字節 。當采用填充時 , 傳遞到網絡層的數據包括數據報和填充部分,網絡層使用IP數據報首部中的長度字段來去除填充部分 。
【【lwip】07-鏈路層收發以太網數據幀源碼分析】CRC(4字節):CRC字段包含了以太網的差錯校驗信息 。
在以太網中MAC地址可分為3類:
  1. 單播地址 。