天天看點

FPGA工程師必備技能_Ethernet接口_千兆以太網_以太幀詳解

FPGA工程師必備技能_Ethernet接口_千兆以太網_以太幀詳解

  • 以太網幀結構
  • 版權聲明以太網幀結構頭部資料上層協定封包校驗和校驗和計算1、前導碼和幀開始符:2、幀後面的校驗碼 (FCS/CRC)以太網單個最大幀:以太網最小幀:常見的以太網幀類型:

以太網幀結構

版權聲明

版權聲明:本文為CSDN部落客「牛牛來了」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。本人針對原部落客文章進行了少許原創性改動。

原文連結:https://blog.csdn.net/weixin_44081384/article/details/126707216

以太網幀結構

FPGA工程師必備技能_Ethernet接口_千兆以太網_以太幀詳解

以太網幀發送資料時都是從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 )三部分構成:

FPGA工程師必備技能_Ethernet接口_千兆以太網_以太幀詳解

頭部

以太網幀頭部包含 3 個字段,依次是:

1、目的位址:長度是 6 位元組,用于标記資料由哪台機器接收;

2、源位址 :長度也是 6位元組,用于标記資料由哪台機器發送;

3、類型 :長度是 2 位元組,用于标記資料該如何處理, 0x0800 表示該幀資料是一個 IP 包(後續章節介紹)。

資料

資料 可以是任何需要發送的資訊,長度可變, 46 至 1500 位元組均可。

上層協定封包

例如 IP 包,可以作為資料封裝在以太網幀中,在資料鍊路層中傳輸。

是以,資料還有另一個更形象的稱謂,即 負荷 ( payload)。

校驗和

由于實體信号可能受到環境的幹擾,網絡裝置傳輸的比特流可能會出錯。

一個以太網幀從一台主機傳輸到另一台主機的過程中,也可能因各種因素而出錯。

那麼當主機收到以太網幀時,如何确定它是完好無損的呢?

答案是: 校驗和 。

我們可以用諸如 循環備援校驗 ( CRC )算法,為以太網幀計算校驗和。

如果以太網幀在傳輸的過程出錯,校驗和将發生改變。

注意到,以太網幀最後面有一個 4 位元組字段,用于儲存校驗和。

發送者負責為每個以太網幀計算校驗和,并将計算結果填寫在校驗和字段中;

接收者接到以太網幀後,重新計算校驗和并與校驗和字段進行對比 ;

如果兩個校驗和不一緻,說明該幀在傳輸時出錯了。

校驗和計算

校驗和,校驗和應該叫16進制反碼求和,就是将所有的位元組加起來,再由ffff來減得到的值。

我這來計算ip header的checksum,其他的校驗和計算方式一樣的。

FPGA工程師必備技能_Ethernet接口_千兆以太網_以太幀詳解

從封包中看到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與辨別符會有差别。

FPGA工程師必備技能_Ethernet接口_千兆以太網_以太幀詳解

對我們來說能抓到的或者能看到的封包幀,基本上是在目标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。

FPGA工程師必備技能_Ethernet接口_千兆以太網_以太幀詳解
FPGA工程師必備技能_Ethernet接口_千兆以太網_以太幀詳解

接下來我們對以太網幀進行更詳細的分析

FPGA工程師必備技能_Ethernet接口_千兆以太網_以太幀詳解

接下來我們看一個DoIP的封包。下圖為用工具抓的一個DoIP封包。

FPGA工程師必備技能_Ethernet接口_千兆以太網_以太幀詳解

上圖整個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個位元組,

繼續閱讀