流控是乙太網的一項基本功能,可以防止在埠擁塞的情況下出現丟幀。在深入分析之前,先看乙個簡單的應用場景:
埠a和b接收報文,埠c向外**報文。如果埠a和b的收包速率之和大於埠c的頻寬,那麼部分報文就會快取在裝置內部的報文buffer中。當buffer的佔用率達到一定程度時,埠a和b就會向外傳送pause幀,通知對端暫停傳送一段時間。pause幀只能阻止對端傳送普通的資料幀,不能阻止傳送mac控制幀。
以上的描述有個先決條件,那就是埠a和b工作在全雙工模式下,並且使能了流控功能。另一方面,我們也一廂情願地認為對端可以識別pause幀,並可以做出適當的響應。換句話說,對端的埠也要開啟流控功能。
需要注意的是,有的乙太網裝置只能對pause幀做出響應,但是並不能傳送pause幀。
流控的基本原理不難理解,比較容易忽視的一點是--埠收到pause幀之後,停止傳送報文多長時間?其實,pause幀中攜帶了時間引數。收到pause幀的裝置通過簡單的解析,就可以確定停止傳送的時長。對端裝置出現擁塞的通常情況下,本端埠通常會連續收到多個pause幀。只要對端裝置的擁塞狀態沒有解除,相關的埠就會一直傳送pause.
pause幀的結構
pause幀的幀長為64位元組,結構非常簡單。如下所示:
pause幀的目的mac位址是保留的mac位址01-80-c2-00-00-01
(mac control的pause幀使用)
,源mac則是傳送pause幀的裝置的mac位址。
length/type域是十六進製制數8808.
mac control opcode域的值是0x0001.其實,pause幀是mac控制幀的一種,其他型別的mac控制幀使用不同的opcode值,此處不做詳細說明。後面會談到和pause類似的pfc幀,pfc幀中該域的取值是0x0101.
mac control parameters域需要根據mac control opcode的型別來解析。對於pause幀而言,該域是個2位元組的無符號數,取值範圍是0~65535.該域的時間單位是pause_quanta,每個pause_quanta相當於512位元時間。
流控的自協商
現實中,大多數廠商的乙太網交換機都有流控開關命令。部分廠商的裝置可以在自協商功能中對流控進行協商,這種行為有ieee標準作為依據。
在自協商的資訊中,有兩個流控的位元位,即pause和asm_dir,分別表示symmetric pause和asymmetric pause.symmetric pause表示既可以傳送又可以接收pause幀,而asymmetric pause表示只能傳送或只能接收pause幀。
ieee 802.3標準的28b.3中,描述了這兩個位元位的解析方式。簡單來講,如果雙方傳送的協商資訊中pause位都是1,那麼雙方都能傳送和接收pause幀。如果有一方的pause位是0,那麼就需要根據asm_dir位的值結合pause位的值來具體分析。
半雙工模式如何實現流控?
在本文開頭兒的地方說過,埠a和b要工作在全雙工模式下,這是有原因的。如果埠工作在半雙工模式下,那麼pause幀很可能和對端傳送過來的報文產生衝突,對端收不到完好的pause幀,也就無法實現pause的功能。
對於半雙工模式的問題,業界常見的解決方式是"back pressure"或者"jamming"機制。對於這兩種機制,筆者都沒有找到相應的標準,或許本來指的就是同一種機制。半雙工模式下,埠向外傳送一些訊號來占用鏈路,對端也就沒有機會傳送報文。這樣,可以間接達到和流控類似的效果。
基於優先順序的流控(pfc)
乙太網的資料**是盡力而為的,並不能保證傳輸過程中不丟包。像ftp這樣的上層協議,通過自身的確認機制來保證資料的完整性,一旦發現報文丟失,可以要求對端重傳。正因為如此,乙太網的這種盡力而為的**方式,長期以來也沒有遇到過太大的問題。
ieee 802.3x流控雖然可以預防丟包,但是有乙個不容忽視的問題。pause幀會導致一條鏈路上的所有報文停止傳送,在服務質量要求較高的網路中,這顯然是不能接受的。由於這個原因,業界一度出現過對流控的反對聲音。ieee 802.1qbb標準解決了這個問題。
ieee 802.1qbb的核心思想是,針對同一鏈路上不同優先順序的流量,單獨傳送pasuse幀。當某一優先順序的業務發生擁塞時,只讓該類報文暫停傳送,而其他型別的業務不受影響。ieee 802.1qbb可以針對特定優先順序的流量實現流控功能,因此也被稱為pfc(priority-based flow control)。
fcoe技術將fiber channel的資料幀封裝在乙太網幀中進行傳輸,fcoe的乙個基本要求就是不能丟包。pfc成功地滿足了fcoe的需求,同時也不會對其他業務造成影響。
流控機制的解析
流控是乙太網的一項基本功能,可以防止在埠擁塞的情況下出現丟幀。在深入分析之前,先看乙個簡單的應用場景 埠a和b接收報文,埠c向外 報文。如果埠a和b的收包速率之和大於埠c的頻寬,那麼部分報文就會快取在裝置內部的報文buffer中。當buffer的佔用率達到一定程度時,埠a和b就會向外傳送pause幀...
串列埠流控 軟體流控與硬體流控
在序列通訊處理中,常常看到rts cts和xon xoff這兩個選項,這就是兩個流控制的選項,目前流控制主要應用於數據機的資料通訊中。那麼,流控制在序列通訊中有何作用,在編制序列通訊程式怎樣應用呢?下面我們就談談這個問題。1.流控制在序列通訊中的作用 這裡講到的 流 當然指的是資料流。資料在兩個串列...
串列埠流控 軟體流控與硬體流控
在序列通訊處理中,常常看到rts cts和xon xoff這兩個選項,這就是兩個流控制的選項,目前流控制主要應用於數據機的資料通訊中。那麼,流控制在序列通訊中有何作用,在編制序列通訊程式怎樣應用呢?下面我們就談談這個問題。1.流控制在序列通訊中的作用 這裡講到的 流 當然指的是資料流。資料在兩個串列...