802.11协议精读9:初探节能模式(PS mode)与缓存机制
https://zhuanlan.zhihu.com/p/21505178
序言
由于802.11的協(xié)議工作機(jī)制,如果其一直處于工作狀態(tài)下,那么能耗還是比較大的,尤其移動(dòng)設(shè)備的電量有限,所以在802.11協(xié)議初期就設(shè)計(jì)了相應(yīng)的能耗管理機(jī)制,即引入了節(jié)能模式。本文我們主要討論一下其節(jié)能模式的一些基本思想和相應(yīng)的組件。對(duì)于具體的MAC層工作機(jī)制,我們?cè)诤罄m(xù)的文章中在進(jìn)行展開(kāi)。
注:本文初始的意圖是描述在節(jié)能模式下具體的MAC層工作機(jī)制,不過(guò)后來(lái)在寫(xiě)緩存結(jié)構(gòu)的時(shí)候,發(fā)現(xiàn)內(nèi)容整理還是較多,所以進(jìn)行分拆。故在本文中,我們主要描述了802.11協(xié)議中,節(jié)能的基本思想,以及其所添加的一些組件,具體的MAC協(xié)議之后再進(jìn)行補(bǔ)充。
802.11協(xié)議中的能耗
為了理解802.11節(jié)能機(jī)制,我們首先需要梳理一下wifi中的一些所出現(xiàn)的能耗。通常情況下,802.11設(shè)備一共會(huì)有4個(gè)工作狀態(tài):
- Sleep(休眠模式):節(jié)點(diǎn)會(huì)關(guān)閉發(fā)送和接收模塊進(jìn)行休眠,從而能耗最低。
- Rx Idle(接收空閑狀態(tài)):節(jié)點(diǎn)對(duì)信道進(jìn)行監(jiān)聽(tīng),但并未真實(shí)接收數(shù)據(jù)幀。
- Rx(接收狀態(tài)):節(jié)點(diǎn)監(jiān)聽(tīng)到數(shù)據(jù)幀,并對(duì)其進(jìn)行接收。
- Tx(發(fā)送狀態(tài)):節(jié)點(diǎn)發(fā)送數(shù)據(jù)幀。
在上述過(guò)程中,真正有用的只有Rx和Tx狀態(tài)。但是實(shí)際過(guò)程中,為了保證接受與發(fā)送中沒(méi)有沖突,節(jié)點(diǎn)需要長(zhǎng)時(shí)間處于Rx Idle狀態(tài),從而會(huì)消耗很多能量。一般意義上,Rx Idle狀態(tài)近似于Rx狀態(tài),只是一個(gè)少了一些上層的邏輯處理工作,而能耗較大的RF模塊,LNA,AGC這些都是同樣需要工作的。所以在802.11協(xié)議設(shè)計(jì)中,需要引入Sleep休眠狀態(tài)以代替Rx Idle狀態(tài),達(dá)到節(jié)能的目的,進(jìn)而擴(kuò)展成了休眠模式下的工作機(jī)制。
下圖給出了一般wifi芯片中,這四種模式的功耗情況(參考《AR5213_Data_Sheet_0704》中第10.1.5 Power Consumption節(jié))
該圖所描述的都是工作在802.11g的模式下,為了更好的描述主題,我們對(duì)原圖進(jìn)行了一些裁剪,其余工作模式的功耗還請(qǐng)查閱原文。上圖分別列舉了AR5213這塊芯片,在1.8V的供電模式和3.3V的供電模式下,對(duì)應(yīng)的不同的功耗。可以明顯看出,Sleep狀態(tài)和其他幾個(gè)狀態(tài)的功耗還是有很大差距的,從而節(jié)能模式如果設(shè)置的好,那么的確可以達(dá)到一個(gè)很好的節(jié)能效果。
同時(shí),上圖只是給出了一個(gè)標(biāo)準(zhǔn)Tx的功率大小,在802.11中還存在transmit power levels參數(shù),一般有8個(gè)級(jí)別,可以調(diào)節(jié)具體的Tx功率。同時(shí)在beacon幀中,也可能會(huì)添加Power Constraint element與Power Capability element這些參數(shù),從而對(duì)該區(qū)域內(nèi)的節(jié)點(diǎn)功率進(jìn)行約束。這些都會(huì)影響具體的Tx功率大小,不過(guò)由于這些機(jī)制主要用于TPC(Transmit Power Control)機(jī)制,而本文討論主要是節(jié)能機(jī)制,所以就不展開(kāi)了。
節(jié)能模式的基本思想
按照之前我們的敘述,在802.11中功耗最大的部分是在Rx Idle狀態(tài)。如果能夠減少Rx Idle狀態(tài)的持續(xù)時(shí)間,那么節(jié)點(diǎn)就可以節(jié)能了。在本章節(jié)討論中,由于不討論具體的MAC機(jī)制,所以我們簡(jiǎn)單假設(shè)一個(gè)拓?fù)?#xff0c;該拓?fù)鋬H包含一個(gè)AP和一個(gè)節(jié)點(diǎn)。節(jié)點(diǎn)上行發(fā)送都是發(fā)往AP的,下行是AP發(fā)往節(jié)點(diǎn)的。故從節(jié)點(diǎn)的角度而言,執(zhí)行Rx Idle的目的則有兩種可能性:
- 如果節(jié)點(diǎn)是為了發(fā)送數(shù)據(jù),那么Rx Idle是用來(lái)監(jiān)聽(tīng)信道的,從而如果沒(méi)有數(shù)據(jù)發(fā)送,那么就不進(jìn)行監(jiān)聽(tīng),從而就可以減少Rx Idle的持續(xù)時(shí)間了,這個(gè)還是很容易做到的。
- 如果節(jié)點(diǎn)是為了接收數(shù)據(jù),那么Rx Idle則一定需要長(zhǎng)時(shí)間持續(xù)進(jìn)行。因?yàn)樽鳛榻邮辗?#xff0c;節(jié)點(diǎn)無(wú)法知道AP什么時(shí)候發(fā)送給自己的下行數(shù)據(jù),所以要不斷的監(jiān)聽(tīng)信道,保持Rx Idle狀態(tài),對(duì)于每一個(gè)數(shù)據(jù)包都不能漏。由于節(jié)點(diǎn)無(wú)法控制AP,所以這一塊是比較難做到的。
- 緩存機(jī)制:這里緩存的主要是AP發(fā)往節(jié)點(diǎn)的數(shù)據(jù)。當(dāng)AP從外網(wǎng)接收到要轉(zhuǎn)發(fā)給節(jié)點(diǎn)的數(shù)據(jù)后,會(huì)將以MSDU的形式(即MAC層的數(shù)據(jù)幀)進(jìn)行緩存(這里僅僅對(duì)工作在節(jié)能模式下的節(jié)點(diǎn)數(shù)據(jù)進(jìn)行緩存),并不直接發(fā)送給節(jié)點(diǎn)。
- PS-Poll機(jī)制:若節(jié)點(diǎn)想要獲取下行數(shù)據(jù),那么節(jié)點(diǎn)需要主動(dòng)跟AP請(qǐng)求數(shù)據(jù),該請(qǐng)求幀就是PS-Poll幀。AP接收到該幀后,會(huì)檢查緩存區(qū)是否有對(duì)應(yīng)該節(jié)點(diǎn)的緩存,如果有就會(huì)從緩存區(qū)中調(diào)出對(duì)應(yīng)該節(jié)點(diǎn)的緩存數(shù)據(jù),并進(jìn)行下發(fā),如果沒(méi)有則反饋一個(gè)NULL幀(既空數(shù)據(jù))。有的書(shū)中,也將這個(gè)請(qǐng)求機(jī)制比較形象的描述為“兵乓”機(jī)制。
PS:上圖簡(jiǎn)單描述了節(jié)能模式的基本工作原理,其中我們省略了ACK的過(guò)程,以及在多節(jié)點(diǎn)情況下的具體工作機(jī)制,之后我們?cè)龠M(jìn)行補(bǔ)充。上述表述如果有錯(cuò)誤的地方,還請(qǐng)見(jiàn)諒。
緩存機(jī)制
這里我們大致談?wù)撓翧P對(duì)于下行數(shù)據(jù)的緩存機(jī)制,首先筆者對(duì)這一塊也沒(méi)有完全的理順,尤其是協(xié)議與內(nèi)核實(shí)現(xiàn)機(jī)制這一塊,貌似并不是完全按照協(xié)議的定義來(lái)實(shí)現(xiàn)的,所以這里只是一些簡(jiǎn)單的列舉。如有錯(cuò)誤還請(qǐng)指出,以便將這一塊更加理順一些。
- 協(xié)議中對(duì)于緩存機(jī)制的描述(參考802.11協(xié)議07/12版本)
在協(xié)議中,對(duì)于該buffer的描述還是較為復(fù)雜的。為了表述緩存,我們首先要描述在802.11協(xié)議中,對(duì)于一個(gè)幀如何存放是怎么定義的。在802.11協(xié)議中,數(shù)據(jù)幀的存放是通過(guò)FragSdu結(jié)構(gòu)體進(jìn)行存放的。(細(xì)節(jié)見(jiàn)07版協(xié)議第805-806頁(yè))
在這一段中,我們按照標(biāo)注的順序進(jìn)行描述。
- 紅色部分的1,這個(gè)部分描述了這整個(gè)模塊的功能,是用來(lái)描述一個(gè)分段支持類的。然后在這個(gè)類下面,定義了3個(gè)子模塊(圖中只有2個(gè),還有一個(gè)與節(jié)能模式有關(guān)所以放在后面描述)。
- 紅色部分的2,注釋表明說(shuō)明,這里定義了一個(gè)數(shù)組用來(lái)存放具體的數(shù)據(jù)幀的。
- 藍(lán)色部分的1,標(biāo)識(shí)部分即是該FragArray數(shù)組的具體定義。
- 紅色部分的3,注釋了FragSdu的功能,實(shí)際上整個(gè)發(fā)送緩存,無(wú)論是否有fragment都是按照FragSdu進(jìn)行存儲(chǔ)的,該FragSdu在實(shí)現(xiàn)上具體就是一個(gè)結(jié)構(gòu)體。雖然名字是用來(lái)定義分片的SDU的,但是其中也寫(xiě)明了“Each SDU, even if not fragmented, is held in an instance of this structure awaiting its (re)transmission attempt(s).”,故即使該數(shù)據(jù)包沒(méi)有分片,那么應(yīng)該是按照FragSdu這種形式統(tǒng)一存放的。
- 藍(lán)色部分的2,在FragSdu結(jié)構(gòu)體中,主要存放這個(gè)具體數(shù)據(jù)包中對(duì)應(yīng)的很多的參數(shù)。這些參數(shù)包含一些數(shù)據(jù)幀中具體的控制字段,我們以紫色方框的標(biāo)注敘述其具體描述方法。在紫色方框這一行中,紫色1標(biāo)注該變量名為psm,紫色2所標(biāo)注變量類型是Boolean類型,紫色3所標(biāo)注的字段是注釋,標(biāo)注該變量是描述該數(shù)據(jù)包是否發(fā)往節(jié)能模式下的節(jié)點(diǎn)的。在這一行表述中,如果該變量是1的話,那么就標(biāo)識(shí)這個(gè)數(shù)據(jù)包對(duì)應(yīng)的接收節(jié)點(diǎn)是工作在節(jié)能模式,反之則不是。之前在紅色部分2所定義的FragArray數(shù)組,也是通過(guò)最后一行所定義的pdus參數(shù),存放在FragSdu結(jié)構(gòu)體中。
每一個(gè)幀是通過(guò)FragSdu來(lái)存放的,對(duì)于多個(gè)幀,在802.11協(xié)議中實(shí)際上是以一個(gè)隊(duì)列進(jìn)行存放,該隊(duì)列即是SduQueue。在802.11協(xié)議中,發(fā)送緩存以及用來(lái)節(jié)能模式下的發(fā)送緩存都是一個(gè)隊(duì)列的結(jié)構(gòu)。在802.11協(xié)議描述中,其是首先定義了一個(gè)隊(duì)列的類,然后在分段支持類進(jìn)行對(duì)SduQueue進(jìn)行了繼承。首先我們查閱下Queue類的初始定義,如下:
在該Queue類中,其定義了兩個(gè)方法,即Qfirst(queue,item)和Qlast(queue,item)。其中Qfirst(queue,item)子函數(shù)負(fù)責(zé)把數(shù)據(jù)幀插入到隊(duì)列首部,Qlast(queue,item)負(fù)責(zé)把數(shù)據(jù)幀插入到隊(duì)列尾部,在一些材料中,這里還所述定義了first_and_tail方法,不過(guò)筆者在協(xié)議中并沒(méi)有直接找到。在分段支持類中,對(duì)Queue進(jìn)行了繼承,如下:
即增加了一個(gè)方法Qsearch(queue,addr),在節(jié)能模式下,當(dāng)節(jié)點(diǎn)發(fā)送PS-Poll后,AP需要在緩存區(qū)查找出對(duì)應(yīng)該節(jié)點(diǎn)的數(shù)據(jù)幀,再進(jìn)行相應(yīng)的傳輸。在這一段描述中,該FragSdu描述是為了power save buffers使用的,但是很多材料中所述,整個(gè)傳輸緩存就是按照SduQueue的形式存放的,這里筆者并沒(méi)有嚴(yán)格考證過(guò),最后我們用一張圖大致描述下整個(gè)結(jié)構(gòu)。
- 內(nèi)核中對(duì)于緩存機(jī)制以及節(jié)能模式的描述(參考《Linux Kernel Networking》第12章部分內(nèi)容以及openwrt的源碼)
其中ps_tx_buf就是用以節(jié)能模式下,存儲(chǔ)節(jié)點(diǎn)的buffer的,其中IEEE80211_NUM_ACS參數(shù)一般設(shè)成4,其對(duì)應(yīng)是802.11e中存在的4中不同優(yōu)先級(jí)的隊(duì)列,sk_buffer_head是一個(gè)結(jié)構(gòu)體,其含義是一個(gè)鏈表頭,一般該結(jié)構(gòu)都是用來(lái)輔助sk_buff結(jié)構(gòu)快速找到鏈表頭結(jié)點(diǎn)的。具體實(shí)現(xiàn)中,應(yīng)該是利用該鏈表結(jié)構(gòu)實(shí)現(xiàn)了一個(gè)Queue,或者說(shuō)是一個(gè)FIFO。
同時(shí)實(shí)現(xiàn)中,定義了一些有關(guān)buffer長(zhǎng)度的限制,筆者目前整理一共有三處限制。
- STA_MAX_TX_BUFFER:該參數(shù)大小是64(書(shū)上所述是128),是用來(lái)限制ps_tx_buf的帶下的,位置在\net\mac80211\Sta_info.h中。該參數(shù)的意思是,每一個(gè)節(jié)點(diǎn)最多可以儲(chǔ)存64個(gè)數(shù)據(jù)包。
- AP_MAX_BC_BUFFER:該參數(shù)大小是128,是用來(lái)限制bc_buf的大小,位置是在\net\mac80211\Ieee80211_i.h。該buffer是專門(mén)用來(lái)存放組播/廣播幀的,該buffer只有1個(gè)隊(duì)列。
- TOTAL_MAX_TX_BUFFER:該參數(shù)大小是512,根據(jù)描述,是用來(lái)限制總的buffer大小的,位置是在\net\mac80211\Ieee80211_i.h中。
PS:上述主要還是關(guān)注了下,AP中為節(jié)能模式所設(shè)定的緩存結(jié)構(gòu),具體的節(jié)能實(shí)現(xiàn)機(jī)制和MAC層協(xié)議,這里我們還沒(méi)有展開(kāi),還請(qǐng)見(jiàn)諒。
總結(jié)
以上是生活随笔為你收集整理的802.11协议精读9:初探节能模式(PS mode)与缓存机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 大话WiFi省电模式
- 下一篇: 802.11协议精读5:隐藏终端和暴露终