首頁 > theory > network > > 正文

從網卡發送數據再談TCP/IP協議—網絡傳輸速度計算-網卡構造

發布人:[email protected]    點擊:

以網卡的構造解剖來審視TCP IP傳輸,但是內容卻牽扯出異常多概念解析,現在還是一鍋亂燉,先湊合著復習,待梳理

在《在深談TCP/IP三步握手&四步揮手原理及衍生問題—長文解剖IP》里面提到

  • 單個TCP包每次打包1448字節的數據進行發送(以太網Ethernet最大的數據幀是1518字節,以太網幀的幀頭14字節和幀尾CRC校驗4字節 

  • seq編碼,在RFC793中,建議ISN和一個假的時鐘綁在一起,這個時鐘會在每4微秒對ISN做加一操作,直到超過2^32

據此推算,貌似單一線路,網絡傳輸速度也就1.5*(1/4*10^6) = 375M/bs

對此的論據是:segments packets frame 是一對一的關系,層層套,一個個依次發送,如圖所示

WechatIMG11.png

20160529140813320.png

如此,豈不是對于千兆網卡,千G、千T,以及5G網絡 是 瞎子點燈?

注:

  • 在鏈路層,由以太網的物理特性決定了數據幀的長度為(46+18)-(1500+18),其中的18是數據幀的頭和尾,也就是說數據幀的內容最大為1500(不包括幀頭和幀尾),即MTU(Maximum Transmission Unit)為1500;  

  • 在網絡層,因為IP包的首部要占用20字節,所以這的MTU為1500-20=1480; 

  • 在傳輸層,對于UDP包的首部要占用8字節,所以這的MTU為1480-8=1472;   

所以,在應用層,你的Data最大長度為1472。當我們的UDP包中的數據多于MTU(1472)時,發送方的IP層需要分片fragmentation進行傳輸,而在接收方IP層則需要進行數據報重組,由于UDP是不可靠的傳輸協議,如果分片丟失導致重組失敗,將導致UDP數據包被丟棄。 

千兆網卡理論最大傳輸速度是(1024Mbit/s=128MByte/s),注意b與B差了8倍。  

這個迷惑一直困擾著我。百思不得騎姐

然后開始

從網卡發送接收數據入手,對TCP/IP再開墾一番

網卡如何發送數據包:

IP報文可以看作一個包。

Linux網卡驅動程序,將IP包添加14字節的MAC包頭,構成MAC包。

MAC包中含有發送端和接收端的MAC地址信息。既然是驅動程序創建的MAC包頭信息,當然可以隨便輸入地址信息的,主機偽裝就是這么實現的。

驅動程序將MAC包拷貝到網卡芯片內部的緩存區,就算完事了。有網卡芯片接手處理。網卡芯片對MAC包,再次封裝成物理幀,添加頭部同步信息和CRC校驗。然后丟到網線上,就完成一個IP報文的發送。所有掛接到本網線的網卡都可以看到該物理幀。

網卡接收數據包

正常情況:

  1. 網線上的物理幀首先被網卡芯片獲取,網卡芯片會檢查物理幀的CRC,保證完整性。

  2. 其次,網卡芯片將物理幀頭去掉,得到MAC包。

  3. 網卡芯片檢查MAC包內的目的MAC地址信息,和本網卡的MAC地址是否一致?不一致,拋棄

  4. 網卡芯片將MAC幀拷貝到網卡內部的緩沖區,觸發中斷。

  5. 驅動程序通過中斷,將MAC包拷貝到系統中,構建sk_buff。告訴上層。

  6. 上層去掉MAC包頭,得到需要的IP包。

 過程中,網卡芯片對物理幀進行了MAC匹配過濾。這樣做可以減小系統負荷。

試想一下,若網卡芯片對所有的MAC幀不加判斷的直接提供給驅動,讓CPU判決會是什么樣子呢?

當總線上數據繁忙,CPU將浪費大部分時間去判斷該MAC包是否是自己需要的,效率低下。


不正常模式(混聽):

  1. 網線上的物理幀首先被網卡芯片獲取,網卡芯片會檢查物理幀的CRC,保證完整性。

  2. 其次,網卡芯片將物理幀頭去掉,得到MAC包。

  3. 網卡芯片發現自己當前被配置為混聽模式,就不對MAC包過濾

  4. 網卡芯片將MAC幀拷貝到網卡內部的緩沖區,觸發中斷。

  5. 驅動程序通過中斷,將MAC包拷貝到系統中,構建sk_buff。告訴上層。

  6. 上層去掉MAC包頭,得到需要的IP包。

  7. 顯然,這里的IP包并一定是發給自己的。

 

驅動的問題

網卡到底能不能接收其他MAC包,完全取決于網卡芯片中RCR(receive control register)配置。

驅動程序是決定網卡能否工作與混聽模式的橋梁

混聽模式會加重CPU的負荷,而且也是不符合標準應用的!

 

所有的車輛都要從加油站穿過,(有些都不加油),加油站工作人員的任務量就可想而知。

當然也有例外,有些程序不通過驅動,也可以直接訪問網卡芯片RCR達到設置混聽模式。

所謂  條條大路通香港,就是這個道理:)沒有絕對的


本機和本機Socket通信會走網卡嗎

先說結論:不走網卡,不走物理設備,但是走虛擬設備,loopback device環回(本地回環).

本機的報文的路徑是這樣的:應用層-> socket接口 -> 傳輸層(tcp/udp報文) -> 網絡層 -> back to 傳輸層 -> backto socket接口 -.> 傳回應用程序在網絡層,會在路由表查詢路由,路由表(軟件路由,真正的轉發需要依靠硬件路由,這里路由表包括快速轉發表和FIB表)初始化時會保存主機路由(host route,or 環回路由), 查詢(先匹配mask,再匹配ip,localhost路由在路由表最頂端,最優先查到)后發現不用轉發就不用走中斷,不用發送給鏈接層了,不用發送給網絡設備(網卡)。像網卡發送接收報文一樣,走相同的接收流程,只不過net device是loopback device,最后發送回應用程序。這一套流程當然和轉發和接收外網報文一樣,都要經過內核協議棧的處理,不同的是本機地址不用掛net device.

網卡,交換機,網橋,路由器,網關工作在OSI模型哪一層

  • 網橋:工作在數據鏈路層,在不同或相同類型的LAN之間存儲并轉發數據幀,必要時進行鏈路層上的協議轉換。可連接兩個或多個網絡,在其中傳送信息包。

  • 交換機:工作在數據鏈路層,原理等同于多端口網橋。作用是連接數個相同網段的不同主機,減少網內沖突,隔離沖突域。利用存儲轉發和過濾技術來從物理上分割網段

  • 路由器:工作在網絡層,在不同的網絡間存儲并轉發分組。可在異種網絡之間(即不同類型的局域網互連,局域網與廣域網,廣域網與廣域網)傳輸數據并進行路徑選擇,使用專門的軟件協議從邏輯上對整個網絡進行劃分。

  • 網關:對高層協議(包括傳輸層及更高層次)進行轉換的網間連接器。允許使用不兼容的協議,比如SPX/IPX和TCP/IP的系統和網絡互連。因為協議轉換是網關最重要的功能,所以答案是工作在傳輸層及以上層次。

  • 網卡:在物理層上網卡主要是完成物理接口的連接,電信號的傳送以及將數據分解為適當大小的數據包之后向網絡上發送的功能. 數據鏈路層功能包括鏈路建立和拆除,幀定界同步順序差錯控制這些。大多認為主要工作在物理層。

網卡核心電器元件

網卡的組成:

  • 主芯片:網卡的主控制芯片是網卡的核心元件,一塊網卡性能的好壞和功能的強弱多寡,主要就是看這塊芯片的質量

  • BOOTROM槽:BOOTROM 插座也就是常說的無盤啟動ROM 接口,其是用來通過遠程啟動服務構造無盤工作站的

  • 數據泵:作用一是傳輸數據;二是隔離網線連接的不同網絡設備間的不同電平,還能對設備起到一定的防雷保護作用

  • 晶振即石英振蕩器:提供基準頻率

 MAC 控制器&PHY

以太網卡中數據鏈路層的芯片一般簡稱之為 MAC 控制器,物理層的芯片我們簡稱之為PHY。即使把它們做到同一塊芯片,但是MAC 和PHY 的機制還是單獨存在的,只是外觀的表現形式是一顆單芯片。

 數據鏈路層MAC 控制器

以太網數據鏈路層其實包含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/GMII(介質獨立接口)子層、PCS(物理編碼子層)、PMA(物理介質附加)子層、PMD(物理介質相關)子層、MDI 子層。而PHY 芯片是實現物理層的重要功能器件之一,實現了前面物理層的所有的子層的功能。

物理層PHY

PHY 在發送數據的時候,收到MAC 過來的數據(對PHY 來說,沒有幀的概念,對它來說,都是數據而不管什么地址,數據還是CRC),每4bit 就增加1bit 的檢錯碼,然后把并行數據轉化為串行流數據,再按照物理層的編碼規則(10Based-T 的NRZ 編碼或100based-T的曼徹斯特編碼)把數據編碼,再變為模擬信號把數據送出去。(注:關于網線上數據是數字的還是模擬的比較不容易理解清楚。最后我再說)收數據時的流程反之。發送數據時,PHY 還有個重要的功能就是實現CSMA/CD 的部分功能,它可以檢測到網絡上是否有數據在傳送。網卡首先偵聽介質上是否有載波(載波由電壓指示),如果有,則認為其他站點正在傳送信息,繼續偵聽介質。一旦通信介質在一定時間段內(稱為幀間縫隙IFG= 9.6 微秒)是安靜的,即沒有被其他站點占用,則開始進行幀數據發送,同時繼續偵聽通信介質,以檢測沖突。在發送數據期間,如果檢測到沖突,則立即停止該次發送,并向介質發送一個“阻塞”信號,告知其他站點已經發生沖突,從而丟棄那些可能一直在接收的受到損壞的幀數據,并等待一段隨機時間(CSMA/CD 確定等待時間的算法是二進制指數退避算法)。在等待一段隨機時間后,再進行新的發送。如果重傳多次后(大于16 次)仍發生沖突,就放棄發送。接收時,網卡瀏覽介質上傳輸的每個幀,如果其長度小于64 字節,則認為是沖突碎片。如果接收到的幀不是沖突碎片且目的地址是本地地址,則對幀進行完整性校驗,如果幀長度大于1518 字節(稱為超長幀,可能由錯誤的LAN 驅動程序或干擾造成)或未能通過CRC校驗,則認為該幀發生了畸變。通過校驗的幀被認為是有效的,網卡將它接收下來進行本地處理許多網友在接入 Internt 寬帶時,喜歡使用"搶線"強的網卡,就是因為不同的PHY 碰撞后計算隨機時間的方法設計上不同,使得有些網卡比較"占便宜"。不過,搶線只對廣播域的網絡而言的,對于交換網絡和ADSL 這樣點到點連接到局端設備的接入方式沒什么意義。而且"搶線"也只是相對而言的,不會有質的變化。

關于網絡間的沖突

現在交換機的普及使得交換網絡的普及,使得沖突域網絡少了很多,極大地提高了網絡的帶寬。但是如果用HUB,或者共享帶寬接入Internet 的時候還是屬于沖突域網絡,有沖突碰撞的。交換機和HUB 最大的區別就是:一個是構建點到點網絡的局域網交換設備,一個是構建沖突域網絡的局域網互連設備。我們的 PHY 還提供了和對端設備連接的重要功能并通過LED 燈顯示出自己目前的連接的狀態和工作狀態讓我們知道。當我們給網卡接入網線的時候,PHY 不斷發出的脈沖信號檢測到對端有設備,它們通過標準的"語言"交流,互相協商并卻定連接速度、雙工模式、是否采用流控等。通常情況下,協商的結果是兩個設備中能同時支持的最大速度和最好的雙工模式。這個技術被稱為Auto Negotiation 或者NWAY,它們是一個意思--自動協商。

PHY 的輸出部分

現在來了解 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 功能,因此不能嚴格確定它們的傳出或接收的關系,要看雙方的具體的協商結果。

PHY 和MAC 之間如何進行溝通

下面繼續讓我們來關心一下 PHY 和MAC 之間是如何傳送數據和相互溝通的。通過IEEE 定義的標準的MII/GigaMII(Media Independed Interfade,介質獨立界面)界面連接MAC和PHY。這個界面是IEEE 定義的。MII 界面傳遞了網絡的所有數據和數據的控制。而 MAC 對PHY 的工作狀態的確定和對PHY 的控制則是使用SMI(Serial ManagementInterface)界面通過讀寫PHY 的寄存器來完成的。PHY 里面的部分寄存器也是IEEE 定義的,這樣PHY 把自己的目前的狀態反映到寄存器里面,MAC 通過SMI 總線不斷的讀取PHY 的狀態寄存器以得知目前PHY 的狀態,例如連接速度,雙工的能力等。當然也可以通過SMI設置PHY 的寄存器達到控制的目的,例如流控的打開關閉,自協商模式還是強制模式等。我們看到了,不論是物理連接的 MII 界面和SMI 總線還是PHY 的狀態寄存器和控制寄存器都是有IEEE 的規范的,因此不同公司的MAC 和PHY 一樣可以協調工作。當然為了配合不同公司的PHY 的自己特有的一些功能,驅動需要做相應的修改。

網卡的供電

最后就是電源部分了。大多數網卡現在都使用 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 總線就可以實現喚醒功能。

電腦之間通過網線傳送的信號是交流高頻信號,電壓不超過3伏,帶不動任何負載。

需要帶負載的POE電壓是48V。RJ45的接口 最大持續工作電壓是8V

電話通過網線傳送的信號直流48—50V,摘機狀態下是直流6-12V,振鈴信號是交流90V 100m以太網的數據發送和接收時傳送的信號是交流高頻信號,電壓不超過3伏。

電話線上的電壓平時是直流48V,而且是高內阻的電源,手碰上絕對安全。但如果動手時正好有電話打入,此時振鈴電壓是75V交流電壓,會有很強的麻手感覺,但沒有危險。為了保險,可以在動手時將電話機外線臨時短路,電壓為0,也不會再有電話能打入。裝好以后將短路線拆除。


最后附上經典:

3985368b56e10aa1be23e9b8fe36765e.jpg

英文版地址:http://pcvr.nl/tcpip/


參考文章:

TCP、UDP數據包大小的限制

Maximum Segment Size,TCP一次傳輸發送的最大數據段長度

網卡,交換機,網橋,路由器,網關工作在OSI模型哪一層

網卡工作原理詳解