1、以太網幀格式
以太網常用幀格式有兩種, 一種是Ethernet II,另一種是IEEE 802.3 格式。這兩種格式區別是:Ethernet II中包含一個Type字段,描述了以太網首部后面所跟數據包的類型,標識以太幀處理完成之后將被發送到哪個上層協議進行處理;而IEEE 802.3格式中同樣的位置是長度字段。 其中。以太網中大多數的數據幀使用的是 Ethernet II幀格式,而IEEE 802.3只支持IPX/SPX協議(爭議)
a、Ethernet II幀格式
b、IEEE 802.3幀格式
前導碼(Preamble):Ethernet II是由 8個8bit (位) 10101010構成,共8Byte (字節), IEEE802.3由7個8bit(位) 10101010+1個8bit(位)幀起始符(SFD)10101011構成,共8Byte (字節)。
目的地址(DMAC):是目的MAC地址。DMAC字段長度為6個字節,標識幀的接收者。
源地址(SMAC):是源MAC地址。SMAC字段長度為6個字節,標識幀的發送者。
類型( Ethernet II): 用於標識以太網首部后面所跟數據包的類型,字段取值大於等於1536 (或者十六進制的0x0600),例如Type為0x0800時后面為IP協議包,Type為0x0806時后面為ARP協議包.
長度( IEEE802.3 ):也稱有效數據長度,字段取值小於等於1500(或者十六進制的0x05DC),定義了Data字段包含的字節數。抓包軟件中看到的Length表示的是有效數據長度,並不包含填充(Pading)長度。
數據部分(Payload):數據也叫有效載荷,這是網絡層傳遞給數據鏈路層的幀,其長度為 46-1500 Bytes。以太網協議規定最小報文64字節【6+6+2+數據+4=64(不算前導碼)】,因此幀數據部分最小為46字節,不足46字節(如ARP和RARP包)時,由設備驅動程序(MAC子層)在數據字段后面填充(Pading)至46字節。
FCS: 數據校驗字段,用於存儲 CRC(循環冗余校驗)結果的幀的幀尾。MAC發送側(MAC_TX)創建每個幀時都將運行它。MAC接收側(MAC_RX)接收到幀時,以從目的MAC到數據這部分內容作為輸入數據進行 CRC 計算,計算結果與接收幀的FCS字段比較,結果相同表示幀有效,結果不同則將幀丟棄。(FCS錯誤主要發生在物理口與RJ45接口之間的鏈路上)
---------------------------------------------------------------------
這里需要注意:因為802.3幀的LLC和SNAP字段占用的是Data字段的8個字節,因此實際上層數據承載最大就變成了1492字節。
邏輯鏈路控制LLC(Logical Link Control):由目的服務訪問點DSAP(Destination Service Access Point)、源服務訪問點SSAP(Source Service Access Point)和Control字段組成。
SNAP(Sub-network Access Protocol):由機構代碼(Org Code)和類型(Type)字段組成。Org code三個字節都為0。Type字段的含義與Ethernet_II幀中的Type字段相同。
IEEE802.3幀根據DSAP和SSAP字段的取值又可分為以下幾類:
1)當DSAP和SSAP都取特定值0xff時,802.3幀就變成了Netware- ETHERNET幀,用來承載NetWare類型的數據。
2)當DSAP和SSAP都取特定值0xaa時,802.3幀就變成了ETHERNET_SNAP幀。ETHERNET_SNAP幀可以用於傳輸多種協議。
3)DSAP和SSAP其他的取值均為純IEEE802.3幀。
以太網幀格式多達5種,事實上,今天的大多數TCP/IP應用都是用Ethernet V2幀格式,而交換機之間的BPDU數據包是IEEE802.3/LLC的幀,VLAN Trunk協議如802.1Q和Cisco的CDP等則是采用IEEE802.3/SNAP的幀。估計是設備間一些協議才用到802.3幀格式,是因為需要802.3幀攜帶一些控制信息。
---------------------------------------------------------------------
以太網首部是:
據RFC894的說明,以太網封裝的數據部分(Payload)的最大長度是1500Byte【稱為以太網的最大傳輸單元(MTU),注意,MTU這個概念指數據幀中有效載荷的最大長度,不包括幀首部的長度】,在這個限制之下,最長的以太幀包括6字節的目的地址(DMAC)、6字節的源地址(SMAC)、2字節的以太類型(EtherType)、1500字節的數據(Payload)、4字節的校驗(FCS),總共是1518字節。
但是實際上我們抓包得到的最大幀是1514字節,為什么不是1518字節呢? 原因是當數據幀到達網卡時,在物理層上網卡要先去掉前導同步碼和幀開始定界符,然后對幀進行CRC檢驗,如果幀校驗和錯,就丟棄此幀。如果校驗和正確,就判斷幀的目的硬件地址是否符合自己的接收條件(目的地址是自己的物理硬件地址、廣播地址、可接收的多播硬件地址等),如果符合,就將幀交“設備驅動程序”做進一步處理。這時我們的抓包軟件才能抓到數據, 因此,抓包軟件抓到的是去掉前導碼、幀開始分界符、FCS之外的數據,其最大值是6+6+2+1500=1514字節。
2,數據封裝
當我們應用程序用TCP傳輸數據的時候,數據被送入協議棧中,然后逐個通過每一層,直到最后到物理層將數據幀轉換成比特流,送入網絡。而在這個過程中,每一層都會對要發送的數據加一些首部信息。整個過程如下圖,每層數據向下傳輸時都會進行封裝,幀有效數據來源於上級網絡層。
如圖可以看出,每一層數據是由上一層數據+本層首部信息組成的,其中每一層的數據 ,稱為本層的協議數據單元 ,即PDU.
應用層數據在傳輸層添加TCP報頭后得到的PDU被稱為 Segment(數據段 ),圖示為TCP段
傳輸層的數據(TCP段)傳給網絡層,網絡層添加IP報頭得到的PDU被稱為Packet(數據包); 圖示為IP數據包
網絡層數據報(IP數據包)被傳遞到數據鏈路層,封裝數據鏈路層報頭得到的PDU被稱為Frame(數據幀),圖示為以太網幀。
最后,幀被轉換為比特,通過網絡介質傳輸。這種協議棧逐層向下傳遞數據,並添加報頭和報尾的過程稱為封裝。
3,IP數據報格式
IP數據報格式如下圖
TCP首部與TCP數據段格式
UDP(也是傳輸層)數據段格式
ARP數據包格式
(1)硬件類型字段指明了發送方想知道的硬件接口類型,以太網的值為1;
(2)協議類型字段指明了發送方提供的高層協議類型,IP為0800(16進制);
(3)硬件地址長度和協議長度指明了硬件地址和高層協議地址的長度,這樣ARP報文就可以在任意硬件和任意協議的網絡中使用;
(4)操作字段用來表示這個報文的類型,ARP請求為1,ARP響應為2,RARP請求為3,RARP響應為4;
(5)發送方的硬件地址(0-3字節):源主機硬件地址的前3個字節;
(6)發送方的硬件地址(4-5字節):源主機硬件地址的后3個字節;
(7)發送方IP(0-1字節):源主機硬件地址的前2個字節;
(8)發送方IP(2-3字節):源主機硬件地址的后2個字節;
(9)目的硬件地址(0-1字節):目的主機硬件地址的前2個字節;
(10)目的硬件地址(2-5字節):目的主機硬件地址的后4個字節;
(11)目的IP(0-3字節):目的主機的IP地址。