FPGA工程師必備技能_Ethernet接口_千兆以太網_以太幀詳解
- 以太網幀結構
- 版權聲明以太網幀結構頭部資料上層協定封包校驗和校驗和計算1、前導碼和幀開始符:2、幀後面的校驗碼 (FCS/CRC)以太網單個最大幀:以太網最小幀:常見的以太網幀類型:
以太網幀結構
版權聲明
版權聲明:本文為CSDN部落客「牛牛來了」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。本人針對原部落客文章進行了少許原創性改動。
原文連結:https://blog.csdn.net/weixin_44081384/article/details/126707216
以太網幀結構
以太網幀發送資料時都是從8個位元組的前導碼開始的。前導碼是1和0的互動。
> > 前導碼:作用是通知接收方有資料到來。要與其的時鐘保持同步。在實體層加進去的。不屬于幀這部分
>
> SPD :是一個位元組10101011,最後使用11,來通知接收方下一個字段就是目的主機的位置。
>
> DA :目的節點的MAC
>
> SA :源節點的MAC
>
> Type/length: 2位元組,根據數值的不同代表不同的封裝格式。
>
> 字段length :0x0000~0x50DC 範圍内,該幀為802.3 raw 封裝
>
> 字段type :0x0600~0xFFFF 範圍内,該幀為 Ethernet II 封裝
>
> Payload:上層協定有效載荷。最小為46個位元組,最大為1500位元組,
> 對于Type封裝格式,上層協定必須保證該字段的值大于46位元組;
> 對于 Length 封裝,對于有效載荷不夠46位元組的封包鍊路層必須進行填充。
>
> FCR : 4位元組的校驗和。(在vlan 頭中有trailer字段(尾部标記):trailer是CRC校驗和:對應封包的最後4個位元組)
1234567891011121314151617181920
在以太網中,資料通信的基本機關是 以太網幀 ( frame ),由 頭部 ( header )、資料 ( data )以及 校驗和 ( checksum )三部分構成:
頭部
以太網幀頭部包含 3 個字段,依次是:
1、目的位址:長度是 6 位元組,用于标記資料由哪台機器接收;
2、源位址 :長度也是 6位元組,用于标記資料由哪台機器發送;
3、類型 :長度是 2 位元組,用于标記資料該如何處理, 0x0800 表示該幀資料是一個 IP 包(後續章節介紹)。
資料
資料 可以是任何需要發送的資訊,長度可變, 46 至 1500 位元組均可。
上層協定封包
例如 IP 包,可以作為資料封裝在以太網幀中,在資料鍊路層中傳輸。
是以,資料還有另一個更形象的稱謂,即 負荷 ( payload)。
校驗和
由于實體信号可能受到環境的幹擾,網絡裝置傳輸的比特流可能會出錯。
一個以太網幀從一台主機傳輸到另一台主機的過程中,也可能因各種因素而出錯。
那麼當主機收到以太網幀時,如何确定它是完好無損的呢?
答案是: 校驗和 。
我們可以用諸如 循環備援校驗 ( CRC )算法,為以太網幀計算校驗和。
如果以太網幀在傳輸的過程出錯,校驗和将發生改變。
注意到,以太網幀最後面有一個 4 位元組字段,用于儲存校驗和。
發送者負責為每個以太網幀計算校驗和,并将計算結果填寫在校驗和字段中;
接收者接到以太網幀後,重新計算校驗和并與校驗和字段進行對比 ;
如果兩個校驗和不一緻,說明該幀在傳輸時出錯了。
校驗和計算
校驗和,校驗和應該叫16進制反碼求和,就是将所有的位元組加起來,再由ffff來減得到的值。
我這來計算ip header的checksum,其他的校驗和計算方式一樣的。
從封包中看到header checksum為0X495c
整個ip header去除49 5c,為45 00+00 1d+6d 5e+80 01+c0 a8+01 d4+c0 a8+0101=2B6A1(至于為什麼00 00不加不解釋)
2B6A1=B6A1+2=b6a3
ffff-b6a3=495c
看結果出來了吧,校驗和是個很粗糙的計算方式(與md5相比),如果你source 與destination調換一下,結果相同,在鍊路層計算正确後到達網絡層,經過ip頭部校驗可能還會出錯,到達tcp或者udp也還可能出錯,隻是友善了網絡裝置的計算。當然你從source發往destination與destination發往source校驗和肯定不會相同,應該裡面的ttl與辨別符會有差别。
對我們來說能抓到的或者能看到的封包幀,基本上是在目标MAC位址到IP資料包。
1、前導碼和幀開始符:
主要做一些底層的資料傳輸和編碼流的二進制流,
它們本身不會被網卡捕獲,網卡一般抓包的時候就已經将前導碼跟幀開始符解析掉了。
2、幀後面的校驗碼 (FCS/CRC)
其主要是通過CRC校驗判斷幀是否有效或者發生篡改或錯誤,當網卡能收到資料幀并通過抓包工具可以抓到的,就說明該幀沒有問題,是有效的,當幀是有效的後,就說明CRC就已經解析掉了。
是以,在整個以太網幀中,能看到的就是目标MAC位址、源MAC位址、幀類型以及IP資料包,當然IP資料包中還會細分許多協定,每個幀之間也是跟CAN類似有,有一定的距離,不可能一幀挨着一幀傳輸的。
IP資料包裡面,有46~1500 位元組的長度限制。這不是由ECU決定的。在我們使用的裝置中,會有一個最大傳輸單元(MTU)、MTU一般預設是1518個位元組,這就導緻IP資料包最多隻有1500個位元組。
以太網單個最大幀:
6(目的MAC)+ 6(源MAC)+ 2(幀類型)+ 1500(IP資料包(IP頭(20)+DATA(1480)))+ 4(CRC校驗)=1518位元組,
如果帶VLAN就是1522位元組(VLAN會多出四個位元組的幀類型描述)
以太網最小幀:
6(目的MAC)+6(源MAC)+2(幀類型)+46(IP資料包(IP頭(20)+DATA(26)))+4(CRC校驗)=64位元組
常見的以太網幀類型:
0x0800:IPv4
0x0806:ARP
0x8100:VLAN Tag(TPID)
0x86DD:IPv6
0x88F7:PTP / gPTP
0x22F0:AVTP
1234567891011
下圖是用工具抓的兩個封包,以友善我們來了解以太網幀結構。上圖封包以太網幀如果小于64位元組,那麼會填充00。
接下來我們對以太網幀進行更詳細的分析
接下來我們看一個DoIP的封包。下圖為用工具抓的一個DoIP封包。
上圖整個DoIP封包整個一個幀是69個位元組(14 + 20 + 20 + 8 + 4 + 3),
其實還要再增加4個位元組的CRC,總共73個位元組。
隻不過當網卡識别它是一個有效幀後,就把CRC 解析掉了。
當然,圖中也描述了
1、以太幀頭:它的源MAC位址(6個位元組)和目的MAC位址(6個位元組),再加上2個位元組的幀類型,共14個位元組。
2、IP頭:最小是20個位元組。
3、 TCP頭:DoIP封包是一個UDS的封包,而UDS封包都是通過TCP傳輸的,是以,會有個TCP的頭部,包括 Src
Port(源端口):13400(這是DoIP的一個端口号)以及 Dst Port(目的端口):50090。TCP的長度是20個位元組;
4、 DoIP協定頭部是8個位元組的長度;需要注意的是,DoIP的頭部并不包括源DoIP位址和目标DoIP位址這4個位元組;
5、Payload:3個位元組,