2020年12月6日 星期日

10GPON的基本知識

10GPON的基本知識

由於知識不足,決定還是由PON開始我們的討論。PON (Passive Optical Network): 被動式光纖網路的簡寫。是一種一對多的光纖傳輸和訊號分配技術,下行採用廣播方式,上行採用時分多址接入方式,可以靈活地組成樹枝狀、星狀或是匯流排等等不同的網路拓撲。

PON的歷史與發展如下:

ITU-T G.983

大約在1995年的時候,ITU制定了這個標準,主要給第一代的光線網路系統ATM(非同步傳輸模式)來使用,APON/BPON可以提供622 Mbps (OC-12)的下載頻寬和155Mbps的上傳頻寬,這速度對於仍在使用撥接網路1995時代,無異於天文數字。

APON(非同步傳輸模式PON, ATM Passive Optical Network)。這是最早的光網路標準,記得當初都使電信公司的主幹線在使用,例如兩家ISP要連起來,就用APON,其實比較像光纖的專線。

BPON(寬頻PON,Broadband Passive Optical Network):很快地,就發現現實面APON有許多的不足,舉例來說,光纖拉到大樓之後,也許很多家公司需要共享這條光纖的頻寬,於是BPON就出來了。新標準增加了WDM,用來做頻寬分享,同時有許多容錯的設計。BPON也訂了一個管理介面的標準OMCI。由於頻寬需要分接,於是出現了OLT與 ONU/ONT這樣的設備定義。

IEEE 802.3ah

轉眼到了2014年,這是經過Internet的泡沫,網際網路網的速度已經不可同日而語,基於銅線技術的ADSL由2000年開始,大力的推廣與普及,但是這技術有速度侷限線性。

這事後有專家提出,何不將Ethernet的技術應用到光纖網路上? 於是EPON (Ethernet Passive Optical Network)便出現。這概念上非常如意了解,就是用光纖取代網路線的概念。除了速度之外,也可以傳送非常遠的距離。(雙絞線Ethernet只能拉100公尺遠)。這是一個為使用乙太網路包資料的IEEE/EFM標準。所以802.3ah是IEEE 802.3標準的一部分。

不知道為什麼? 這技術只有在日本比較流行,其他地方沒有推起來。

ITU-T G.984

2004年的時候AT&T開始了光速計畫 (Lightspeed Project),採用了PON作為標準技術。主要應用是IPTV,我們公司很幸運的參與了這個計畫,負責提供IP STB。

2008年的時候,GPON便出現了,顧名思義GPON就是Gigabit Passive Optical Network的簡寫,除了速度達到Gigabit之外,也增加了安全性和可選擇的第二層協定(就是說ATM、GEM、Ethernet通吃的意思)。至此大約有十年的時間都是GPON的天下。

IEEE P802.3av (10G-EPON)

事實在GPON發展的同時,就有專家展開10G-EPON的定義,工作由2016年開始,到了2009年便完成802.11av的規格。基本上,規格向下相容802.3ah (EPON)。10G-EPON將使用不同的波長的光束給10G,所以兩種標準可以使用同一條光纖來傳輸。

ITU-T G.987 (10G-PON)

ITU這邊也沒有閒著,2010年終於推出的新的10GPON標準,叫做G.987,或者叫做 XG-PON。規格非為兩種:

第一種是非對稱式10G-PON(稱之為XG-PON1),提供最大下載10Gbps,上傳2.5 Gbps的傳輸速度。

第二種是對稱式10G-PON(稱之為XG-PON2),上下的速率均為10 Gbps,但是在ONT上需要更昂貴的突發模式雷射(Burst Mode Laser)來支持10Gbps的上行傳輸速度,在2010的時候,價格是GPON的90倍,到了2020年,還是有20倍的價差。

ITU-T G.9807.1 (XGS-PON)

由於XG-PON2的成本問題,2016年,ITU-T G.9807.1又發表了另外一個對稱式10G-PON標準,稱之為XGS-PON。至此大勢底定XGS-PON成為主流。

2020年11月7日 星期六

有關於Wi-Fi的基本知識(二)

上一篇介紹了Wi-Fi頻譜的知識,但是衍生了更多的問題與諸多的名詞與疑問,特別是寫WT-398測試規範的時候,覺得有許多觀念與名詞沒有解釋清楚。於是繼續深入的往下瞭解。

本篇其實是依照WT-398測試時出現的名詞來分段說明,分為以下幾個部分:Protocol、MCS、GI、Spatial Stream (空間流),以下就分別看一下:

1. Protocol 

之前有許多許多協定的標準在歷史上出現:11a, 11b, 11g, 11n, 11ax, 11ax,這就是Protocol,2019年Wi-Fi產業聯盟覺得太難懂了,於是就定義幾個比較好記的名字Wi-Fi 4、Wi-Fi 5、Wi-Fi 6,下面這張表,足以說明名詞與協定:

Wi-Fi Protocol

2. Modulation Coding Scheme (MCS)

上面圖中大致上理解不會有太大問題,但是其中有一個MCS,一般來說大家比較沒有注意。這裡需要多談一下。

Modulation 中文叫做調變,Modulation Coding Scheme 就是調變編碼方式。所謂調變,就是將數位的資料轉換為無線電波(Analog)的方式,接收端接到信號之後,必須要再解譯回來,稱之為解調(Demodulation),轉換過程中,切割資料的越密,數據的傳輸量就越大。

那為什麼一開始不切密一些? 因為這是實際問題,切割資料的越密,需要CPU的運算能力越大,考慮實務面的困難度,所以前面定標準的人,只能用保守一些的方式來定義規格。此外,越簡單的演算法,就算是微弱的信號也可以完成訊號的傳遞,但是複雜的演算法,只要信號太弱,就無法Recover回來,換成我們生活用語,就是會開始掉包,一旦掉包就要重傳,這時候連線速度就會大幅下降。

MCS其實也代表了依照時間,技術發展的演進。請參考下表:


調變方式決定無線信號(RF)載波時的數據密度,計算的公式如下:QAM數值是2的N次方,因此,64QAM = 2^6,表示一次可傳輸6 bit的數據;256QAM = 2^8,一次可以傳8 bit;1024QAM = 2^10,就可以傳10bit了。

為保證數據傳輸的完整性,在調製過程中需要插入一些容錯數據用於糾正錯誤,因此有個Coding Rate的概念,它以分數形式來體現每次傳輸時有效數據的比例。上表當中,1/2表示只有一半是有效數據,另一半是容錯數據;5/6表示5/6是有效數據,1/6是容錯數據。所以MCS=5就與MCS=7來比較,MCS-7會有比較好的容錯能力。

將調製方式與碼率組合起來,就得到上面的MCS (Modulation and Coding Scheme)速度表,WiFi設備的實際連接速率,會在這張表當中上、下跑,當無線信號強勁時,裝置會使用MCS較高的組合,當無線信號比較弱的時候,裝置會傳送失敗,這時候就會自動往低階的組合來嘗試。

3. GI (Guard Interval) 保護間隔

這裡面還有一個名詞叫做GI需要解釋一下,GI是Guard Interval的簡寫,在11n/ac標準中,每一封包是發送3.2微秒,再停止800 ns (微秒),接著繼續發下一封包,這個間隔時間就叫做Guard Interval。

保護間隔的設計是在避免多路徑效應(Multi-path Effect)造成的信號損失。在無線傳輸中,通常天線都不只一支,RF信號會通過兩條或更多條路徑到達接收天線,如果後一個封包到達天線的速度過快,則信號可能會干擾較早的封包(意味著信號品質下降)。

除了天線之外,傳輸的RF信號可能會遇到障礙或牆壁,這些障礙可能會改變原始信號或反射出新信號。一個或多個原始RF可能會繼續直行到達接收天線,反射的RF接著也來到接收天線。這樣就全亂了。GI就是等一下,等處理完了再繼續送。

注意: 802.11 a/b/g的GI為800 ns。但是之後的802.11n/ac/ax,都可以使用較短保護間隔(400 ns),

那如果短GI是不是可以提高速度? 的確可以,整體而言,GI=400 ns時,可以將傳輸的效率提升10%多。但是也有一些條件限制:

  • 如果金屬或其他反射材料不會過多,可以啟用短GI。
  • 如果僅使用 802.11n、802.11ac、802.11ax時,可以啟用短GI。

而幾乎所有無線裝置的GI的預設值仍設置為800 ns。

4.Spatial Stream (空間流)

空間流(Spatial Stream)源於MIMO(多天線同步收發)技術,通常以I×O來標識接收/發送的天線數,兩者可以是任意比例,不過在WiFi設備中,基本是收發對等的,例如2×2或4×4,即2條空間流(2SS)或4條空間流(4SS)。因此,在每支天線的傳輸速度假設為相同的情況下,WiFi設備的理論傳輸帶寬=單一流帶寬×空間流數目。

PS: 實務上,其實每支天線的效能都不太一樣。

5. 如何計算速度

(1) Wi-Fi 5

這裡提供一個常用的理論值,如果5GHz 802.11ac/256QAM/80MHz時:

1SS : 433Mbps

2SS : 867Mbps

3SS:1300 Mbps

4SS: 1733Mbps

如果 2.4GHz 802.11n/64QAM/40MHz時:

1SS: 150 Mbps

2SS: 300 MBps

以WAP-7531來說,最大的頻寬就是 1733 + 300 = 2033,廣告詞就是AC2033

而WAP-3518來說,最大的頻寬就是 867 + 300 = 1167,廣告詞就是AC1200。

(2) Wi-Fi 6

WAP-7631 的話,5GHz 802.11ax/1024QAM/80MHz,所以 600.5 x 4 (5GHz) + 287 x 2 (2.4GHz) = AX2974,可以號稱為AX3000。

WAP-6002 的話,5GHz 802.11ax/1024QAM/160MHz,所以 1200 x 4 (6GHz) + 1200x4 (5GHz) X4 + 1200 x 4 (2.4GHz) = 14400,可以號稱為AX14000。



2020年9月13日 星期日

HERMES音響展問答

 Q1: Sound Machine這個品牌,能不能介紹一下!

這個牌子最早是專門幫德國電視營運商(類似台灣的MOD或是有線電視系統)做AUDIO產品,在B2B市場已經很有名氣了,產品都是搭配電視系統銷售。後來業務也逐步擴充到歐洲其他國家。這次展示的SMC-5500是為了法國營運商所設計的,所以外形沒有那麼德國,比較華麗一些,單是依然算是很低調。

Sound Machine 原先比較像一個AUDIO實驗室,他自己沒有工廠,我們公司大約在三年前開始生產 Sound Machine 所設計的音響系統,然後合作賣給歐洲營運商客戶。這業務模型很像是一些筆電的AUDIO系統找B&O、Harman Kardon來做設計的概念很類似。

去年我們覺得SMC-5500也很適合消費市場來使用,便嘗試在台灣找代理商,後來順利的找到了。

Q2: 看起來比較偏數位音響,想了解一下產品定位。

沒錯,由於產品設計給營運商,主要搭配歐美的娛樂主流,所以Dolby DD+、最新的ATMOS就成為主要的功能。當然其他線上音樂也非常重要。

要知道歐洲的智慧財產權保護是非常嚴格的,這產品主要搭配 Streaming Video的服務,例如Netflix、Disney Plus、HBO GO等等。

在台灣市場也許PC連接、Blu-Ray DVB比較重要,不過Netflix也越來越流行。所以Dolby ATMOS的支援也許會越來越重要。所以您可以看到我們一直在主打ATMOS。

Q3: 您一直說Dolby ATMOS,能不能多談一下?

Dolby五點一聲道大家都知道吧! 在1992年第一部電影蝙蝠俠大顯神威(Batman Return)使用後,專眼已經三十年了,但這是一個平面環繞的技術。

2012年Dolby開始推廣一個新的技術給電影院,就是ATMOS,這是利用物件導向觀念來製造音場,達到更為臨場感的音效。

ATMOS可以傳送128個聲道,最多用64個喇叭來播放,台灣第一個使用ATMOS音效的電影院是台北西門町國賓戲院。

當然家庭中是不可能放如此多了喇叭,所以最多的家庭使用的設計就是用左、右、中央、重低音,這是放在前面。後面也要放兩隻喇叭。此外需要兩隻喇叭來做成天空聲道。這就形成了一個完美的家庭劇院。如果要更完美一點,還可以加兩隻側面的喇叭。

如果你在國賓戲院看過電影,你一定會發現這幾乎與坐在電影院有幾乎相同的音效感覺。

Q4: SMC-5500設計上似乎只有四支喇吧,但你剛才說的架構要用八到十支喇叭才能完成?

對的! 杜比也知道不可能到處都裝上十隻喇叭才能播放ATMOS,所以提供了演算法(Algorithm),能將ATMOS音效在3.1的架構上播放出來。這就是SMC-5500的設計,SMC-5500主要設計的客戶是在小家庭或是國外的起居室(Living Room)使用的喇叭,但是就像德國跑車,雖然體積小、依然有強勁的音效。其實這也是這設計上厲害的地方。

Q5: 體積的確與聲音不成比例。

前面說過,我們產品有考慮運營商在客戶安裝與運送的問題,所以體積一定不能大。

Q6: 那今天的DEMO,似乎有很多喇叭在運作,是不是也可以說一下?

這是下一步要推廣的產品,主要的概念是反正SMC-5500都已經處理Dolby ATMOS解碼了,何不把她的功能極大化。所以就利用一堆主動式喇叭,把其他的聲道全部都撥出來。這就是您今天聽到的展示。

今天的展示當中,所有的衛星喇吧都是用Wi-Fi與SMC-5500連接起來使用,這也是考慮未來家庭劇院的配線問題。衛星喇叭只要電源就可以運作了。


2020年9月7日 星期一

音響展稿子

 先寫一下三位小姐的稿子與歌單:

還沒有寫完,先看一下方向,如果可行,晚上再寫完。 

知性美

當接到主辦單位的邀約,說要在音響展分享一下我的私房歌曲。我有到網路上搜尋了一下,音響展好像都是聽交響樂,但是我實在是沒有在聽,所以有點緊張。後來主辦單位說沒有關係就我平常休閒時候,常聽的曲子就可以了。不過我聽的歌曲比較老派一些,大家不要笑出來,也希望大家會喜歡。

第一首歌曲是來自一位老歌星叫做Celine Dion,我第一次聽她的歌是電影鐵達尼號的主題曲。後來陸續聽了她許多的歌,其中有一首歌叫做All by myself,當我寂寞的時候,就會想起這首歌。我選的版本是她2008年前在美國波士頓的演場會錄音,我也許本來想哭,聽完之後就堅強了起來,哈!哈!

https://www.youtube.com/watch?v=tT2gVblzFvY

我希望大家在聽這首歌的時候,透過這個音響,可以聽到Celine在麥克風主要演唱以外,不小心收入的的一些其他有趣的細節,例如她拍胸,也滿有趣的。

第二首歌曲是一首流行爵士樂的名曲叫做Look of Love,老實說,我是因為電影La La Land才知道爵士樂是怎麼回事。但是太純的爵士樂還暫時沒有辦法,但是流行爵士,或是Smooth Jazz的確很舒壓。流行爵士樂兩個大美女就是Norah Jones與 Diana Krall,兼具美貌與才藝,真是令人羨慕。下面就介紹Diana Krall唱的Look of Love,這也是一個2002年錄製的現場版本,在管絃樂的襯托之下,Diana Krall用低沉的嗓音,娓娓唱出愛情的模樣,Diana真的跟歌詞所吟誦的愛情一樣的美:

https://www.youtube.com/watch?v=SQuDaIbpA1g

第三條歌是一首日文歌。這首歌曲三十年前日本老歌叫做 Plastic Love,這歌曲的原唱是竹內瑪麗亞年輕時期的作品,但當年不是主打歌,所以在2017年之前,根本沒有人注意這首歌。。竹內瑪麗亞今年已經六十五歲了,在日本歌壇也算是活躍了一輩子。

2017年,一個叫做"Plastic Lover"的YouTuber把這首歌,貼上了他的網站,當作是主打歌。沒想到因為Google的推薦演算法把這首Urban Jazz風格的歌曲不斷出現在類似曲風的推薦歌單當中,於是突然間爆紅,在歐美傳唱起來。難想像的這首老歌的在現今聽來,也沒有老派的感覺。

但我選播的歌曲不是原唱, 竹內瑪麗亞對我來說還是太資深了 一點。而是一個剛走紅的日本新團Friday Night Plans。這是Live的錄音,四個團員以Bass, 鼓, 鍵盤與主唱的人聲,交織出完美的都會音樂風情,主唱應該是一位菲律賓混血的日本人。這片子中,有一隻搶戲的狗。

https://www.youtube.com/watch?v=HpN4bdyqHeI

第四首歌,選的是一位大叔唱的歌,叫做 I just died in your arm tonight,我覺得好好聽,希望有人對著我唱:

https://www.youtube.com/watch?v=_gmxLE3WYmw


流行美

要在音響展分享一下我的私房歌曲,這題目對我是有點考驗的,因為我聽歌是走流行路線,跟我的工作有關,最常聽都是舞曲。那我就挑一些最近在聽的歌,播放給大家聽:

我聽得主流就是歐美流行音樂的四大女神: Dua Lipa、Arinan Granda、卡蜜拉(
Camila Cabello)、原先我的第四位女神是泰勒斯(Taylar Swift),不過最近一位新歌星Doja Cat (蜜桃貓)暫時取代她的位置:

先由
蜜桃貓開始,第一手歌曲是目前紅遍歐美的抖音神曲"Say So",這也是本週Billboard Top 100第一名的歌曲。主唱叫做Doja Cat,翻譯成中文是"大麻貓"。這小姐16歲出道,目前22歲,所以幾年來都沒有混出名堂。
2019年勉強出了第二張專輯,前面已經出了四條歌,都淹沒在歌海當中。誰知道Dua Lipa的新專輯連續推出三條主打歌都是Disco曲風。把這種復古的調調,炒得火熱。而"Say So"這首歌幾乎是百搭,於是一堆人裡用她的節奏做出一堆混音。後來就成了神曲。

這第一條歌使用兩位其他歌星的歌曲混到Say so當中,真的很神奇的Mashup;

https://www.youtube.com/watch?v=jd1ye5fyc3A

下面就介紹
Dua Lipa的防疫歌曲,一個好好待在家:

https://www.youtube.com/watch?v=IAS8mRPqdJM

Camila Cabello 'Señorita' 與他合唱的目前歌壇的超級小鮮肉 Shawn Mendes,這是2019 MTV頒獎典禮的錄影。

https://www.youtube.com/watch?v=tcrTQUVkUe0

台灣美

我比較常聽的是中文歌,但是知道要測試音響,所以選了一些比較難的歌來試試看。

第一首歌叫做"可惜了"。這是莫文蔚與齊秦的合唱,我常用耳機聽這首歌。

這歌確實很好聽,一開始莫文蔚用High Key唱,齊秦用Low Key來唱合聲,剛好跟他們兩位的強項反過來,後來,齊秦恢復了唱漂亮的High Key之後,莫文蔚的聲音又被壓過去了。

但其實我用我朋友的大型耳機來聽,男女生的錄音是均衡的。所以拿來試試看:

https://www.youtube.com/watch?v=HVOfLZcKjGo

不知道大家覺得怎麼樣?

第二首試聽的歌是"去年冬天"。這首歌有很厲害的故事,用動人的MV來呈現。

這個MV是五分鐘一鏡到底的拍法。男主角來自希臘,女主角是愛沙尼亞人。兩位都是跳舞的網紅。導演將佈景、歌曲先寄給他們編舞、在外國先練習好。

拍攝的前三天兩位舞者終於來到了台灣。到現場重新RE,依照實景做修正,大約排了三十多遍後就正式拍攝了。不得不說,這也許是我這輩子看過最厲害的中文MV了。

這首歌的鼓點很低沉,我覺得可以拿來試試音響:

https://www.youtube.com/watch?v=nIa_xJgFO38

不知道大家有沒有注意聽,還是都被這裡厲害的劇情給吸引走了,根本沒有辦法好好仔細聽這首歌。

下一首曲子,選的是蔡琴的歌,我聽說好音響都要用蔡琴的歌來測試,但是我很喜歡新不了情,所以挑了這條歌。

 https://www.youtube.com/watch?v=q3L7NPB_ADg

最後一條歌,選的是楊宗緯的歌,我想用男生來試試這音響;

https://www.youtube.com/watch?v=dfV78HLb_HU

2020年8月11日 星期二

NAT與STUN伺服器

 我先寫一下NAT的基本概念,NAT的類型。接下來再仔細談主要的NAT解決方案STUN,由於STUN有許多不完美的地方,所以還有後的版本,叫做TUNE,這留到以後有需要的時候再寫。

一、NAT (Network Address Translation) 

先談一下NAT,為了解決IP Address不足的問題,大部份的IPv4網路都使用NAT的方式來提供TCP/IP的連線服務。簡單來說,家庭網路的路由器100%都具備有NAT的功能。所以例如我們的Router有四個LAN PORT,一個WAN Port。這個WAN Port被賦予一個唯一的Public IP (或是說合法的IP),而LAN的部分被設定為Local IP (或稱之為 Private IP)。Router的NAT功能,可以讓所有的Private IP都可以透過轉換連接到全世界所有的具備合法IP的電腦主機。

依照RFC 1918的定義,Private IP可以依照不同大小的網路,選擇Private IP的規劃:

  • Class A: 10.0.0.0 ~ 10.255.255.255
  • Class B: 172.16.0.0 ~ 172.31.255.255
  • Class C: 192.168.0.0 ~ 192.168.255.255

Class A/B 大都提供給企業使用,而Class C大都是提供給家庭網路使用。

由於Private IP見不了光,所以就要倚靠 Router 的NAT的機制。基本上,Router會建立一個NAT Table。把眾多的連線需求,利用 “Socket Port”,對應到同一個Public IP的不同Port上面。

下圖簡單的描畫出NAT的做法。


在Router上面會建立一個NAT Table,當作內網與外網的資訊傳遞橋梁。基本上每次的連線,都是由位於Intranet的設備來啟動連線,以上面的例子來說,
  1. Host A要與位於 IP 162.100.7.34的伺服器連線,連線的封包,會自動交給位於 10.1.1.1 (Default Route)的NAT Router做處理。
  2. 位於Router上的NAT功能自動會找出一對內外網的Port,建立一個NAT Table。
  3. 然後Router代理Host A向Server發出連線請求,Server也對Router做出回應。
  4. Router再將資訊轉送給Host A。

如果Server沒有回應,NAT Table之中的連線紀錄,在一定的時間後,便會自動清除。這時候連線就會失敗。但這與 Host A上的Client沒有關係,Client會因為自已的Time Out而結束連線。Router一樣會在一段時間之後,回收表格的資訊。

NAT有四種不同的連線機制,必須要說明清楚:

1. Full Cone NAT



Full Cone 只是單純的做位址轉換,並未對進出的封包設限。一旦一個內部位址(Internal_IP_Addr:Port)對映到外部位址(External_IP Addr:Port)之後,所有發自Internal_IP_Addr:Port的封包都經由External_IP_Addr:Port向外傳送。任意外部主機也都能通過給External_IP_Addr:Port發封包到達Internal_IP_Addr:Port。以上圖來說,一但Client A透過NAT與Server A進行連線成功之後,Server B也可以透過同一個 IP Address與Port,與Client取的聯繫。

這方法可以用一個例子來做更詳細的說明。假設Client是CWMP Agent、Server A是STUN SERVER。SERVER B是ACS SERVER。

CWMP Agent先與STUN聯繫上,取得我目前使用的Public IP連線的IP Address與Port是139.223.200.200:1920。然後,STUN告訴ACS SERVER,有人在139.223.200.200:1920等你下命令,這時候ACS就可以與CLIENT取的聯繫了。第二種方式也可以由CLIENT得到自己的IP Address之後,趕快告訴ACS SERVER,麻煩到這個IP ADDRESS聯繫我。

2. Restricted Cone NAT (Address Restricted Cone)


Restricted Cone NAT 對於封包的進出稍加限制。從內部送出之封包的目的地 IP 位址會被記住,只有這些曾經收過這些封包的位址可以送封包進入NAT。由其他位址送進來的封包,都會被檔下。換言之, 只有收過NAT 內部送來的封包的地址才能將封包送入 Restrict Cone NAT 內。如果碰到這種類型的NAT,顯然上面的例子的一種連線方式就不可行,但是第二種方式還是可行的。

3. Port Restricted Cone NAT


Port Restricted Cone 對於封包進出比Restricted Cone 增加了一個限制, 從內部送出之封包的目的地的IP 位址及 Port Number 會被記住。 由外部送進來的封包,除了由那些接收過內部所送出 的封包的IP 位址及 Port Number 所送來的封包之外,都會被檔下。換言之, 只有收過NAT 內部送來的封包的地址及 Port Number 才能將封包送入 Restrict Cone NAT 內。簡單來說,同一個IP Address,如果Port不一樣,就不准進來。當然Server B無論如何都無法與Client連線。

4. Symmetric NAT


Symmetric NAT 在四種Cone NAT中最為嚴謹。前三種NAT在做位址轉換時,無論封包是送往何處, Client的地址,連到NAT後,都對應到同一個外部位址。但在Symmetric NAT內則每一內部位址,連線到不同的目的地,都會對應到不同的外部位址(當然Port也不同)。隨著網路安全的要求越來越高,使用此種NAT有越來越多的趨勢。

講到這裡,NAT的缺點就很明顯了,包含:
  • 每一份資料都要經過NAT做轉換,因此加重Router的Loading。
  • Delay必然會增加。
  • 外網的伺服器無法連接內網設備來讀取資訊。
  • 只要是外網發起的連線服務都不可行,Web/FTP … 
可以看到NAT如果不同,Client穿越NAT的方式也許會不同。這些解決方案稱之為NAT穿越技術(NAT Traversal),穿越技術一般會使用UDP來連線。

二、NAT穿越方案的選擇

我們目前想要解決的問題有三種: 
- TR069與ACS Server連接時所遇到的困難。
- 使用者來到外網之後,想要用APP來管理家中的網路裝置。
- 未來還有VOIP打電話的應用要處理。

目前,根據對NAT支援的不同,處理機制的不同,常用的NAT的穿越方法,一般有分為以下幾種:
  • ICE
  • STUN
  • TURN
  • UPnP
  • ALG
  • SBC

這些方案都有其各自的特點,不同的應用軟體,會使用不同的的技術。大致上面向家庭用戶的應用,選擇簡單的NAT穿越方案,包含STUN、TURN、ICE三種。

大致上總結如下:
STUN 可以處理大部份的NAT問題。
TURN是STUN的加強版本,專門用來處理對稱型 的NAT穿越。
ICE 是 STUN與TURN的綜合體。

下面將集中討論最簡單的STUN。

三、STUN的流程機制

STUN是最簡單的架構。但常見的STUN其實還有兩個版本,比較舊的是RFC 3489 (叫做Classic STUN),後來又有RFC5389,稱之為New STUN。

事實上,這兩個東西都叫做STUN,事實上,完全不同,甚至連簡寫的意義都不同。

RFC 3489 (Classic STUN) = Simple Traversal of User Datagram Protocol (UDP) through Network address translators (NATs)
RFC 5389 (New STUN) = Session Traversal Utilities for NAT

在RFC 5389的規定中,RFC3489被定義為羽量級的工具,RFC3489在有幾個方面有所不足:
  1. IP 和 Port 有時可以作為Peer來進行通信,有時則不能,Classic STUN沒有提供準確的方法來處理這些問題。
  2. Classic STUN的演算法對多層NAT可能發生錯誤。
  3. Classic STUN存在安全性漏洞,駭客會利用某些 Port 重新映射時,進行位址或者Port的竄改。
根據RFC 5389對STUN所執行的增加功能包括:

• 用於ICE連接支援 (MMUSIC-ICE)
• 用於用戶端的初始化連接 (SIP-OUTBOUND)
• NAT行為發現 (BEHAVE-TURN)。

STUN 的用途簡單來說,就是要解決使用非法IP的內網程式(稱之為Client A),要使用位於路由器上面的NAT功能,將這個位於內網的程式(Client A),能正確的連接到外網的服務程式(下面的例子稱之為Client B)。

下面這個圖,簡單的說明一下 STUN 的作法:


但是上面的例子,只是讓Client找到了自己的外網連線IP Address與port。如果加上雲端應用程式,行為可以使用下圖來表示:


上圖當中,描述了連線的四個步驟:
  1. Client (位於內網的程式)內網程式通過NAT對STUN(STUN位於外網的Public IP)發出請求。
  2. STUN Server 使用UDP,預設埠是3478,送出一個回應。回應的訊息當中,包含了MAPPED-ADDRESS、RESPONSE-ORIGIN、OTHER-ADDRESS和XOR-MAPPED-ADDRESS這四個參數。為了支持NAT的映射和過濾行為機制,STUN伺服器必須支持兩個公網IP位址和兩個不同的埠,分別稱之為主訊息位址和可選訊息位址。
  3. 第三步,Client對位於外網的Signaling Server發出訊息,Signaling Server會將Client所使用的外網位址(IP Address)和連接埠(Port)資訊通知Server。
  4. 於是Server就可以使用這資訊對Client 發送資訊。其實也是分為兩段,Server先對NAT路由器發送訊息,路由器的NAT再轉發到Client 的Local IP/Port。

2020年7月25日 星期六

PRPL的Easy Mesh(一): 系統架構簡介

prplMesh 是Wi-Fi聯盟內定支援的開源 (Open Source)實作,所以如果要通過 Easy Mesh 1.0的認證,最好就是直接移植這個平台。平台的原始碼主要來自於Intel的貢獻,目前依然由Intel做為主力,持續開發當中。

以下共有六組開源程式在  https://github.com/prplfoundation 共有六個目錄
  • prplMesh-manifest:
    • 起始點,一些文件,還有未來將要開發的一些東西。
  • prplMesh framework:
    • Local message bus (IPC機制), 包含一堆服務的介面: platform, transport, management, topology, logging, CAPI:
  • prplMesh-common libraries (工具的基礎程式庫)
    • TLV factory, controller management, platform, WLAN, plugins
  • prplMesh-agent:
    • Agent程式碼,內部與廠商程式供通用的API與介面(TLV/CMDUs)。
  • prplMesh-controller:
    • 資料庫、控制器上執行的微工具(Micro-service task pool):例如band-steering, mobility, channel-selection, network map, 統計資訊(stats),...等等。
  • prplMesh-tools:
    • Build Code的工具、安裝程式、klocwork static code analysis, 等等。
基本上,我想分為幾個部分來寫,這一篇是簡單先看一下系統的架構,之後就依照功能的分類,做細部的介紹。

先看一下下面的圖好了,這張圖其實把prplMESH的程式架構寫得很清楚:


Easy Mesh的架構稱之為Multi-AP,就是家裡面會有好幾個Wi-Fi Access Point,這些系統概分為三個角色:
  • Multi-AP Framework
  • Controller
  • Agent
Framework與Controller都常是合在一起的執行的。或是合稱為Controller也沒有關係,但是因為Framework的架構很大,為了討論方便所以單獨拿出來成為一個大的模組。

基本上只會有一個Controller,但是每一台的Access Point上面都會有Agent來執行。Controller與Agent可以在同一台設備上,也可以在不同的設備上。習慣上,會在最靠近Router的那台裝置上執行Controller,但也有人建議是在效能最好的那台來執行Controller。

prplMesh 具有極佳的移植性,所以她建立了一些API,廠商只要把API搞定,基本上,移植工作就完成了。上圖之中有用黃色標出來的就是這些移植用的API。

哈!哈!這裡用了一些SDN的術語:
  • 南向系統介面 (Southbound API):Mesh 與 Infrastructure Layer 溝通的介面,簡單說就是Mesh與作業系統連接的API。
  • 北向系統介面 (Northbound API):這是 Framework 與 Controller連接的介面。
  • 西向系統介面(Westbound API):Framework與作業系統連接的API。
當然大部分的Wi-Fi AP都是建立在Linux系統之上,所以最底層與Linux連接的部份是Wi-Fi Driver(nl80211)與Ethernet Driver,連接的API幾乎都是用標準的Socket。

此外,Agent 在 Wi-Fi 上的操作,依然是使用 Linux 平台上標準的 hostapd 與 wpa_supplicant。

如果畫成傳統的Layer的架構,可以變成以下的圖形:


上圖就大架構而言,也許清楚了一些。上圖當中,Distribution Management主要是系統更新用的。Platform就是與作業系統有關係的API。其他兩個粉紅色的是Daemon。這都是廠商需要提供的。

在Multi-AP的方塊當中,有兩塊叫做1905.1的模組,可能各位看倌比較陌生,下面簡單介紹一下。

1905.1是IEEE訂立的標準,主要在家庭網路當中,不同的網路實體層可以透過一個標準的Protocol 來交換訊息。

1905.1沒有改變任何底層網路協定的行為或是實作方式,所以可以與現有的TCP/IP網路相容。

1905.1主要的標準,是裝置與裝置之間使用CMDU(Control Message Data Unit)交換資訊。CMDU定義了一些標準的訊息類型,例如Topology Discovery Message、Topology Notification Message、Topology Query Message、Topology Response Message、Link Metric Query Message、Link Metric Response Message等等。

訊息只是包裝成簡單的TLV(Type Length Value)格式來傳送,因此程式處理起來也非常簡單。

1905.1在MESH上面,提供兩個主要的應用:
  • 讓裝置利用群播(Multicast)的方式,建立家庭網路中,個裝置的網路拓撲邏輯(Network Topology),以及通知網路拓撲的改變(如有新的網路裝置增加,或是既有的網路裝置離線)。
  • 利用單一傳播(Unicast)方式,詢問鄰近裝置的狀態,例如鄰近裝置底下有幾個網路介面、網路介面的類型等資訊,也包含了底層彼此相連的網路介面連結狀態(Link State),如遺失封包的數量、傳輸封包的數量等。
看完上面的簡單的說明,簡單來說,如果具備以下幾樣東西,Easy Mesh的功能就已經差不多了:

-  IEEE 1905.1:用來在手機上面畫出拓樸圖,如果改變,也要改變,還有一些統計資料。
-  IEEE 802.11k, 802.11r、802.11v

另外一個好消息是Intel把他開發多年,原先想在物聯網上的大撈一票的,但希望始終是失望的雞肋產品:1905.1 原始碼給捐了出來。所以Framework當中最重要的拼圖就補齊了。

看到這裡,會不會有信心大增的感覺,其實這得不複雜,也不神祕,對吧!!! 接下來,就把需要界接的API,都在Layer的架構圖上,給他標示出來。



這張圖,如果上面的說明都有仔細看,紫色的縮寫就是這個連接用的API,也大致上可以看出這些API的功能。其中BML=BeeRocks Management Library當中,有一個奇怪的字"BeeRocks";前面不是有說,這程式是Intel捐出來的嗎! "BeeRocks" 就是 Intel 捐出平台的Code Name (中文可以叫做外號暱稱)。沒有甚麼特別的意思。"BeeRocks" 這字在程式的相關文件當中,出現的頻率可是蠻高的。


"BeeRocks" 原始來源是德國的餡餅,有包肉,也有包蘋果派。據說是先傳到阿根廷,再傳到美國。有人說俄羅斯傳到東歐,再傳美國的;在往前推,餡餅是漢朝就有的食物,蒙古人傳俄羅斯的。

接下來,用另外一個畫法說明一下三個大模組當中程式元件的關係。



這張圖是解釋Agent的大致運作,每台機器都會有一個Agent程式主控全場。此外每個Wi-Fi卡片都會有一個Radio Agent來對Wi-Fi AP做控制。

接下來是Controller的架構圖:


Controller由於需要紀錄的東西多,所以架構也複雜一些,同時有兩個小資料庫,記錄家庭網路中的一切資訊。基本上,手機的管控介面也是與這裡來連線做溝通。

接下來,就繼續依照以下的四個部份,做深入的探討:
- Framework
- Agent
- Controller
- User Interface


2020年7月18日 星期六

TR-069 初釋(續)

這是接續前篇的 TR-069 初釋  的文章,前面一定要看,不然會看不下去。

前面大致上已經交代過 TR-069、ACS與CPE之前是如何工作的? 同時也看過了 ACS 如何知道 CPE 有哪些參數可以提供的。所以這篇就要看如何讀取或設定這些參數。

四、ACS讀取CPE的資訊(GetParameterValues)

前面看過的是GetParameterNames,現在要看GetParameterValues,就是要讀出參數的值。先看例子,這是CPE對ACS的回應:

<soap:Body>
    <cwmp:GetParameterValuesResponse>
          <ParameterList soap-enc:arrayType="cwmp:ParameterValueStruct[1]">
                    <ParameterValueStruct>
                            <Name>Device.ManagementServer.URL</Name>
                            <Value xsi:type="xsd:string">http://someacs.tr69.com:9999/acs/</Value>
                    </ParameterValueStruct>
            </ParameterList>
        </cwmp:GetParameterValuesResponse>
</soap:Body>

CPE 要依照ACS要求的參數值,回傳Name/Value的對子給ACS。對子可以是完整(complete)、非完整(partial)或是混合的形式。

五、ACS設定CPE中的資訊 (SetParameterValues)

ACS用來對於設定CPE的參數。永遠都是完整路徑(Complete Path),ACS 發送設定如下:

<soap:Body>
    <cwmp:SetParameterValues>
        <ParameterList soap-enc:arrayType="cwmp:ParameterValueStruct[1]">
            <ParameterValueStruct>
                <Name>Device.ManagementServer.URL</Name>
                <Value xsi:type="xsd:string">http://someacs.tr69.com:9999/acs/</Value>
            </ParameterValueStruct>
        </ParameterList>
    </cwmp:SetParameterValuesResponse>
</soap:Body>

CPE 回應設定成功: 

<soap:Body>
    <cwmp:SetParameterValuesResponse>
         <Status>0</Status>
    </cwmp:SetParameterValuesResponse>
</soap:Body>

這裡回傳的Status Tag,在很多CPE回應ACS的呼叫當中 (諸如SetParameterValues, AddObject, DeleteObject與 Download) ,CPE Response的時候,都會用到“Status”這個參數。 

<Status> = “0”  代表說改變將會立刻被執行。
Status如果是“1”代表說改變將會在CPE重新啟動之後,才會被執行生效。注意這裡,如果是Reboot才會生效,代表沒有Reboot,設定就會不會生效。所以CPE與ACS之間,最好透過Status做溝通,ACS要決定CPE要不要立刻Reboot。例如設定完成之後,如果CPE回應"1",ACS也許要發送"Rebbot"命令給CPE。

六、GetParameterAttributes與SetParameterAttributes

CWMP 的GetParameterAttributes/SetParameterAttributes都可以有兩個XML屬性(attributes):Notification 與 Access List。
 
SetParameterAttributes RPC用來設定參數,有五個參數,包含:
  • Name :可以是完整路徑(Complete Path)或部分路徑(Partial Path)。
  • NotificationChange
  • Notification
  • AccessListChange
  • AccessList
直接看一下例子:

ACS 發送設定如下:

<soap:Body>
    <cwmp:SetParameterAttributes>
        <ParameterList soap-enc:arrayType="cwmp:SetParameterAttributes[1]">
            <SetParameterAttributesStruct>
                    <Name>Device.WiFi.SSID.2.Name</Name>
                    <NotificationChange></NotificationChange>
                    <Notification></Notification>
                    <AccessListChange></AccessListChange>
                    <AccessList soap-enc:arrayType="cwmp:string[0]"></AccessList>
            </SetParameterAttributesStruct>
        </ParameterList>
    </cwmp:SetParameterAttributes>
</soap:Body>

SetParameterAttributes RPC帶有5個參數。第一個是”NAME”,包含參數路徑,與GetParameterNames一樣,它可以是完整路徑(Complete Path)或部分路徑(Partial Path)。SetParameterAttributes中的Partial Path通常用於設置被動通知(Passive Notification)或刪除通知”Removing Notification)。如果裝置數量太多,又去設定Active Notification可能很危險,因此很多參數都會設成“canDeny”,意味著這些參數將會拒絕被設定為“Active Notification”,就是說設Active也沒有用。

接下來的參數是NotificationChange和Notification。 NotificationChange為true表示CPE應將Notification參數中的值進行設定;如果為false,則應該忽略Notification中的值。

“Notification”用於設定參數的通知規則。它是0到6的數字。0到2是基本通知機制,3到6是“輕量”通知。在TR-069中,當通過ACS以外的任何機制,更改用於通知的參數集時,將使用“4 VALUE CHANGE” 的事件代碼(Event code)。這些條件將使用SetParameterAttributes RPC來進行設置。

0到的基本通知機制,代表Active (2), Passive (1), or None (0)三個通知機制。說明如下:

0: 設定參數為None,“No” notification會移除任何之前所有通知設定,可以拒絕或忽略之前發出的“Forced Active”參數。後面還有詳細的討論。

1.設定參數為 Passive (被動):為“Passive”通知設置參數意味著,如果參數值更改,則CPE必須在其下一個通知ACS的RPC中,包括4 VALUE CHANGE事件和更改的參數值。它不會立即啟動連接,而是會在下一個最方便的時間(例如在定期通知期間或在連接請求之後)發送通知。

設置“Passive”(被動)通知,並不會拒絕任何參數,但是,對於為“Forced Inform(強制通知)” 或 “Forced Actiive(強制主動)”通知設置的參數,可以將其忽略。

2.設定參數為 Active (主動): 為“Active”通知設置參數意味著,如果參數值更改,則CPE必須立即啟動CWMP對話,以將更改通知ACS,包括4 VALUE CHANGE事件代碼和參數值,透過RPC通知CPE。根據CPE端的判斷,對於瞬態或經常更改的參數,可以拒絕激活通知的設置。例如,在“Uptime”參數上,設置”Active”通知,由於Uptime會不斷變化,將會導致無休止的CWMP會話!

這些參數不能更改或具有預設值的特性。在Data Model中定義的這些包括“Forced Inform”, “Forced Active”, 與 “Default Active” notification。
- ”Forced Inform”:參數是每個Inform RPC中,必須包含的參數。
- “Forced Active”:強制啟動通知參數,必須設定為”Active”通知,否則應忽略請求。
- “Default Active”:強制將屬性設為出廠時的預設值。

下兩個參數是AccessListChange和AccessList屬性。 AccessListChange具有與NotificationChange相同的目的。 CPE必須僅了解AccessList的“ Subscriber”的值,但是無論ACS設置了什麼,它都必須存儲該值。

CPE對於SetParameterAttributes Response 不包含任何參數。

GetParameterAttributes RPC非常簡單,並且像GetParameterValues一樣採用類似的ParameterNames參數。 GetParameterValuesResponse包含ParameterAttributeStruct對象的ParameterList數組,其中包括參數的名稱及其Notification和AccessList的值。

七、AddObject/DeleteObject

這個功能其實有些難以理解,雖然也找到例子,但還是不懂要如何運作? 我先隨便寫寫,以後如果弄得更清楚的時候,再來修改。

CPE數據模型中的“Object”是可以由ACS配置的功能性元素。使用SetParameterValues RPC配置對象的參數時,ACS可以使用AddObject RPC來創建一個Object到CPE中,並使用DeleteObject RPC將其刪除。

AddObject

下面是ACS發出AddObject的例子:

<soapenv:Body>
<cwmp:AddObject>
<ObjectName>InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.PortMapping.</ObjectName>
<ParameterKey>3544041</ParameterKey>
</cwmp:AddObject>
</soapenv:Body>

AddObject RPC具有兩個參數。第一個是Object名稱(Name),它必須包含一個Object的路徑;那是一個以“點”作為結尾的路徑。該Object自然必須是可以在CPE之中被創建的,並且在Data Model當中,已經開啟了允許寫入的權力。如果不是,則AddObject的要求,CPE會回應這是一個無效參數(Invalid Arguments)或無效參數名稱錯誤(Invalid Parameter Name error)。

就像SetParameterValues中一樣,第二個參數是ParameterKey,用於將此RPC與ACS內部關聯的策略相關聯。CPE收到此值後,必須要更新CPE中Device.ManagementServer.ParameterKey的值。

當Object創建時,所有相關的參數都必須設置為預設值。如果無法完成此操作,則AddObject RPC必須失敗。

下面是CPE的回應例子:

<SOAP-ENV:Body SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<cwmp:AddObjectResponse>
<InstanceNumber>4</InstanceNumber>
<Status>0</Status>
</cwmp:AddObjectResponse>
</SOAP-ENV:Body>

AddObjectResponse包含兩個參數。 InstanceNumber和Status。 

Status參數的操作與SetParamterValues中的操作相同。如果將其設置為0,則可以認為Object已被添加並已經生效。如果將其設置為1,則CPE需要執行一些其他操作才能完成更改(通常是CPE重新啟動)。

上面例子中Object會回應一個數字(上例中是"4")的InstanceNumber。這是一個unsigned Int,可以採用1到2 ^ 32-1之間的值。這數字用於標識Object,指定後該編號就無法再更改,並且在該類型的現有Object List中必須唯一。刪除Object後,新的Object不應使用先前分配的標識符號。

DeleteObject 

DeleteObject RPC使用與AddObject相同的兩個參數。但是,ObjectName中的參數路徑必須以特定的實例標識符結尾,後面用“點”來結尾。這表示要刪除的特定對象。

DeleteObjectResponse只有一個參數”Status”,使用方式與前面的規則類似。

八、Reboot

ACS使用Reboot RPC來要求CPE重新啟動。

Reboot RPC僅使用一個參數 CommandKey。 該CPE的回應則不包含任何參數。文件上說,基本上不應該強迫CPE升級軟體,又重新開機,但是在除錯的過程中,遠端重開機的確是常見的行為。

CPE重啟後,必須盡快啟動與ACS的對話(Session)。 該對話中的Inform RPC包含“1-BOOT” Event,還包含 “M Reboot” Event。 這告訴ACS會話是由於設備重新啟動,是由於ACS之前的Reboot要求而進行的(此重新啟動是由於ACS發出Reboot RPC所致)。

CPE開機後,所發出的訊息如下:

<soap:Body>
    <cwmp:Inform>
            <Event soap-enc:arrayType="cwmp:EventStruct[1]">
            <EventStruct>
                    <EventCode>1 BOOT</EventCode>
          </EventStruct>
           </Event>
           <EventStruct>
    <EventCode>M Reboot</EventCode>
<CommandKey>123456</CommandKey>
          </EventStruct>
    </cwmp:Inform>
</soap:Body>

ACS另外一個讓CPE進入可以完全控制的狀態的是用FactoryReset。 這是一個Optional的RPC,Response 沒有參數,應謹慎使用,因為“FactoryReset”不是一個明確定義的狀態,通常只能在已經完整測試過的環境中才能使用。

九、Download

ACS要求CPE進行一個下載 (download),通常是因為

1. 新版本的Firmware更新。
2.某一個檔案需要跟新,或是管理網頁需要更新。

ACS的命令可以要求立刻執行或是等一下再執行。

更新完成之後,CPE要用“M Download” and “7 TRANSFER COMPLETE” events,回應ACS。
CPE必須要更新完成之後,才能通知ACS。

十、Faults

如果失敗的話,SOAP要負責處理,所有的失敗原因編號,可以參考A.5 of TR-069a2的A.5。 
CPE的失敗代碼(fault codes)是9000系列。
ACS的失敗代碼(fault codes)是8000系列。

結尾

還有一些RPC我們沒有介紹:
  • Upload – triggers an upload by the CPE to a specified location
  • ScheduledInform – schedules a CWMP session for a particular time and triggers the “3 SCHEDULED” event
  • FactoryReset
  • GetAllQueuedTransfers – returns the current uploads/downloads waiting to complete
這大家可以自己找文件看一下;如果你有仔細看我這兩篇文章,再回頭看英文版本,應該就會非常清楚TR-069工作的原理。文件的位置在下面的URL,有了概念之後,再看這篇文章,真的不難。

https://www.broadband-forum.org/technical/download/TR-069_Amendment-5.pdf

此外,我也沒有介紹Data Model的部份。因為這部份的資料也是非常的多,但是就是把許多的CPE參數,依照不同的裝置特性,做了一個詳細的規範:

TR-098 Amendment 2 Internet Gateway Device Version 1.1 Data Model for TR-069 (2008)
TR-106 Amendment 7 Data Model Template for TR-069-Enabled Devices (2013)
TR-181i2a9 Device Data Model for TR-069 (2014)
TR-143 Enabling Network Throughput Performance Tests and Statistical Monitoring (2015)

暫時就寫到這裡了!!!















2020年7月4日 星期六

TR-069 初釋

零、一些專有名詞

雖然沒甚麼,但還是稍微說一下:
  • XML – The eXtensible Markup Language
  • SOAP – The “Simple Object Access Protocol”; 基本上是用XML來描述兩個網路程式之間的呼叫。 
  • CPE – Customer Premises Equipment的簡寫,基本上就是家裡使用的聯網設備的通稱。
  • ACS – Auto-Configuration Server, Server端軟體,用來管理CPE。
  • Data Model – 一組物件的定義,好在CPE與ACS之間傳送資料。基本是Broadband Forum所定義的,也有可以做一些廠商的擴充。
  •  RPC – Remote Procedure Call. 利用SOAP當參數,來在兩個裝置之間,做Function Call。

一、何謂TR-069

TR-069是Broadband Forum 定義的一組標準參數,任所有的家庭聯網裝置,都可以透過這個規定的協定,把一些裝置的資訊,送交給ACS SERVER來進行管理。

TR-069的通信協定稱之為 CWMP,下面這張圖是Broadband Forum畫的,描述TR-069想要做的事情:
CWMP 既然是網路的產品,那就要遵循七層的概念了。真是匠氣十足啊!


此外,這裡有許多的參考文件,其實這篇的來源,也是整理一下這些文件的內容:

TR-069: 最主要的CWMP協定說明:
- Currently Amendment 2, which is CWMPv1.1
- Defines protocol, message structure, session rules, and RPCs
- Annexes deal with NAT traversal and association of gateways to LAN devices

TR-106
-  XML Schema definition and common objects for Device Data Models

TR-098
- Device Data Model for Internet Gateway Devices

XML(eXtensible Markup Language)是TR-069的基本資訊傳送格式,XML透過SOAP,允許Client/Server的應用程式,利用RPC (Remote Procedure Calls)呼叫來傳送資料。

XML “Schema” 是一段特殊的XML用來描述格式 (.xsd),Schema 可以用 namespaces 來繼承上層的 Schema 定義。


上面圖中紫色的部分,就是繼承的namespace。

TR-069文件中的section A.6定義了RPC Schema。Data Models是 “schema-like” 的XML文件,依照TR069 定義的使用情境來描述物件與參數。TR-106之中,描述了CWMP Data Model Schema,通常可以在以下的檔案當中描述 cwmp-datamodel.xsd。

最新版是1.6.1,可以在以下https://cwmp-data-models.broadband-forum.org/之中找到。

下面有TR-143 : Data Model的例子 (Performance Test Objects 與參數(Parameters))位於以下URL:
https://cwmp-data-models.broadband-forum.org/tr-143-1-1-0.xml
只拿兩行給大家看一下:

<parameter base="Interface" access="readWrite">
     <description action="replace"> {{reference}} The IP-layer interface over which the test is to be erformed. Example: Device.IP.Interface.1 If {{empty}} is specified, the CPE MUST use the interface as directed by its routing policy (''Forwarding'' table entries) to determine the appropriate interface.     
    </description>
</parameter>
<parameter base="DownloadURL" access="readWrite">
      <description action="append"> Note: For time based tests ({{param|TimeBasedTestDuration}} > 0) the ACS MAY add a hint to duration of the test to the URL. See {{bibref|TR-143a1|Section 4.3}} for more details. </description>
</parameter>

接下來是SOAP(The Simple Object Access Protocol)。SOAP是一段XML,定義schema,用來描述兩個端點之間要傳送的資訊。

RPC (Remote Procedure Call) 是傳送SOAP的應用程式,具備以下功能:
- 描述兩端點之間的傳送方式與傳送的參數。
- 描述回傳資訊的樣子。
- 描述傳送失敗的原因。

簡單來說,CWMP使用RPC的應用程式,利用SOAP的格式,傳遞 失敗(faults)、呼叫與回應(call/response)的格式、訊息ID(message ID)。

二、RPC的例子

下面看一下一個真實的RPC,他的Message Structure是甚麼樣子?

<soapenv:Envelope xmlns:soap=http://schemas.xmlsoap.org/soap/encoding/ 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
     xmlns:soapenv=http://schemas.xmlsoap.org/soap/envelope/ 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Header>
          <cwmp:ID soapenv:mustUnderstand="1">1323392</cwmp:ID>
    </soapenv:Header>
    <soapenv:Body>
         <cwmp:SetParameterValues>
         <ParameterList soap:arrayType="cwmp:ParameterValueStruct[1]">
                  <ParameterValueStruct>
                             <Name>InternetGatewayDevice.ManagementServer.URL</Name>
                             <Value xsi:type="xsd:string">http://someacs.cwmp.org/path/</Value>
                   </ParameterValueStruct>
          </ParameterList>
         <ParameterKey>1323392</ParameterKey>
         </cwmp:SetParameterValues>
    </soapenv:Body>
</soapenv:Envelope>


先看第一段CODE,是SOAP 信封標記。說明SOAP與CWMP Schema在Broadband Forum中的定義。 







 


SOAP的表頭包含交易的信息。在這個例子中,它包含CWMP Message ID。








SOAP Body 包含RPC Call/Respone的參數。這個麗姿之中是使用SetParameterValues RPC。這RPC 的SOAP參數。定義了一個Array,接下來的 <ParameterValueStruct> 描述了第一組參數的名稱與值。

再下面的<ParameterKey>定義了Key的值為1323392。


















看完了RPC Call的參數,接下來看一下,CPE與ACS之中連線的模型是甚麼模樣?



上面的十個步驟完整的說明了整個API呼叫的動作:
  1. Open Connection: 基本上,CPE永遠是啟動連線的一方。但是ACS可以用”Connection Request” 請CPE啟動連線。TR069永遠都是用SSL來連線。 
  2. HTTP Post: CPE收到ACS ”Connection Request” 便啟動連線。詢問ACS想要甚麼資訊? 
  3. HTTP Response: ACS 用 InformResponse 回應希望CPE做的事情。 
  4. HTTP Post: 在這個例子當中,CPE 用一個空的https post回應ACS,資訊收到。
  5. HTTP Response: ACS 用 GetParameterValues RPC call CPE。 
  6. HTTP Post: CPE 用 GetParameterValuesResponse RPC 將資料送給ACS。 
  7. HTTP Response: ACS可以繼續在這個Session之中,要求CPE做事,這裡是用 SetParameterValues RPC call CPE。 
  8. HTTP Post: CPE 用 SetParameterValuesResponse RPC 將資料送給ACS。 
  9. HTTP Response: ACS發一個空的https,結束CWMP Session。 
  10. Close Connection: CPE 發送 “successfully terminated”,結束連線。 
上述連線的第一步就是"Connection Request" 

基本上,CPE永遠是啟動連線的一方。但是ACS可以用”Connection Request” 請CPE啟動連線。TR069永遠都是用SSL來連線。 ACS的“Connection Request”只是簡單的用 HTTP Get 發到 CPE (at an arbitrary URL/port set by the CPE)。

因為CPE是發動方,那CPE要如何找到ACS? 大致上,有以下幾種方法:
  1. CPE在Configuration檔案中,設定預設的ACS的位置(URL)。
  2. 應運商(ISP)透過DHCP option 60 欄位當中的 dslforum.org 字串,讓DHCP Server辨識這個CPE是否需要納管? 如果是的話,DHCP server 會發送 DHCP ACK (確認) 的封包,並在 Option 43之中,加入ACS URL的資訊給CPE。
  3. 在系統一開始設定的時候,CPE連線到ACS,也就是先要到ACS去註冊自己的CR URL。
當然CPE也不能隨便讓別人來管理,所以Authentication就非常重要,ACS向CPE發起連線的時候,大致要符合以下原則:
  1. 連接請求必須為HTTP GET 1.1,這個URL必須要用計算產生,CPE可以驗算回來,每個CPE都是唯一的。
  2. 不能用HTTPS,只能用HTTP。
  3. HTTP GET1.1之中必須要空白。
  4. 連線失敗,要Sleep數十秒,再Retry,以免被誤認為 DOS攻擊。
  5. 不得終止正在進行的Session。
  6. 如果隨便就可以連線,也太不安全,所以要先Authentication,TR069可以用基本的HTTP Digest來Login,也可以用憑證(Certification)的方式來做認證。
  7. 雙向都要認證:
    • CPE 要認證 ACS 的 "Connection Requests"。
    • ACS 要認證 CPE的 "Session Initiation"。
那CWMP v1.1之中的RPC呼叫有哪些? 下面大致用CWMP v1.1 來說明一下,目前CWMP1.1已經有點舊了,新版1.1.4有更多的定義,但是v1.1是目前最基本的協定,大致上CPE/ACS都會支援:

規格之中分為兩部分,第一部分  CPE 要接受的 Methods (CPE要處理的Request):
  • GetRPCMethods
  • SetParameterValues
  • GetParameterValues
  • GetParameterNames
  • SetParameterAttributes
  • GetParameterAttributes
  • AddObject
  • DeleteObject
  • Reboot
  • Download
  • Upload
  • FactoryReset
  • GetQueuedTransfers
  • GetAllQueuedTransfers
  • ScheduleInform
  • SetVouchers
  • GetOptions
ACS端要處理Methods比較少,如下:
  • Inform
  • GetRPCMethods
  • TransferComplete
  • AutonomousTransferComplete
  • RequestDownload
  • Kicked
前面連線步驟的第三步:HTTP Response: ACS 用 InformResponse 回應希望CPE做的事情。這是最重要的RPC,每次連線ACS都要先用這個RPC來呼叫CPE。這個連線的內容包含:
  • 這次連線的原因。
  • 選用的Data Model (Forced Inform)與需要的參數列(Parameter List)
  • ACS用來通知CPE的參數。
ACS會送出InfromResponse,來完成這筆RPC。下面是一個InfromResponse RPC的例子:

<soapenv:Envelope 
  xmlns:cwmp="urn:dslforum-org:cwmp-1-0"             xmlns:soap="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
  <soapenv:Header>
<cwmp:id soapenv:mustunderstand="1">1</cwmp:ID>
  </soapenv:Header>
  <soapenv:Body>
        <cwmp:informresponse>
    <maxenvelopes>1</maxenvelopes>
        </cwmp:informresponse>
  </soapenv:Body>
</soapenv:Envelope>
<soap:body>
  <cwmp:inform>
    <deviceid>
        <manufacturer>Tatung Technology Inc.</manufacturer>
        <oui>000A73</oui>
        <productclass>IGD</productclass>
        <serialnumber>123456789</serialnumber>
    </deviceid>
    <event soap-enc:arraytype="cwmp:EventStruct[1]">
        <eventstruct>
               <eventcode>2 PERIODIC</eventcode>  
               <commandkey></commandkey>
        </eventstruct>
    </event>
    <maxenvelopes>1</maxenvelopes>
    <currenttime>2020-01-23T01:49:14+00:00</currenttime>
    <retrycount>0</retrycount>
    <parameterlist soap-enc:arraytype="cwmp:ParameterValueStruct[6]">
       <parametervaluestruct>
           <name>Device.DeviceSummary</name>
           <value xsi:type="xsd:string"></value>
       </parametervaluestruct>
       <parametervaluestruct>
           <name>Device.DeviceInfo.HardwareVersion</name>
           <value xsi:type="xsd:string">3.1</value>
       </parametervaluestruct>
       <parametervaluestruct>
           <name>Device.DeviceInfo.SoftwareVersion</name>
           <value xsi:type="xsd:string">1.1.5.13</value>
       </parametervaluestruct>
       <parametervaluestruct>
           <name>Device.ManagementServer.ConnectionRequestURL</name>
           <value xsi:type="xsd:string">http://10.0.0.5:1234/</value>
       </parametervaluestruct>
       <parametervaluestruct>
           <name>Device.ManagementServer.ParameterKey</name>  
           <value xsi:type="xsd:string">null</value>
       </parametervaluestruct>
       <parametervaluestruct>
           <name>Device.LAN.IPAddress</name>  
           <value xsi:type="xsd:string">192.168.1.1</value>
       </parametervaluestruct>
     </ParameterList>
   </cwmp:Inform>
</soap:Body>

注意上面的例子當中,有一個Events Tag的參數。這個參數是定義ACS與CPE之間的連接的Event。這是非常重要的定義;其實所有溝通的組合就是在做這些與先定義的Event Tag"

<Event soap-enc:arrayType="cwmp:EventStruct[1]">
           <EventStruct>
                   <EventCode>2 PERIODIC</EventCode>
                   <CommandKey />
          </EventStruct>
</Event>

<Event Code> Tag之中說明一個或數個事先定義好的連線理由(CPE 啟動 Session的原因),整理如下:

Session CPS向ACS發起連線的時機
“0 BOOTSTRAP”CPE第一次要與ACS連線的時候。
1 BOOTCPE開機或重新啟動的時候(REBOOT)
2 PERIODIC設定一個固定的間隔,例如每24小時一次。
3 SCHEDULED通知一排程( Schedule Inform Method)
4 VALUE CHANGE每當修改參數的時候,例如版本更新、IP address改變、Provisioning Code
5 KICKED有事發生,想要連接ACS,報告一些事。
6 CONNECTION REQUESTCPE接收到ACS的連線請求時。
7 TRANSFER COMPLETE下載完成時。
8 DIAGNOSTICS COMPLETE完成自我偵錯。
9 REQUEST DOWNLOAD啟動軟體升版或下載。
10 AUTONOMOUS TRANSFER COMPLETE自動傳送完成
M Reboot
M Scheduled Inform
M Download
M Upload
其他也可以有廠商或營運商自訂的Events Tag。

上表當中,有M開頭的Event Tag沒有解釋,這裡大致說一下是甚麼意思?

這四個有M開頭的Event,通常是說前面有一個Event,這個Event是延續前面的Evernt。舉例來說:
  • "1 BOOT” 與 “M Reboot” : 前面通知CPE要Reboot,CPE Reboot之後,用”M Reboot”告訴ACS SERVER,已經完成Reboot。
  • “7 TRANSFER COMPLETE” 與 “M Download” : ACS 發 “M Download” 啟動一個下載,完成之後,用“7 TRANSFER COMPLETE” 通知ACS已經下載完成。

三、ACS 叫 CPE 做事

ACS 可以叫 CPE 做那些事情? 這裡再重複一下:
  • 詢問 CPE 支援那些 Method。
  • 詢問 CPE 支援那些 Object或那些參數(Parameter)。
  • 產生或刪除物件(Object)。
  • 讀取或編輯一些參數。
  • 讀取或編輯一些參數的屬性。
  • Reboot CPE
  • 請CPE 下載一些檔案,或是一些 Firmware Image。
但是ACS也不知道CPE是否有支援這些功能,因此可以用 GetRPCMethods詢問。下頁就是一個詢問的例子

ACS問到,你有支援那些功能啊?

<soapenv:Body>
     <cwmp:GetRPCMethods/>
</soapenv:Body>

CPE就回答說,我支援以下這一堆:

<soap:Body>
    <cwmp:GetRPCMethodsResponse>
        <MethodList soap-enc:arrayType="xsd:string[12]">
                <string>GetRPCMethods</string>
                <string>SetParameterValues</string>
                <string>GetParameterValues</string>
                <string>GetParameterNames</string>
                <string>SetParameterAttributes</string>
                <string>GetParameterAttributes</string>
                <string>AddObject</string>
                <string>DeleteObject</string>
                <string>Download</string>
                <string>Reboot</string>
                <string>ScheduleInform</string>
                <string>FactoryReset</string>
        </MethodList>
    </cwmp:GetRPCMethodsResponse>
</soap:Body>

ACS Server上面其實要記錄這些 CPE 對於CWMP的處理能力。

製造商可以建立自訂的RPC、Events、Objects與參數(Parameters),可以使用以下格式:

            X_{OUI of Company}_{NameOfNewThing}
            例如: X_012345_MyMethod

接下來,ACS就要問:原來你(CPE)可以設定或讀取一些參數啊? 那你有哪些參數可以讀取啊? 

這個Method就叫做GetParameterNames,如果寫的更科技一些,就說ACS用來取得CPE目前的Objects與 Parameters。CPE就要報告裝置的特性與參數。例子如下:

ACS問道:

<soapenv:Body>
      <cwmp:GetParameterNames>
            <ParameterPath>
                  Device.LAN.IPAddress
            </ParameterPath>
            <NextLevel>
                   0
            </NextLevel>
      </cwmp:GetParameterNames>
</soapenv:Body>


注意這裡有一個參數叫做 <NextLevel> ,他可以是True (1),或是False (0)。
如果如果Next Level = “True”, CPE回應的parameters直接是在“.”之下,沒有其他的sub-objects。
如果Next Level = “False”, 所有的parameters, 與sub-object已經完全回傳,沒有更多的參數。以上面的例子來說,ACS是問 Device.LAN.IPAddress 這個資料能不能回答啊? 

CPE就用GetParameterNamesResponse答回說:

<soap:Body>
  <cwmp:GetParameterNamesResponse>
        <ParameterList soap enc:arrayType="cwmp:ParameterInfoStruct[1]">
               <ParameterInfoStruct>
                     <Name>Device.LAN.IPAddress</Name>
                     <Writable>0</Writable>
               </ParameterInfoStruct>
        </ParameterList>
      </cwmp:GetParameterNamesResponse>
</soap:Body>

CPE回答說,有的,可以提供查詢,但是不接受ACS SERVER的遠端設定( Writable = 0)。

這裡要帶出一個完整路徑或是非完整路徑(complete path 或 partial path)的觀念。這裡適用於所有”GetXXXXX” RPC與 SetParameter RPC之中有關於參數屬性的描述。

上例當中的“ParameterPath” tag可以是“Complete” 或是 “Partial” 路徑(path)。

例如“Device.LAN.IPAddress”就是一個 “Complete” 路徑(完整的路徑。

Path路徑使用“.”作為結束,所以上例當中,如果寫成“Device.LAN.”,就是說這是一個“Partial”路徑,是說所有的Object與參數都會在一個”tree”以下:

舉例而言: “Device.LAN.”,意思是起提供在” Device.LAN.”以下的所有參數。CPE可以用一個ARRAY回傳給ACS。

所以NxetLevel 與 “Complete Path” 或是 “Partial Path” 的概念加在一起,就產生了不同的查詢結果,下面有一個比較長的例子:

先看NextLevel =1 ,就是不需要往下查,只要回答一層就可以了。ACS問道:

<soapenv:Body>
    <cwmp:GetParameterNames>
        <ParameterPath>Device.LAN. </ParameterPath>
        <NextLevel>1</NextLevel>
    </cwmp:GetParameterNames>
</soapenv:Body>

CPE回答:

<soap:Body>
<cwmp:GetParameterNamesResponse>
      <ParameterList soapenc:arrayType="cwmp:ParameterInfoStruct[9]">
     <ParameterInfoStruct>
                <Name>Device.LAN.Stats.</Name>
                <Writable>0</Writable>
     </ParameterInfoStruct>
     <ParameterInfoStruct>
                <Name>Device.LAN.IPPingDiagnostics.</Name>
                <Writable>0</Writable>
     </ParameterInfoStruct>
     <ParameterInfoStruct>
                <Name>Device.LAN.TraceRouteDiagnostics.</Name>
                <Writable>0</Writable>
      </ParameterInfoStruct>
        ...
      <ParameterInfoStruct>
              <Name>Device.LAN.MACAddress</Name>
              <Writable>0</Writable>
      </ParameterInfoStruct>
      </ParameterList>
   </cwmp:GetParameterNamesResponse>
</soap:Body>

注意沒有? CPE 回應了一個 Partial Path,意思是這第一層的目錄之下,還有許多的資訊可以提供。這時候有九個參數可以查詢。

好! 如果用 <NetLevel = 0 (TRUE)> 來問呢? 就是麻煩把所有資訊都提出來吧!!! ACS 的呼叫如下:

<soapenv:Body>
    <cwmp:GetParameterNames>
        <ParameterPath>Device.LAN. </ParameterPath>
        <NextLevel>0</NextLevel>
    </cwmp:GetParameterNames>
</soapenv:Body>

這時CPE回答如下:

<soap:Body>
   <cwmp:GetParameterNamesResponse>
       <ParameterList soapenc:arrayType="cwmp:ParameterInfoStruct[35]">
            <ParameterInfoStruct>
                    <Name>Device.LAN.</Name>
                    <Writable>0</Writable>
            </ParameterInfoStruct>
            <ParameterInfoStruct>
                    <Name>Device.LAN.AddressingType</Name>
                    <Writable>0</Writable>
            </ParameterInfoStruct>
              ...
                        <Name>Device.LAN.Stats.</Name>
                        <Writable>0</Writable>
            </ParameterInfoStruct>
            <ParameterInfoStruct>
                        <Name>Device.LAN.Stats.ConnectionUpTime</Name>
                        <Writable>0</Writable>
            </ParameterInfoStruct>
            <ParameterInfoStruct>
                        <Name>Device.LAN.Stats.TotalBytesSent</Name>
                        <Writable>0</Writable>
            </ParameterInfoStruct>
            <ParameterInfoStruct>
                        <Name>Device.LAN.IPPingDiagnostics.</Name>
                        <Writable>0</Writable>

有35個參數,一層一層的回應過來。如果是Partial Path,基本上是沒有具體數值的,還是要讀到絕對路徑,才請CPE讀出或設定數值。

因為太長了,所以另外寫到下一篇 (TR-069 初釋(續))。

下一篇會繼續看,如何讀出參數與設定參數,還有重開機、升版等等的具體作法。












































2020年6月28日 星期日

5G Wi-Fi 的 DFS (Dynamic Frequency Selection) 頻道

早在開放 5GHz無線電頻段給Wi-Fi使用之前,該頻段早已經使用於飛機雷達與氣象雷達,所以就規定 5GHz不能影響到雷達的收訊。

雷達? 大家一定會奇怪,哪來的雷達? 其實台北濱江路355號就有一個,裡面有沒有5 GHz的雷達我是不知道,但是這種大白球,裡面就是雷達。

  
我家對面的野柳岬的山頂也有一個國軍的雷達站;聽說如果有直升機由頭上經過,裡面也有5 GHz的雷達信號。

不過說家裡的 Wi-Fi 基地台會干擾雷達,我是不相信的。因為家里的Wi-Fi信號,如果能打那麼遠,那手機的基地台早就廢了,大家直接用Wi-Fi不就算了。

算了,政府總是想的多一點,超前部署嘛! 大家的做產品的一定要順時鐘,不然認證不會過。就是說不能賣啦!

如果要能使用這些雷達頻道就要有 DFS  (Dynamic Frequency Selection)的功能:
  1.  AP 開機的時候,如果想使用CH 52 - CH140,先要掃描一分鐘,如果沒有發現雷達訊號,在可以開啟這個CHANNEL來使用。
  2. 如果選擇 CH120 - CH 128來使用,必須要掃描10分鐘來確保這地區沒有氣象雷達在使用這個頻道。
  3. 如果前面兩步驟都沒有發現雷達信號,你還是要繼續一面用,一面掃,萬一發現有雷達訊號來了(例如直升機飛過去),這時候AP 要關閉頻道30分鐘,才能重新開啟。 
所以5G Hz Wi-Fi之中,只有最低的四個通道36–48(U-NII-1)和最高的奇數通道149–165 (U-NII-3)不需要DFS監控。

如果你有安裝 Wi-Fi Analyser 這個Apps,你會發現大家的AP,似乎都設在最高與最低的兩個通道上。中間的部分,大家怕麻煩,或是AP根本沒有DFS功能。所以DFS頻段完全沒有人在使用 (浪費啊!!!)。

這時有同學舉手,我們家的 Wi-Fi AP 都有有沒有支援 DFS 功能呢? 答案是: 有的。


上面是之前的信號,當DFS信號掃過,原先在Channel 100, 116的幾個頻道都自動閃開了。這時候變成下面的狀況。













2020年6月26日 星期五

有關於Wi-Fi 的基礎知識(一)

先由Ethernet談起,Wi-Fi就是一種Ethernet的技術,這技術的原理稱之為CSMA/CD(Carrier Sense Multiple Access/Collision Detection,即載波多重存取/碰撞偵測)。簡單來說,就是利用線來當作BUS,所有的裝置都接在BUS上面。每個裝置都可以互相通信。

但是大家不能一起講話,那不就亂了。如果A要與B說話,A就先舉手,這時候大家就不說話,讓A與B講話。講完之後,大家再舉手,快的人會搶到講話的權利。

大家都認為Ethernet是全錄在1974年發明的,但其實1960年夏威夷大學就用電波為載體,發表了類似CSMA/CD的技術。全錄只是把這個技術應用到同軸電纜上面。

全錄取名Ethernet,代表他知道這技術的來源,因為乙太(Ether)這個名詞在物理上有重大意義。

乙太是馬其頓哲學家亞里斯多德(西元前384年-前322)所設想的一種物質,為五元素(水、火、土、空氣、以太)之一。

十九世紀科學家了解光也是一種電磁波,但是波要介質才能傳播,但太空沒有空氣如何傳播? 噢!!! 原來太空中有一種東西叫做"乙太",所以光得以傳播。而且亞里斯多德在西元前三百年前就知道了。亞里斯多德肯定是外星人。

扯太遠了,後來發現並沒有"乙太"這種物質在外太空,至少到現在為止還沒有發現。只發明了Ethernet。而且Wi-Fi技術才是原始Ethernet的技術源頭。

一、802.11n 與 2.4GHz 頻段

$1.1 頻道 (Channel)

2.4GHz頻段可以使用2.400–2.485 GHz之間的頻段,總共有 85 MHz 的帶寬。

在發明WiFi之前,它已經被分成一堆以 5 MHz 為間隔的頻道。5 MHz太窄,傳不了多少資料,最早的 802.11 及其後續的 802.11b 使用 22 MHz 信道,也就是5 個 5 MHz 。

後來的 802.11g 和 802.11n 後來使用了OFDM 技術,才開始在 20 MHz 的頻寬上來使用。
但是無論22M Hz還是20M Hz,都需要連續的五個頻道,才能塞進去這20MHz。

所以如果不想重疊,就是把這有限的85MHz,分為三個段子。於是所有的802.11n 2.4GHz都使用Channel 1, 6, 11當作中心頻率,還保證不打架。


例如如果AP打出的頻率是Channel,基本上就 CH 4, 5, 6, 7, 8 指五個頻道組成一個20MHz。

$1.2 頻道的合併使用



如果用Channel 3為中心頻率,的確可以做到合併出一個 40MHz的頻道。但是似乎沒有人這樣做。因為這樣在壅擠的2.4GHz,不是一個有效率的做法。

還有人也許會問,如果用Channel 5 做中心,使用 3-11不是也很好。但如果看上面的圖就知道,如果用Channel 3來做40MHz,會與兩個20MHz頻道重疊,但是如果你選Channel 5,就幾乎與所有頻道重疊。

簡單說,如果你住的地方,沒有別的基地台,那你就隨便設,把頻道設成 40MHz;否則,就乖乖的用20MHz,在 Channel 1 6 11 選一個比較少人使用的就可以了。

$1.3 各國的使用頻段限制

美國、台灣與巴西不能使用 CH 12, 13, 14。
日本與歐盟不能使用CH 14。

$1.4 干擾

2.4 GHz上有非常多的干擾源,包含微波爐、省電燈泡、Bluetooth等等。最新的威脅是USB3,它恰好使用相同的頻率,許多便宜的 USB3.0 電纜的屏蔽率很低,因此會對 2.4GHz的天線造成影響。有時候,這是讓Wi-Fi傳不遠的一個原因。

$1.5 連線速度


所以20MHz時候,最大的理論速度是 144 Mbps,20MHz 的時候 300 Mbps。這是2x2 802.11n 2.4GHz BW=20MHz 時,基地台所能提供的理論值最大速度。

如果AP能將Band Width(BW)設定為40MHz時,2x2 802.11n 2.4GHz 便可以把最高理論速度提高到 600 Mbps。

然而STA端(電腦、手機等),受到距離、雜訊、頻道的擁擠、天線設計等等因素,常常是到不了這個速度的。

二、802.11ac 與 5GHz 頻段

IEEE事實上早在802.11a中,便開始使用了5GHz頻段。但設備價格昂貴,該頻段並未獲得普及。802.11n開始定義可以使用於2.4GHz和5GHz頻段,但那時候除了我們的WAP-752X系列的產品利用4x4的802.11n 5GHz來設計出了Video Bridge這樣的產品。基本上,我們是利用這樣的設備來取代傳統的Ethernet CAT6 (Gigabit 雙絞線 Ethernet)。

後來802.11ac出現,而且這個技術規範僅支援5GHz,但是相容於之前802.11n。由於 iPhone開始支援雙頻架構的無線網路,造成無線基地台(Wi-Fi AP)的普及。

通常終端設備稱之為Station,諸如筆電、手機、平板都是。它們的Wi-Fi網路介面通常具備2.4 GHz與5GHz兩個頻段,然後依照實際的狀況,選擇一個頻段來連線。

$2.1 頻道

5GHz頻段與2.4GHz頻段5MHz來定義一段Channel。但由於技術比較新,所以間隔四個通道才設定一個頻道(36、40、44、48 ...),所以每個Channel都有20 MHz 的頻寬,避免了2.4 GHz 的重疊問題。



歐洲在室內使用頻道36-64。最大傳輸功率為200mW (23dBm),大於2.4GHz允許的100mW (20dBm),但由於頻率較高,仍無法完全補償6dB的衰減,所以5 GHz的傳輸距離,先天上必然小於2.4 GHz。

在Wi-Fi Access Point 的應用中,最大傳輸功率實際上無關緊要,因為典型的用戶設備,通常傳輸功率比較小。但連接始終是雙向的,因此如果手機發送的信號,無法傳送到基地台,那雖然手機看的到基地台,但也無法連上。

所以在相同距離之下,2.4GHz信號將必然會接收到3dBm的增強信號,由於演算法的關係,大多數STATION設備會選擇連接2.4GHz信號而不是5GHz。

但在100-140通道上,最大發射功率為1 W (30dBm),如前面所述,這對於STA不太重要,但是在MESH網路,或是Video Bridge的應用當中,就非常重要。

可惜的是CH 100- CH 140之間,還有別人在使用。

- Weather Radar (CH120, 124, 128) 

系統啟動時,AP必須要監聽雷達信號10分鐘,如果沒有雷達信號才能使用。

- DFS (Dynamic Frequency Selection) (CH52– CH140) 

這其中除了啟像雷達之外,還有軍方的雷達系統在使用當中,所以如如要使用,之前要監督一分鐘,如果有雷達訊號,就不能使用這些頻段。有關於DFS的說明,麻煩參考另外一篇。5G Wi-Fi 的 DFS (Dynamic Frequency Selection) 頻道
 
- CH 149- CH 165的四個通道上的SRD規範限制

歐洲限制這些頻段上最高 25mW (14dBm) 的傳輸功率,所以Access Point只能打出 14 dBm 而已。

$2.2 5GHz 頻道的合併使用

802.11n 2.4GHz 引進的合併通道的概念在 5GHz也存在。


2013 年,WiFi 聯盟將 802.11ac 分為 Wave 1 與 Wave 2。

合併兩個20MHz通道,將產生40MHz 帶寬。事實上,大部份的 2x2 AP,在5GHz上, 都會合併兩個通道為預設 40MHz 通道。例如: CH38/CH46、CH54/CH62、CH102/CH110、CH118/CH126、CH151/CH159,總計五個段子來提供給 4x4 Wi-Fi來使用。

如果有4x4的天線設計,系統便可以設定為使用 80MHz,就是將四個相連的頻道給組合起來使用。這時候 5GHz就只有五個頻道(CH42/CH58/CH106/CH122/C155)可以選用。

如果有八支天線,還可以設成 160MHz 來使用。

$2.3 辦公室的Wi-Fi使用