計算機網絡是指將地理位置不同的具有獨立功能的多台計算機及其外部設備,通過通信線路連接起來,在網絡操作系統、網絡管理軟件及網絡通信協議的管理和協調下,實現資源共享和信息傳遞的計算機系統。計算機網絡類型的划分標准各種各樣,按網絡所覆蓋的地理范圍的不同,計算機網絡可分為局域網(LAN)、 城域網(MAN)、廣域網(WAN)、互聯網(Initernet)。局域網按傳輸介質所使用的訪問控制方法可分為:以太網(Ethernet)、光纖分布式數據接口(FDDI)、異步傳輸模式(ATM)、令牌環網(Token Ring)、交換網(Switching) 等,它們在拓朴結構、傳輸介質、傳輸速率、數據格式等多方面都有許多不同,其中應用最廣泛的當屬以太網。
以太網是為了實現局域網通信而設計的一種技術,它規定了包括物理層的連線、電子信號和介質訪問層協議的內容。以太網根據最大傳輸速率的不同可以分為標准的以太網(10Mbit/s)、快速以太網(100Mbit/s)、千兆以太網 (1000Mbit/s)和萬兆以太網(10Gbit/s)。百兆網和千兆網是目前應用最多的,顧名思義,百兆網的最大傳輸速率為 100Mbit/s,需要注意的是,我們常見的網速的單位是 MByte/s,而 1Byte 為 8bit,所以百兆網能達到的最大網速為 12.5MByte/s。同理,千兆網的最大傳輸速率為 1000Mbit/s,能達到的最大網速為 125MByte/s。
一、計算機網絡體系結構模型
國際標准化組織(ISO)在 1978 年提出了“開放系統互聯參考模型”,即著名的 OSI/RM 模型(Open System Interconnection/Reference Model)。它將計算機網絡體系結構的通信協議划分為七層,自下而上依次為:物理層(Physics Layer)、數據鏈路層(Data Link Layer)、網絡層(Network Layer)、傳輸層(Transport Layer)、會話層(Session Layer)、表示層(Presentation Layer)、應用層 (Application Layer)。下面 4 層主要提供數據傳輸和交換功能,即以節點到節點之間的通信為主;第 4 層作為上下兩部分的橋梁,是整個網絡體系結構中最關鍵的部分;上 3 層則以提供用戶與應用程序之間的信息和數據處理功能為主。
除了標准的 OSI 七層模型以外,常見的 網絡層次划分還有 TCP/IP 四層協議,它們之間的對應關系如圖所示:
不管是 OSI 七層模型還是 TCP/IP 的四層模型,它們每一層中都有自己的專屬協議,需要完成相應的工作以及與上下層級之間進行溝通。由於目前 TCP/IP 協議已經成為 Internet 中的【通用語言】,任何和互聯網有關的操作都離不開 TCP/IP 協議,沒有它我們就根本不可能上網,所以下面就以 TCP/IP 協議為主來進行講解。
- 應用層:為操作系統或網絡應用程序提供訪問網絡服務的接口,主要協議有文件傳輸協議(FTP),超文本傳輸協議(HTTP),簡單郵件傳輸協議(SMTP),遠程登錄(Telnet);
- 傳輸層:為兩台主機上的應用程序提供端到端的通信,在 TCP/IP 協議簇中,有兩個不同的傳輸協議:TCP(傳輸控制協議)和 UDP(用戶數據報協議),它們分別承載不同的應用。TCP 協議是一種面向連接的傳輸,能夠提供可靠的字節流傳輸服務,UDP 協議是一種簡單的面向數據報的傳輸層協議,與 TCP 協議不同的是 UDP 無法保證數據報文准確達到目的地。
- 網絡層:負責提供基本的數據封包傳送功能,讓每個據包都能夠到達目的主機,主要協議有 IP 協議(網際協議)、ICMP 協議(Internet 互連網控制報文協議)、ARP/RARP (地址解析/反向地址解析協議)以及 IGMP 協議(Internet 組管理協議)。
- 網絡接口層:通常包括操作系統中的設備驅動程序和計算機中對應的網絡接口卡,它們一起處理與電纜的物理接口細節,主要協議有:以太網、令牌環、幀中繼等;
從該圖中可以看出,當主機 A 向主機 B 發送數據時,用戶數據將由應用層產生;當用戶數據在經過傳輸層時,傳輸層對用戶數據進行封裝,在用戶數據的基礎上添加了一個 TCP/UDP 首部數據,此時數據包變成了 TCP/UDP 段;當它經過網絡層時,網絡層對 TCP/UDP 段進行封裝,在 TCP/UDP 段的基礎上添加了一個 IP 首部數據,此時 TCP/UDP 段變成了 IP 數據報;當 它經過網絡接口層時,網絡接口層對 IP 數據報進行封裝,在 IP 數據報的基礎上添加了以太網首部數據和以太網尾部(一般為 4byte CRC校驗值)兩個數據,此時 IP 數據報變成了以太網幀。由此可以看出,數據經過層層封裝成幀后發到傳輸介質上,到達目的主機后每層協議再剝掉相應的首部數據,最后將應用層數據交給主機 B 處理。
二、以太網幀結構
以太網類型有很多種,如下所示:
TCP協議比較難設計,這里僅說明 IP 協議的 UDP協議,順便說一下簡單的 ARP協議。如下圖所示(單擊圖片可放大),上半部分為 IP - UDP 協議,下半部分為 ARP 協議,一圖說明所有。
1、前導碼(Preamble)
為了實現底層數據的正確闡述,物理層使用7個字節同步碼(7個55),二進制表現為 0 和 1 交替,其作用是使發送方和接收方的時鍾同步。
2、幀起始界定符(SFD,Start Frame Delimiter)
使用1個字節的SFD(0xd5),二進制表現為“10101011”,用來表示一幀的開始,即后面緊跟着傳輸的就是以太網的幀頭。
3、以太網幀頭
(1)目的MAC地址
即接收端物理MAC地址,占用6個字節。MAC地址從應用上可分為單播地址、組播地址和廣播地址。單播地址:第一個字節的最低位為0,比如00-00-00-11-11-11,一般用於標志唯一的設備;組播地址:第一個字節的最低位為1,比如01-00-00-11-11-11,一般用於標志同屬一組的多個設備;廣播地址:所有48bit全為1,即FF-FF-FF-FF-FF-FF,它用於標志同一網段中的所有設備。
(2)源MAC地址
即發送端物理MAC地址,占用6個字節。
(3)長度/類型
長度/類型具有兩個意義,當這兩個字節的值小於1536(十六進制為0x0600)時,代表該以太網中數據段的長度;如果這兩個字節的值大於1536,則表示該以太網中的數據屬於哪個上層協議,例如0x0800代表IP協議(網際協議)、0x0806代表ARP協議(地址解析協議)等。
4、數據段
長度最小46個字節,最大1500個字節。
長度最小46個字節,總的以太網幀長度最小為 64 個字節,其原因是因為以太網是不可靠的,這意味着它並不知道對方有沒有收到自己發出的數據包,但如果他發出的數據包發生錯誤,需要進行重傳。以太網的錯誤主要是發生碰撞,碰撞是指兩台機器同時監聽到網絡是空閑的,同時發送數據就會發生碰撞,碰撞對於以太網來說是正常的。要保證以太網的重傳,必須保證收到碰撞信號的時候數據包沒有傳完,要實現這一要求,發送方和接收方之間的距離很關鍵,也就是說信號在發送方和接收方之間傳輸的來回時間必須控制在一定范圍之內。IEEE 定義了這個標准,一個碰撞域內最 遠的兩台機器之間的 round-trip time 要小於 512 bit time(傳輸一個比特需要的時間),這也是我們常說的一個碰撞域的直徑。512 個 bit time 也就是 64 字節的傳輸時間,如果以太網數據包 ≥ 64 個字節就能保證碰撞信號到達發送方的時候,數據包還沒有傳完。最小數據幀的設計和以太網電纜長度有關,為的是讓兩個相距最遠的站點能夠感知到雙方的數據發生了碰撞,最遠兩端數據的往返時間就是爭用期,以太網的爭用期是 51.2 us,正好發送 64byte 數據。
最大值1500稱為以太網的最大傳輸單元(MTU,Maximum Transmission Unit),之所以限制最大傳輸單元是因為在多個計算機的數據幀排隊等待傳輸時,如果某個數據幀太大的話,那么其它數據幀等待的時間就會加長,導致體驗變差。另外還要考慮網絡I/O控制器緩存區資源以及網絡最大的承載能力等因素,因此最大傳輸單元是由各種綜合因素決定的。為了避免增加額外的配置,通常以太網的有效數據字段小於1500個字節,現在電腦的配置都很高了,很多都支持巨型幀,巨型幀可以超過 1500 個字節。
不同的協議,數據段的組成結構不同,后面再詳細說明。
5、幀檢驗序列(FCS,Frame Check Sequence)
為了確保數據的正確傳輸,在數據的尾部加入了4個字節的循環冗余校驗碼(CRC校驗)來檢測數據是否傳輸錯誤。CRC數據校驗從以太網幀頭開始即不包含前導碼和幀起始界定符。通用的CRC標准有CRC-8、CRC-16、CRC-32、CRC-CCIT,其中在網絡通信系統中應用最廣泛的是CRC-32標准。
6、幀間隙(IFG,Interpacket Gap)
幀間隙的時間就是網絡設備和組件在接收一幀之后,需要短暫的時間來恢復並為接收下一幀做准備的時間,IFG的最小值是96 bit time,即在媒介中發送96位原始數據所需要的時間,在不同媒介中IFG的最小值是不一樣的。不管10M/100M/1000M的以太網,兩幀之間最少要有96bit time,IFG的最少間隔時間計算方法如下:
- 10Mbit/s最小時間為:96*100ns = 9600ns;
- 100Mbit/s最小時間為:96*10ns = 960ns;
- 1000Mbit/s最小時間為:96*1ns = 96ns;
三、ARP協議
1、ARP 作用
在網絡通訊時,源主機的應用程序知道目的主機的 IP 地址和端口號,卻不知道目的主機的硬件地址。而數據包首先是被網卡接收到再去處理上層協議的,如果接收到的數據包的硬件地址與本機不符則直接丟棄。因此在通訊前必須獲得目的主機的硬件地址.ARP 協議就起到這個作用。簡單的說就是當一個源主機要發包時,可能會發送 ARP 請求包去詢問所有主機:“IP地址為xxxxxx的目的主機,你的MAC地址是多少?”,這個請求包會廣播(全FF)到本地網段,目的主機發現這是自己的 IP 地址,於是返回 ARP 應答包,提供自己的 MAC 地址給主機。
每台主機都有一個 ARP 緩存表,,我們可以用 arp -a 命令查看該表中的內容。緩存表中的表項有時間限制,一般為 20 分鍾,如果 20 分鍾內沒有再次使用某個表項,則該表項將會失效,下次還要發 ARP 請求來獲得目的主機的硬件地址。除此之外我們還可以通過 arp -s 命令手動向 ARP 緩存表中添加表項。
2、ARP 字段
當【以太網幀頭】的【長度/類型】為 0x0806 時,表明這是 ARP 包,ARP部分字段詳細說明如下:
3、模擬 FPGA 發送 ARP 包
使用小兵以太網測試儀可以組建 ARP 包,模擬 FPGA 發送 ARP 包的過程。
(1)點擊打開新建流界面。
(2)在常用報文中選擇 arp 請求格式報文。
(3)修改以太網包和 arp 包中各字段內容如下所示。
(4)配置好之后點擊確定,將設置好的數據包導出為 16 進制格式文本文件。

(5) 得到的文本中數據內容如下所示。
(6)選中該數據包,執行開始發布。
(7)使用 wireshark 軟件抓包。
注意,上面的發包過程中沒有出現 CRC 校驗的內容,實際采用 FPGA 發包時,是需要填充 CRC 校驗值的。
4、FPGA 發送 ARP 請求包
像 ARP 包這種簡單的固定的包,CRC 校驗值可以通過軟件 CRC Calculator 計算得出:
CRC 軟件計算結果:低字節在前,高字節在后。使用該 CRC 校驗值時要調換高低順序,即 7EADB6D8 應該調換為 D8B6AD7E:
//CRC校驗值,使用CRC計算軟件計算得出。 parameter CRC=32'h7eadb6d8; wire [31:0]CRC_result; //為符合以太網包校驗格式,調整CRC校驗值順序 assign CRC_result = {CRC[7:0],CRC[15:8],CRC[23:16],CRC[31:24]};
當然,也可以通過代碼自動計算出 CRC 的值,本系列后面的講解會說清 CRC 校驗的結果。
FPGA 發送 ARP 請求包時,目的地址設置為廣播地址(全FF),源地址為板卡地址,可以選擇某 Xilinx 官板的 MAC 地址,以避免和其他實際地址沖突,而且 wireshark 可以識別出來。
5、FPGA 接收 ARP 應答包
PC 得到 ARP 請求包后,會答復 ARP 應答包,FPGA可以接收 ARP 應答包,獲得 PC 的 MAC 地址,對於 CRC 校驗值,也可以選擇不校驗。
6、補充說明
關於 ARP 協議,可以查看小梅哥《FPGA系統設計與驗證實戰指南_V1.2》,CSDN博主春哥筆記根據該教程進行了實踐,博客鏈接:https://blog.csdn.net/chengfengwenalan/article/details/83584325,此外這篇博客對 ARP 的知識點整理得非常好:https://www.cnblogs.com/zhangming-blog/articles/6004982.html 。
四、IP協議和UDP協議
當【以太網幀頭】的【長度/類型】為 0x0800 時,表明這是 IP 包,【IP 首部】的協議為 17(0x11)時,表明這是 UDP協議。
1、IP首部
IP協議是TCP/IP協議簇中的核心協議,也是TCP/IP協議的載體,IP協議規定了數據傳輸時的基本單元和格式。IP協議內容由IP首部和數據字段組成。所有的TCP、UDP及ICMP數據都以IP數據報格式傳輸,如果發送某種錯誤,IP 會丟失該數據,然后發送 ICMP 消息給信源端。另外 IP 數據報可以不按發送順序接收。前20個字節(前4行)和緊跟其后的可選字段(最后1行)是IP數據報的首部,前20個字節(前4行)是固定的,后面可選字段是可有可無的。
- 版本:4位IP版本號(Version),這個值設置為二進制的0100時表示IPv4,設置為0110時表示IPv6,目前使用比較多的IP協議版本號是4。
- 首部長度:4位首部長度(IHL,Internet Header Length),表示IP首部一共有多少個32位(4個字節)。在沒有可選字段時,IP首部長度為20個字節,因此首部長度的值為5。
- 服務類型:8位服務類型(TOS,Type of service),該字段被划分成兩個子字段:3位優先級字段(現在已經基本忽略掉了)和4位TOS字段,最后一位固定為0。服務類型為0時表示一般服務。
- 總長度:16位IP數據報總長度(Total Length),包括IP首部和IP數據部分,以字節為單位。我們利用IP首部長度和IP數據報總長度,就可以知道IP數據報中數據內容的起始位置和長度。由於該字段長16bit,所以IP數據報最長可達65535字節。盡管理論上可以傳輸長達65535字節的IP數據報,但實際上還要考慮網絡的最大承載能力等因素。
- 標識字段:16位標識(Identification)字段,用來標識主機發送的每一份數據報。通常每發送一份報文它的值就會加1。
- 標志字段:3位標志(Flags)字段,第1位為保留位;第2位表示禁止分片(1表示不分片,0表示允許分片);第3位標識更多分片(除了數據報的最后一個分片外,其它分片都為1)。片偏移:13位片偏移(Fragment Offset),在接收方進行數據報重組時用來標識分片的順序。可以全部設置為0。
- 片偏移:13位片偏移字段,較長的分組在分片后,某片在原分組中的相對位置,,就是說相對用戶數據字段的起點,該片從何處開始。片偏移以 8 個字節為偏移單位,也就是說每個分片的長度一定是 8 字節的整數倍。
- 生存時間:8位生存時間字段TTL(Time To Live),設置了數據報可以經過的最多路由器數,表示數據報在網絡上生存多久。TTL的初始值由源主機設置,一般為32、64或者128,一旦經過一個路由器,它的值就減 1,減到 0 時,數據報就丟棄,並發送 ICMP 消息通知源主機。TTL防止丟失的數據包在無休止的傳播,
- 協議:8位協議(Protocol)類型,表示此數據報所攜帶上層數據使用的協議類型,ICMP為01,TCP為06,UDP為17,當然還有很多別的協議類型。
- 首部校驗和:16位首部校驗和(Header Checksum),該字段只校驗數據報的首部,不包含數據部分;校驗IP數據報頭部是否被破壞、篡改和丟失等。
- 源IP地址:32位源IP地址(Source Address),即發送端的IP地址,如192.168.1.123。
- 目的IP地址:32位目的IP地址(Destination Address),即接收端的IP地址,如192.168.1.102。
- 可選字段:是數據報中的一個可變長度的可選信息,選項字段以32bit為界,不足時插入值為0的填充字節,保證IP首部始終是32bit的整數倍,沒有的話長度可以為 0 。
IP首部校驗和的計算方法:
1、將16位檢驗和字段置為0,然后將IP首部按照16位分成多個單元; 2、對各個單元采用反碼加法運算(即高位溢出位會加到低位,通常的補碼運算是直接丟掉溢出的高位); 3、此時仍然可能出現進位的情況,將得到的和再次分成高16位和低16位進行累加; 4、最后將得到的和的反碼填入校驗和字段。
2、UDP首部
數據是可以直接封裝在IP協議里而不使用TCP、UDP或者其它上層協議的。然而在網絡傳輸中同一IP服務器需要提供各種不同的服務,各種不同的服務類型是使用端口號來區分的,例如用於瀏覽網頁服務的80端口,用於FTP(文件傳輸協議)服務的21端口等。TCP和UDP都使用兩個字節的端口號,理論上可以表示的范圍為0~65535,足夠滿足各種不同的服務類型。
TCP協議與UDP協議作為傳輸層最常用的兩種傳輸協議,這兩種協議都是使用IP作為網絡層協議進行傳輸。下面是TCP協議與UDP協議的區別:
①TCP協議面向連接,是流傳輸協議,通過連接發送數據,而UDP協議傳輸不需要連接,是數據報協議;
②TCP為可靠傳輸協議,而UDP為不可靠傳輸協議。即TCP協議可以保證數據的完整和有序,而UDP不能保證;
③UDP由於不需要連接,故傳輸速度比TCP快,且占用資源比TCP少;
④TCP協議常用在對數據文件完整性較高的一些場景中,如文件傳輸等。
UDP協議常用於對通訊速度有較高要求或者傳輸數據較少時,如視頻直播和QQ等。
使用FPGA實現TCP協議是完全沒有問題的,但是,FPGA發展到現在,卻鮮有成功商用的RTL級的TCP協議設計,大部分以太網傳輸都是基於比較簡單的UDP協議。TCP協議設計之初是根據軟件靈活性設計的,如果使用硬件邏輯實現,工程量會十分巨大,而且功能和性能無法得到保證,因此,TCP協議設計並不適合使用硬件邏輯實現。UDP協議是一種不可靠傳輸,發送方只負責數據發送出去,而不管接收方是否正確的接收。在很多場合,是可以接受這種潛在的不可靠性的,例如視頻實時傳輸顯示等。
UDP首部共8個字節,同IP首部一樣,也是一行以32位(4個字節)為單位。
- 源端口號:16位發送端端口號,用於區分不同服務的端口,端口號的范圍從0到65535。
- 目的端口號:16位接收端端口號。
- UDP長度:16位UDP長度,包含UDP首部長度+數據長度,單位是字節(byte)。
- UDP校驗和:16位UDP校驗和。UDP計算校驗和的方法和計算IP數據報首部校驗和的方法相似,但不同的是IP數據報的校驗和只檢驗IP數據報的首部,而UDP校驗和包含三個部分:UDP偽首部,UDP首部和UDP的數據部分。偽首部的數據是從IP數據報頭和UDP數據報頭獲取的,包括源IP地址,目的IP地址,協議類型和UDP長度,其目的是讓UDP兩次檢查數據是否已經正確到達目的地,只是單純為了做校驗用的,UDP校驗和不是必須的,接收時可以不進行UDP校驗和,發送時可以不填充 UDP校驗和,目的主機仍然可以接收到該以太網幀,但是出錯了就不能了,也就是說要么 UDP 校驗和正確,要么 UDP 校驗和為 0,否則都不行。
3、ping、ICMP、IGMP
https://www.cnblogs.com/AhuntSun-blog/p/12230712.html
https://www.cnblogs.com/AhuntSun-blog/p/12331863.html
五、接口說明
1、以太網和 RJ45 接口
常見的以太網接口類型有RJ45接口(電腦網口)、RJ11接口(電話線)、SC光纖接口等。其中RJ45接口是我們常見的網絡設備接口,其采用差分傳輸方式,具有傳輸速率快、抗干擾、傳輸距離遠等優點。
RJ45接口定義以及各引腳功能說明如下圖所示,在以太網中只使用了1、2、3、6這四根線,其中1、2這組負責傳輸數據(TX+、TX-),而3、6這組負責接收數據(RX+、RX-),另外四根線是備用的。
總的來說,這一部分知道即可,不需要自己設計代碼。
2、連接關系
我們的 FPGA 就看成是 MAC側,接收或發送數據到 PHY側,PHY側再通過 RJ45 水晶頭接口和其他設備進行連接。PHY 芯片有很多種,常見的有 RTL8201、RTL8211、VSC8601等,並不是一種 PHY 芯片就對應一種 MII等協議,例如 RTL8201支持百兆網 MII 協議,RTL8211除了支持百兆網 MII 協議,還支持千兆網 GMII 協議。PHY芯片是可以配置成不同模式的。
3、MII、RMII、GMII、RGMII
- MII(Medium Independent Interface):MII支持10Mbps和100Mbps的操作,數據位寬為4位,在100Mbps傳輸速率下,時鍾頻率為25Mhz。
- RMII(Reduced MII):RMII是MII的簡化版,數據位寬為2位,在100Mbps傳輸速率下,時鍾頻率為50Mhz。
- GMII(Gigabit MII):GMII接口向下兼容MII接口,支持10Mbps、100Mbps和1000Mbps的操作,數據位寬為8位,在1000Mbps傳輸速率下,時鍾頻率為125Mhz。
- RGMII(Reduced GMII):RGMII是GMII的簡化版,數據位寬為4位,在1000Mbps傳輸速率下,時鍾頻率為125Mhz,但是在時鍾的上下沿同時采樣數據
七、常用CMD命令
netsh i i show in :查詢本地連接的網卡 ID 號,如下顯示為12。
arp -a :查詢自己PC的所有 IP 地址,12對應16進制的c。
ipconfig -all :查找自己PC的所有 MAC 地址。
netsh -c i i add neighbors 12 192.168.1.123 00-11-22-33-44-55:將開發板 IP 綁定開發板 MAC,12為本地連接的網卡 ID 號,192.168.1.123 為想設置的開發板 IP,00-11-22-33-44-55為想設置的開發板MAC。
arp -s 192.168.0.2 00-25-64-76-BD-40:和上面一樣的功能,將開發板 IP 綁定開發板 MAC,192.168.0.2為想設置的開發板 IP,00-25-64-76-BD-40為想設置的開發板MAC。
OK,網絡基礎知識就整理到這,后續會詳細整理 RGMII 接口下的千兆網收發系統。
計算機網絡是一個很大的課題,如果對有些概念不理解,可以去B站看一下韓立剛教學的《計算機網絡原理》,同時可以參閱博客:https://www.cnblogs.com/AhuntSun-blog/p/12390057.html,該博客是對這門課程的學習筆記,基本上課程講過的內容都整理上了,非常值得一看!
參考資料:
[1]小梅哥FPGA教程
[2]正點原子FPGA教程
[3]鋯石科技FPGA教程