關注+星標公眾號,不錯過精彩內容

來源?| 網絡
我們生活已經離不開網絡,而網絡能順利通信,離不開其中的PHY、MAC。
本文主要介紹以太網的MAC(Media Access Control,即媒體訪問控制子層協議)和PHY(物理層)之間的MII(Media Independent Interface ,媒體獨立接口),以及MII的各種衍生版本——GMII、SGMII、RMII、RGMII等。
從硬件的角度看,以太網接口電路主要由MAC(Media Access Control)控制器和物理層接口PHY(Physical Layer,PHY)兩大部分構成。如下圖所示:

DMA控制器通常屬于CPU的一部分,用虛線放在這里是為了表示DMA控制器可能會參與到網口數據傳輸中。
但是,在實際的設計中,以上三部分并不一定獨立分開的。由于,PHY整合了大量模擬硬件,而MAC是典型的全數字器件。考慮到芯片面積及模擬/數字混合架構的原因,通常,將MAC集成進微控制器而將PHY留在片外。更靈活、密度更高的芯片技術已經可以實現MAC和PHY的單芯片整合。可分為下列幾種類型:
CPU集成MAC與PHY。目前來說并不多見

CPU集成MAC,PHY采用獨立芯片。比較常見

CPU不集成MAC與PHY,MAC與PHY采用集成芯片。比較常見

MAC及PHY工作在OSI七層模型的數據鏈路層和物理層。具體如下:

MAC(Media Access Control)即媒體訪問控制子層協議。
該部分有兩個概念:MAC可以是一個硬件控制器 及 MAC通信以協議。該協議位于OSI七層協議中數據鏈路層的下半部分,主要負責控制與連接物理層的物理介質。MAC硬件大約就是下面的樣子了:

在發送數據的時候,MAC協議可以事先判斷是否可以發送數據,如果可以發送將給數據加上一些控制信息,最終將數據以及控制信息以規定的格式發送到物理層。
在接收數據的時候,MAC協議首先判斷輸入的信息并是否發生傳輸錯誤,如果沒有錯誤,則去掉控制信息發送至LLC(邏輯鏈路控制)層。該層協議是以太網MAC由IEEE-802. 3以太網標準定義。
以太網數據鏈路層其實包含MAC(介質訪問控制)子層和LLC(邏輯鏈路控制)子層。一塊以太網卡MAC芯片的作用不但要實現MAC子層和LLC子層的功能,還要提供符合規范的PCI界面以實現和主機的數據交換。
MAC從PCI總線收到IP數據包(或者其他網絡層協議的數據包)后,將之拆分并重新打包成最大1518Byte、最小64Byte的幀。
這個幀里面包括了目標MAC地址、自己的源MAC地址和數據包里面的協議類型(比如IP數據包的類型用80表示,最后還有一個DWORD(4Byte)的CRC碼。
可是目標的MAC地址是哪里來的呢?
這牽扯到一個ARP協議(介乎于網絡層和數據鏈路層的一個協議)。第一次傳送某個目的IP地址的數據的時候,先會發出一個ARP包,其MAC的目標地址是廣播地址,里面說到:“誰是xxx.xxx.xxx.xxx這個IP地址的主人?”
因為是廣播包,所有這個局域網的主機都收到了這個ARP請求。收到請求的主機將這個IP地址和自己的相比較,如果不相同就不予理會,如果相同就發出ARP響應包。
這個IP地址的主機收到這個ARP請求包后回復的ARP響應里說到:“我是這個IP地址的主人”。這個包里面就包括了他的MAC地址。以后的給這個IP地址的幀的目標MAC地址就被確定了。(其它的協議如IPX/SPX也有相應的協議完成這些操作)。
IP地址和MAC地址之間的關聯關系保存在主機系統里面,叫做ARP表。由驅動程序和操作系統完成。
在Microsoft的系統里面可以用arp-a 的命令查看ARP表。收到數據幀的時候也是一樣,做完CRC校驗以后,如果沒有CRC效驗錯誤,就把幀頭去掉,把數據包拿出來通過標準的接口傳遞給驅動和上層的協議棧。最終正確的達到我們的應用程序。
還有一些控制幀,例如流控幀也需要MAC直接識別并執行相應的行為。
以太網MAC芯片的一端接計算機PCI總線,另外一端就接到PHY芯片上,它們之間是通過MII接口鏈接的。
一個MAC的結構圖如下圖所示:

PHY((Physical Layer,PHY))是IEEE802.3中定義的一個標準模塊,STA(station management entity,管理實體,一般為MAC或CPU)通過SMI(Serial Manage Interface)對PHY的行為、狀態進行管理和控制,而具體管理和控制動作是通過讀寫PHY內部的寄存器實現的。一個PHY的基本結構如下圖:

PHY是物理接口收發器,它實現OSI模型的物理層。
IEEE-802.3標準定義了以太網PHY。包括MII/GMII(介質獨立接口)子層、PCS(物理編碼子層)、PMA(物理介質附加)子層、PMD(物理介質相關)子層、MDI子層。它符合IEEE-802.3k中用于10BaseT(第14條)和100BaseTX(第24條和第25條)的規范。
注:PHY寄存器在IEEE802.3標準的 22.2.4 Management functions 節有介紹,但不涉及所有的寄存器,個別寄存器需要到其它章節中看,當然,文檔里面也提到該在哪里找到哪個寄存器。
MII(Media Independent Interface)即媒體獨立接口,MII 接口是 MAC 與 PHY 連接的標準接口。它是 IEEE-802.3 定義的以太網行業標準。MII 接口提供了 MAC 與 PHY 之間、PHY 與 STA(Station Management)之間的互聯技術,該接口支持 10Mb/s 與 100Mb/s 的數據傳輸速率,數據傳輸的位寬為 4 位。MII 接口如下圖所示:

“媒體獨立” 表明在不對 MAC 硬件重新設計或替換的情況下,任何類型的 PHY 設備都可以正常工作。802.3 協議最多支持 32 個 PHY,但有一定的限制:要符合協議要求的 connector 特性。此外,提到 MII,就有可能涉及到 RS,PLS,STA 等名詞術語,下面講一下他們之間對應的關系。
所謂 RS 即 Reconciliation sublayer,它的主要功能主要是提供一種 MII 和 MAC/PLS 之間的信號映射機制。它們(RS 與 MII)之間的關系如下圖:

MII的Management Interface是與STA(Station Management)相連的。
注:關于本節,具體可參考IEEE以太網標準802.3的22.3 Signal timing characteristics節,其中包含時鐘信號等更詳細內容。
MII接口主要包括四個部分。一是從MAC層到PHY層的發送數據接口,二是從PHY層到MAC層的接收數據接口,三是從PHY層到MAC層的狀態指示信號,四是MAC層和PHY層之間傳送控制和狀態信息的MDIO接口。

MII 包括一個數據接口,以及一個 MAC 和 PHY 之間的管理接口:
PHY 里面的部分寄存器是 IEEE 定義的,這樣PHY把自己的目前的狀態反映到寄存器里面。
MAC 通過 SMI 總線不斷的讀取PHY 的狀態寄存器以得知目前 PHY 的狀態。例如連接速度、雙工的能力等。
當然也可以通過 SMI 設置 PHY的寄存器達到控制的目的。例如流控的打開關閉、自協商模式還是強制模式等。
不論是物理連接的MII總線和 SMI 總線,還是 PHY 的狀態寄存器和控制寄存器都是由IEEE的規范的。因此不同公司的 MAC 和 PHY 一樣可以協調工作。當然為了配合不同公司的 PHY 的自己特有的一些功能,驅動需要做相應的修改。
MII 支持 10Mbps 和 100Mbps 的操作,一個接口由 14 根線組成,它的支持還是比較靈活的。
但是有一個缺點是因為它一個端口用的信號線太多,如果一個 8 端口的交換機要用到 112 根線,16 端口就要用到 224 根線,到 32 端口的話就要用到 448 根線。
一般按照這個接口做交換機是不太現實的。所以現代的交換機的制作都會用到其它的一些從 MII 簡化出來的標準,比如 RMII、SMII、GMII等。
簡化媒體獨立接口是標準的以太網接口之一,比 MII 有更少的 I/O 傳輸。RMII 口是用兩根線來傳輸數據的,MII 口是用 4 根線來傳輸數據的,GMII 是用 8 根線來傳輸數據的。MII/RMII 只是一種接口,對于10Mbps 線速,MII 的時鐘速率是 2.5MHz 就可以了,RMII 則需要 5MHz;對于 100Mbps 線速,MII 需要的時鐘速率是 25MHz,RMII 則是 50MHz。
MII/RMII 用于傳輸以太網包,在 MII/RMII 接口是 4/2bit 的,在以太網的PHY里需要做串并轉換,編解碼等才能在雙絞線和光纖上進行傳輸,其幀格式遵循IEEE 802.3(10M)/IEEE 802.3u(100M)/IEEE 802.1q(VLAN)。
以太網幀的格式為:前導符 + 開始位 + 目的 mac 地址 + 源 mac 地址 + 類型/長度 + 數據 + padding(optional) + 32bitCRC。如果有 vlan,則要在類型/長度后面加上 2 個字節的 vlan tag,其中 12bit 來表示vlan id,另外,4bit 表示數據的優先級!
GMII是千兆網的MII接口,這個也有相應的RGMII接口,表示簡化了的GMII接口。GMII 采用 8 位接口數據,工作時鐘125MHz,因此傳輸速率可達 1000Mbps。同時兼容 MII 所規定的10/100 Mbps工作方式。GMII 接口數據結構符合IEEE以太網標準,該接口定義見 IEEE 802.3-2000。
| 信號名稱 | 描述 | 方向 |
|---|---|---|
| GTX_CLK | 1000M發送時鐘 | MAC → PHY |
| TX_CLK | 100/10M發送時鐘 | MAC → PHY |
| TX_ER | 發送數據錯誤 | MAC → PHY |
| TX_EN | 發送使能 | MAC → PHY |
| TX_[7:0] | 發送數據8bit | MAC → PHY |
| RX_CLK | 接收時鐘 | PHY → MAC |
| RX_DV | 接收數據有效 | PHY → MAC |
| RX_ER | 接收數據錯誤 | PHY → MAC |
| RX_[7:0] | 接收數據8bit | PHY → MAC |
| CRS | 載波監測 | PHY → MAC |
| COL | 沖突碰撞監測 | PHY → MAC |
| MDIO | 管理數據 | 雙向 |
| MDC | 管理數據時鐘 | MAC → PHY |
RGMII(Reduced Gigabit Media Independant Interface),精簡GMII接口。相對于GMII相比,RGMII具有如下特征:
信號定義如下:
| 信號名稱 | 描述 | 方向 |
|---|---|---|
| TXC | 發送時鐘 | MAC→PHY |
| TX_CTL | 發送數據控制 | MAC → PHY |
| TXD[3:0] | 發送數據4bit | MAC → PHY |
| RXC | 接收時鐘 | PHY → MAC |
| RX_CTL | 接收數據控制 | PHY → MAC |
| RXD[3:0] | 接收數據4bit | PHY → MAC |
| MDIO | 管理數據 | 雙向 |
| MDC | 管理數據時鐘 | MAC → PHY |
雖然RGMII信號線減半,但TXC/RXC時鐘仍為125Mhz,為了達到1000Mbit的傳輸速率,TXD/RXD信號線在時鐘上升沿發送接收GMII接口中的TXD[3:0]/RXD[3:0],在時鐘下降沿發送接收TXD[7:4]/RXD[7:4],并且信號TX_CTL反應了TX_EN和TX_ER狀態,即在TXC上升沿發送TX_EN,下降沿發送TX_ER,同樣的道理試用于RX_CTL,下圖為發送接收的時序:


SMI:串行管理接口(Serial Management Interface),通常直接被稱為MDIO接口(Management Data Input/Output Interface)。MDIO最早在IEEE 802.3的第22卷定義,后來在第45卷又定義了增強版本的MDIO,其主要被應用于以太網的MAC和PHY層之間,用于MAC層器件通過讀寫寄存器來實現對PHY層器件的操作與管理。
MDIO主機(即產生MDC時鐘的設備)通常被稱為STA(Station Management Entity),而MDIO從機通常被稱為MMD(MDIO Management Device)。通常STA都是MAC層器件的一部分,而MMD則是PHY層器件的一部分。
MDIO接口包括兩條線,MDIO和MDC,其中MDIO是雙向數據線,而MDC是由STA驅動的時鐘線。MDC時鐘的最高速率一般為2.5MHz,MDC也可以是非固定頻率,甚至可以是非周期的。MDIO接口只是會在MDC時鐘的上升沿進行采樣,而并不在意MDC時鐘的頻率(類似于I2C接口)。如下圖所示。

MDIO接口有兩個版本,通常被稱為卷22版本和卷45版本。卷22版本的MDIO接口最多支持連接32個MMD(PHY層設備),每個設備最多支持32個寄存器。卷45版本的MDIO接口最多支持連接32個MMD,32個設備類型,每個設備最多支持64K個寄存器。卷22版本的MDIO接口的數據幀格式如下:

具體每個bit描述如下:


卷45版本的MDIO接口的數據幀格式如下:

具體每個bit的描述如下:


如果是STA(MAC層設備)驅動MDIO,則MDIO相對于MDC上升沿,至少要有10ns的建立時間(Setup Time)和10ns的保持時間(Hold Time)。如下圖所示:

如果MDIO是由MMD(PHY層設備)驅動的,則MDIO相對于MDC的Tco(Clock to Output Delay)的范圍是0ns~300ns。如下圖所示:

實際上,MDC的頻率也并非一定是小于或等于2.5MHz,比如Marvell的88E1512最大支持12MHz的MDC:

IEEE 802.3建議同時對MDIO進行下拉(下拉電阻建議為2k歐姆+5%),和上拉(上拉電阻建議為1.5k歐姆+5%),使得在TA時,MDIO處于中間態。但是并非所有的PHY器件都有這樣的要求,比如Marvell的88E1512只要求對MDIO進行上拉即可,上拉電阻范圍為1.5k~10kΩ。
網卡工作在osi的最后兩層,物理層和數據鏈路層,物理層定義了數據傳送與接收所需要的電與光信號、線路狀態、時鐘基準、數據編碼和電路等,并向數據鏈路層設備提供標準接口.物理層的芯片稱之為PHY.
數據鏈路層則提供尋址機構、數據幀的構建、數據差錯檢查、傳送控制、向網絡層提供標準的數據接口等功能.以太網卡中數據鏈路層的芯片稱之為MAC控制器.
很多網卡的這兩個部分是做到一起的.他們之間的關系是pci總線接mac總線,mac接phy,phy接網線(當然也不是直接接上的,還有一個變壓裝置).
PHY和MAC是網卡的主要組成部分,網卡一般用RJ-45插口,10M網卡的RJ-45插口也只用了1,2,3,6四根針,而100M或1000M網卡的則是八根針都是全的.
除此以外,還需要其它元件,因為雖然PHY提供絕大多數模擬支持,但在一個典型實現中,仍需外接6,7只分立元件及一個局域網絕緣模塊.絕緣模塊一般采用一個1:1的變壓器.這些部件的主要功能是為了保護PHY免遭由于電氣失誤而引起的損壞.
另外,一顆CMOS制程的芯片工作的時候產生的信號電平總是大于0V的(這取決于芯片的制程和設計需求),但是這樣的信號送到100米甚至更長的地方會有很大的直流分量的損失.而且如果外部網線直接和芯片相連的話,電磁感應(打雷)和靜電,很容易造成芯片的損壞.再就是設備接地方法不同,電網環境不同會導致雙方的0V電平不一致,這樣信號從A傳到B,由于A設備的0V電平和B點的0V電平不一樣,這樣會導致很大的電流從電勢高的設備流向電勢低的設備.
為了解決以上問題Transformer(隔離變壓器)這個器件就應運而生.它把PHY送出來的差分信號用差模耦合的線圈耦合濾波以增強信號,并且通過電磁場的轉換耦合到連接網線的另外一端.這樣不但使網線和PHY之間沒有物理上的連接而換傳遞了信號,隔斷了信號中的直流分量,還可以在不同0V電平的設備中傳送數據.
隔離變壓器本身就是設計為耐2KV~3KV的電壓的.也起到了防雷感應(我個人認為這里用防雷擊不合適)保護的作用.有些朋友的網絡設備在雷雨天氣時容易被燒壞,大都是PCB設計不合理造成的,而且大都燒毀了設備的接口,很少有芯片被燒毀的,就是隔離變壓器起到了保護作用.
隔離變壓器本身是個被動元件,只是把PHY的信號耦合了到網線上,并沒有起到功率放大的作用.那么一張網卡信號的傳輸的最長距離是誰決定的呢?
一張網卡的傳輸最大距離和與對端設備連接的兼容性主要是PHY決定的.但是可以將信號送的超過100米的PHY其輸出的功率也比較大,更容易產生EMI的問題.這時候就需要合適的Transformer與之配合.作PHY的老大公司Marvell的PHY,常常可以傳送180~200米的距離,遠遠超過IEEE的100米的標準.
RJ-45的接頭實現了網卡和網線的連接.它里面有8個銅片可以和網線中的4對雙絞(8根)線對應連接.其中100M的網絡中1,2是傳送數據的,3,6是接收數據的.1,2之間是一對差分信號,也就是說它們的波形一樣,但是相位相差180度,同一時刻的電壓幅度互為正負.這樣的信號可以傳遞的更遠,抗干擾能力強.同樣的,3,6也一樣是差分信號.
網線中的8根線,每兩根扭在一起成為一對.我們制作網線的時候,一定要注意要讓1,2在其中的一對,3,6在一對.否則長距離情況下使用這根網線的時候會導致無法連接或連接很不穩定.
現在新的PHY支持AUTO MDI-X功能(也需要Transformer支持).它可以實現RJ-45接口的1,2上的傳送信號線和3,6上的接收信號線的功能自動互相交換.有的PHY甚至支持一對線中的正信號和負信號的功能自動交換.這樣我們就不必為了到底連接某個設備需要使用直通網線還是交叉網線而費心了.這項技術已經被廣泛的應用在交換機和SOHO路由器上.
在1000Basd-T網絡中,其中最普遍的一種傳輸方式是使用網線中所有的4對雙絞線,其中增加了4,5和7,8來共同傳送接收數據.由于1000Based-T網絡的規范包含了AUTOMDI-X功能,因此不能嚴格確定它們的傳出或接收的關系,要看雙方的具體的協商結果.
一片網卡主要功能的實現就基本上是上面這些器件了.
其他的,還有一顆EEPROM芯片,通常是一顆93C46.里面記錄了網卡芯片的供應商ID,子系統供應商ID,網卡的MAC地址,網卡的一些配置,如SMI總線上PHY的地址,BOOTROM的容量,是否啟用BOOTROM引導系統等東西.
很多網卡上還有BOOTROM這個東西.它是用于無盤工作站引導操作系統的.既然無盤,一些引導用必需用到的程序和協議棧就放到里面了,例如RPL,PXE等.實際上它就是一個標準的PCI ROM.所以才會有一些硬盤寫保護卡可以通過燒寫網卡的BootRom來實現.其實PCI設備的ROM是可以放到主板BIOS里面的.啟動電腦的時候一樣可以檢測到這個ROM并且正確識別它是什么設備的.AGP在配置上和PCI很多地方一樣,所以很多顯卡的BIOS也可以放到主板BIOS里面.這就是為什么板載的網卡我們從來沒有看到過BOOTROM的原因.
最后就是電源部分了.大多數網卡現在都使用3.3V或更低的電壓.有的是雙電壓的.因此需要電源轉換電路.
而且網卡為了實現Wake on line功能,必須保證全部的PHY和MAC的極少一部分始終處于有電的狀態,這需要把主板上的5V Standby電壓轉換為PHY工作電壓的電路.在主機開機后,PHY的工作電壓應該被從5V轉出來的電壓替代以節省5V Standby的消耗.(許多劣質網卡沒有這么做).
有Wake on line功能的網卡一般還有一個WOL的接口.那是因為PCI2.1以前沒有PCI設備喚醒主機的功能,所以需要著一根線通過主板上的WOL的接口連到南橋里面以實現WOL的功能.新的主板合網卡一般支持PCI2.2/2.3,擴展了PME#信號功能,不需要那個接口而通過PCI總線就可以實現喚醒功能.
我們現在來看兩個圖

MAC和PHY分開的以太網卡

MAC和PHY集成在一顆芯片的以太網卡
上圖中各部件為:
①RJ-45接口
②Transformer(隔離變壓器)
③PHY芯片
④MAC芯片
⑤EEPROM
⑥BOOTROM插槽
⑦WOL接頭
⑧晶振
⑨電壓轉換芯片
⑩LED指示燈
網卡的功能主要有兩個:一是將電腦的數據封裝為幀,并通過網線(對無線網絡來說就是電磁波)將數據發送到網絡上去;二是接收網絡上其它設備傳過來的幀,并將幀重新組合成數據,發送到所在的電腦中.網卡能接收所有在網絡上傳輸的信號,但正常情況下只接受發送到該電腦的幀和廣播幀,將其余的幀丟棄.然后,傳送到系統CPU做進一步處理.當電腦發送數據時,網卡等待合適的時間將分組插入到數據流中.接收系統通知電腦消息是否完整地到達,如果出現問題,將要求對方重新發送.
通過IEEE定義的標準的MII/GigaMII(Media Independed Interfade,介質獨立界面)界面連接MAC和PHY。這個界面是IEEE定義的。MII界面傳遞了網絡的所有數據和數據的控制。
而MAC對PHY的工作狀態的確定和對PHY的控制則是使用SMI(Serial Management Interface)界面通過讀寫PHY的寄存器來完成的。PHY里面的部分寄存器也是IEEE定義的,這樣PHY把自己的目前的狀態反映到寄存器里面,MAC通過SMI總線不斷的讀取PHY的狀態寄存器以得知目前PHY的狀態,例如連接速度,雙工的能力等。當然也可以通過SMI設置PHY的寄存器達到控制的目的,例如流控的打開關閉,自協商模式還是強制模式等。
我們看到了,不論是物理連接的MII界面和SMI總線還是PHY的狀態寄存器和控制寄存器都是有IEEE的規范的,因此不同公司的MAC和PHY一樣可以協調工作。當然為了配合不同公司的PHY的自己特有的一些功能,驅動需要做相應的修改。
一片網卡主要功能的實現就基本上是上面這些器件了。
其他的,還有一顆EEPROM芯片,通常是一顆93C46。里面記錄了網卡芯片的供應商ID、子系統供應商ID、網卡的MAC地址、網卡的一些配置,如SMI總線上PHY的地址,BOOTROM的容量,是否啟用BOOTROM引導系統等東西。
很多網卡上還有BOOTROM這個東西。它是用于無盤工作站引導操作系統的。
既然無盤,一些引導用必需用到的程序和協議棧就放到里面了,例如RPL、PXE等。實際上它就是一個標準的PCI ROM。所以才會有一些硬盤寫保護卡可以通過燒寫網卡的BootRom來實現。
其實PCI設備的ROM是可以放到主板BIOS里面的。啟動電腦的時候一樣可以檢測到這個ROM并且正確識別它是什么設備的。AGP在配置上和PCI很多地方一樣,所以很多顯卡的BIOS也可以放到主板BIOS里面。這就是為什么板載的網卡我們從來沒有看到過BOOTROM的原因。
https://blog.csdn.net/ZCShouCSDN/article/details/80090802
https://blog.csdn.net/ZCShouCSDN/article/details/80090802
http://blog.chinaaet.com/justlxy/p/5100064094


