么是Zigbee?
Zigbee說白了就是類似wifi、藍牙的一種交換數據的方式,學術點說就是低成本、用於低功耗嵌入式設備(無線電系統),用以促進機器與機器之間高效且有效通信(通常相距10-100米)的無線技術。它建立在IEEE802.15.4的基礎上,比起藍牙,它能建立更大的網絡(藍牙的piconet最多支持7個設備),比起wifi,它雖然速度差很多,但功耗相應的也要低不少,因此它非常適合家庭、工廠等應用場景。小米近期推出的家庭網關設備也正是因為Zigbee的這些優勢才選擇了這項技術。
上面提到的IEEE的802.15.4主要是定義了協議棧的PHY層和MAC層,而Zigbee則是在其基礎上建立了完整的協議棧。之后我們會對Zigbee的每一層再進行詳細的說明。
Zigbee將設備划分成了三類,協調器(Coordinator)、路由器(Router)、終端(EndPoint或是EndDevice)。
- 協調器是整個Zigbee網絡的發起者、管理者,功能包括:對網絡進行初始化,包括制定網絡的信道、PANID(網絡的標識符,比如一個信道內可以存在多個Zigbee網絡,每個網絡就由PANID來區分);配置網絡的安全級別和配置信任中心的地址(默認是協調器自己,且每個Zigbee網絡只能有一個信任中心),信任中心用來分發網絡和端到端應用程序配置管理的密鑰,當一個路由器想要加入網絡,也需要信任中心的許可;維護當前關聯的設備信息。如圖,可以在給的Sample中Tools目錄下的f8wConfig.cfg中修改信道和PANID
- 路由器負責在終端設備之間或終端設備與協調器之間路由數據包,同樣需要維護當前關聯的設備的信息,而且它作為網絡的連接點,是不能休眠的。
- 終端負責感知信息,它不允許其他設備關聯自己,相當於樹的葉子
Zigbee常見的網絡拓撲結構主要有一下幾種
圖中提到的PAN協調點也就是協調器的意思,FFD(FFD-Full Function Device全功能設備)即可以當做三類設備中任一一類使用的設備,而RFD(RFD-Reduced Function Device精簡功能設備)則只可以當做終端使用。實際上我們一般買到的都是FFD,只是在將代碼導入設備時,根據選擇的不同編譯器會做不同的處理,最終生成三類不同的設備,如圖,在IAR中可以直接修改
Zigbee采用short地址方式標識網絡內的設備,short地址是16位的,是由所屬的網絡分配的,類似我們網卡的ip地址,要注意因為short地址只有16位,所以Zigbee的最大接入設備數是65535。
Zigbee的協議棧
上面說了Zigbee的協議棧是在IEEE802.15.4的基礎上建立的,那么要搞懂Zigbee的協議棧就要首先把15.4給搞明白,這就要涉及到無線網絡的知識了。
首先是802協議的相關內容,15實際上是WPAN(wireless personal area network無線個域網),也就是為了實現近距離通信而設置的,其中15.1就是我們熟悉的藍牙,15.4是zigbee,而我們最了解的wifi其實是802.11,也就是WLAN(Wireless Local Area Network 無線局域網)。
由於這部分內容居多無比,所以本文只概括性的進行一下解釋,具體的各層分析會放在以后的文章中
物理層(PHY)
它指定了Zigbee使用的是2.4GHz物理層和868、915MHz物理層,均基於直接序列擴頻(DSSS)技術。而DSSS技術有如下兩個特點:
- DSSS使用一串連續的偽隨機碼(pseudonoise, PN)串行,用相位偏移調制的方法來調制信息。這一串連續的偽隨機碼稱為碼片(chips),其每個碼的持續時間遠小於要調制的信息位。即每個信息位都被頻率更高的碼片所調制。因此,碼片速率遠大於信息位速率。
- DSSS通訊架構中,發送端產生的碼片在發送前已經被接收端所獲知。接收端可以使用相同的碼片來解碼接收到的信號,解調用此碼片調制過的信號,還原為原來的信息。
該層最主要的任務就是在兩個對等MAC實體間提供可靠鏈路,它提供PHY數據服務和PHY管理服務兩種服務,PHY數據服務使PHY能通過物理無線信道傳輸和接收PHY協議數據單元(PPDU);PHY管理服務為PLME(這是一個管理該層的實體,可以通過調用它提供的接口對該層進行管理)提供的接口。
MAC層
在《計算機網絡》這門課中我們學過非常經典的CSMA/CD(也就是多點接入、載波監聽、碰撞檢測)來避免線纜傳輸信息時造成的碰撞,實際上這是定義在802.3的內容,它定義了MAC通過這種方式來避免沖突。但上面提到了“線纜”二字,也就是說這玩意是針對有線網絡而言的,實際上它是通過電壓變化檢測來沖突,那么問題來了,我現在是無線網絡,這上哪檢測電纜電壓去?所以這里我們換了一種想法,我們不再去檢測它是不是沖突了,而是盡可能避免沖突,這也就是CSMA/CA(多點接入、載波監聽、碰撞避免)。Zigbee的802.15.4和wifi的802.11都是在MAC層通過這種辦法來避免沖突的。
我們需要關注的還有安全性的問題。上層會將MAC層的默認密鑰設置為網絡的密鑰,而MAC層則會將上層的鏈接密鑰設置為自己的鏈接密鑰。此外,MAC層采用cbc-mac來進行加密。(關於各類密鑰的說明見下文)
同樣,MAC也提供了MAC數據服務和管理服務,也有管理實體,叫做MLME
以上是對802.15.4規定的層的簡單說明,以下便是Zigbee建立的上層
網絡層(NWK)
網絡層向上通過NLDE實體與應用層聯系,通過NLME管理該層,主要包括了配置新設備,啟動網絡,執行加入網絡,重新加入網絡和離開網絡的功能,提供尋址功能,鄰居發現,路由發現,接收控制和路由等功能。安全性方面主要是AES-CCM*
應用層(APL)
由上面的圖可以看出該層主要分為兩部分,一是APS,也就是應用支持子層,二是一堆的object。
APS目的是為了提供NWK和APL之間的接口。和其他層一樣,同樣提供了兩項服務,一是APSDE在應用實體之間提供數據傳輸服務,二是APS管理實體APMSE,主要是提供安全服務,設備綁定和組管理。APS層基於鏈接密鑰或網絡密鑰的幀安全性。APS層負責安全的傳輸向外傳出的幀和安全的接收傳入的幀以及安全的建立和管理加密密鑰所需的處理步驟。上層通過向APS層發布原語來控制加密密鑰的管理。
一堆的object則又可以分為兩部分,一部分是254個用戶可以自己選用的應用object,他們通過綁定端號實現,實際上就和我們在計算機上常說的端口類似,應用間的通信也是基於端號實現的;另一部分是ZDO(Zigbee Device Object,Zigbee設備對象),ZDO負責初始化APS,NWK和安全服務提供商。它組裝了來自末端應用程序的配置信息,來確定和實現設備和服務發現,安全管理(密鑰加載,密鑰建立,密鑰傳輸和身份驗證),網絡管理(網絡發現,離開/加入網絡,重置網絡連接和創建),綁定,節點和組管理,負責管理設備的安全策略和安全配置。
Zigbee安全策略
Zigbee安全密鑰
上文中我們提到了鏈接密鑰和網絡密鑰,但並沒有具體解釋到底是什么,這里我們就來詳細說明一下。
- 主密鑰:構成兩個設備之間長期安全性的基礎,僅由APS使用。
- 網絡密鑰,主要用在廣播通信,每個節點都要有網絡密鑰才能與其他節點安全通信。可以是通過密鑰傳輸(網絡設備向信任中心發出請求,要求將密鑰發送給它)獲得,或者是預安裝(制造商將密鑰安裝到設備本身,用戶進行選擇)獲得,由NWK和ZigBee的APL應用該密鑰
- 鏈接密鑰,主要用在單播通信,當節點與節點應用通信時,信任中心會生成一個鏈接密鑰並通過網絡密鑰加密發送至節點,也被叫做唯一密鑰;而節點在加入網絡時信任中心會給它分配與信任中心通信的鏈接密鑰,這叫做全局密鑰。當然,也可以用過與安裝的方式獲得。鏈接密鑰比起網絡密鑰多了一種獲得方式——密鑰構造。所謂構造就是通過主密鑰和其他參數算出來一個鏈接密鑰出來,這樣就可以避免了服務之間可能存在的沖突和安全隱患(畢竟算出來,你是你,我是我,井水不犯河水)默認的全局信任中心鏈路密鑰由ZigBee聯盟定義。如果應用程序在加入時未指定其他鏈接密鑰,則默認值為5A 69 67 42 65 65 41 6C 6C 69 61 6E 63 65 30 39
Zigbee安全模型
Zigbee支持兩種不同的網絡安全管理方式,主要區別就是新設備的處理方式和信息的保護,我看大佬們將它翻譯為安全模型,那我也就這樣用了……
如圖為集中式安全模型,這種模型需要我們上面提到過的信任中心來負責安全事務。我們可以通過協調器來指定信任中心或默認使用協調器作為信任中心。當有一個新設備要加入網絡時,首先在配置信息添加新設備的信息,然后為該設備建立唯一的信任中心鏈接密鑰(也就是在MAC層我們提到過的鏈接密鑰),以實現與信任中心的通信。
建立的過程主要是根據安裝碼,安裝碼說白了就是一串通過16位循環冗余校驗的128位隨機數字,信任中心會通過Matyas-Meyer-Oseas(MMO)哈希函數從安裝碼派生唯一的128位信任中心鏈接密鑰
信任中心會維護一個網絡密鑰用來加密信息,並且定期或根據需要切換,來保證網絡信息的安全性。
另外,在集中式模型中,可以使用基於證書的密鑰建立協議(CBKE)來分發密鑰。可以根據制造時存儲在兩個設備中並由證書頒發機構(CA)簽名的證書與信任中心協商對稱密鑰。
我們提到的大多數技術也是在此模型上建立的。
如圖為分布式安全模型,最主要的就是信任中心被“分散”了,負責安全的成了路由器,路由器來注冊接入網絡的設備,鏈接密鑰在加入網絡時各設備預先配置,而網絡密鑰由路由器分發給接入的設備,並且同一網絡使用同一密鑰。
Zigbee安全措施
上文提到了Zigbee采用了AES-CCM*的來保證數據的完整性、可靠性、安全性。
- 發送端,將要發送的數據組織為128位的數據塊,然后進行AES-CCM*的處理,得到的是加密的128位數據和一個生成的MIC(消息完整性代碼,它是通過使用128位密鑰加密IEEE MAC幀的部分而創建的)
- 接收端將收到的數據去除掉MIC,然后進行AES-CCM*處理,得到解密的128位數據,並且有生成了一個MIC,檢查這個MIC和接收的MIC是否一致即可判斷數據是否完整、正確。
上文講述了設備加入集中式安全模型的網絡時信任中心會給予其一個鏈接密鑰,Zigbee通過住宅模式和商業模式進行不同的處理
- 住宅模式,新加入的設備有可能沒有網絡密鑰,沒有受保護的鏈路,但是還是要接收信任中心的鏈接密鑰,這時候就是不安全的發送了;當然,如果有網絡密鑰的話,會等待信任中心的消息,通過這條特殊的消息確認信任中心的地址,然后在進行相應的設置。
- 商業模式,信任中心通過不安全的方式向加入設備發送一個主密鑰,然后雙方通過密鑰建立協議(SKKE),然后建立鏈接密鑰。
Zigbee還在預防重放攻擊(啥是重放攻擊這里就不再展開了)上做了很多工作。Zigbee的每個節點維護了一個32位的幀計數器,數據包每次傳遞時它就會自增,同時它也會跟蹤自己連接設備的幀計數器,當發過來數據包,上一個的幀計數器還是和自己相同或者甚至還比自己小,那就說明有問題了,於是就把這個包丟掉。
上文我們還說到了Zigbee會更新自己的網絡密鑰。當信任中心認為該更新網絡密鑰時,它先生成一個新的密鑰,然后借助舊的密鑰加密分發給其他節點,並將節點的幀計數器清0。注意,新網絡密鑰建立存在延時,節點仍舊會保持舊的密鑰一段時間。