PPPoE 筆記

Category: , By 人生有夢,築夢踏實
A Method for Transmitting PPP Over Ethernet (PPPoE) <<>>


點對點通訊協定 (Point-to-Point Protocol : PPP) 常用於存取遠端主機服務,用於建立遠端主機(Remote site)連線。 例如:九五年代時期所使用的56k數據機 (Modem),便是使用‘點對點通訊協定’來串聯數據機和系統業者機房進行通訊,其優點在於協定易理解,並容易套用於任何通訊設備;有存取控制和收費機制。

而‘跨乙太網路點對點通訊協定’(PPP Over Ethernet : PPPoE) 則提供了建立遠端主機連線,可跨過簡易橋接線路的能力。簡單地說:就是可於乙太網路,使用PPP建立遠端主機連線。

在PPPoE中, 毎一個‘PPPoE對話’(PPPoE session) 需記錄連線‘端點(Peer)’ 的乙太網路位址(MAC Address),並建立取得‘唯一的對話識別碼’(Unique SESSION_ID),PPPoE擁有‘探索協定’(Discovery protocol)的能力。

以ADSL數據機(modem)和本地主機(Host) 為例:本地主機欲和ISP局端建立PPPoE連線,連線模式為本地主機和數據機以乙太網路連線,而數據機到ISP局端連線為PSTN。第一步:需建立本地主機和數據機之間的連線,本地主機首先需傳送‘探索封包’(Discovery Packet),數據機收到封包後,便會回覆本地主機,二者經交換彼此參數後,取得‘PPPoE對話識別碼’(PPPoE SESSION_ID),此識別碼是唯一的。往後的通訊皆使用此識別碼,作為連線的識別。於是,本地主機和數據機之間便建立連線。這個階段稱為‘Discovery Stage’。接著,第二步:本地主機和ISP局端透過數據機以PPP建立連線,這個階段稱為‘PPP Session Stage’。

在上述的例子中,已經勾勒出整個PPPoE協定的運作模式。 PPPoE定義出二個明確的階段(Stage):Discovery Stage和PPP Session Stage。當Host在Discovery Stage中,PPPoE連線要取得端點(Peer)的MAC位址和取得PPPoE對話識別碼 (在此,所謂的‘端點’,即為例子中的數據機)。在實際網路中,本地主機需先傳送‘探索封包’,且可能將收到一個以上的端點的回覆,在Discovery Stage允許本地主機可選擇決定其一端點,送出‘PPPoE對話碼要求’,以取得PPPoE對話識別碼 (PPPoE SESSION_ID)。當建立本地主機和端點之間的連線,即進入PPP Session Stage。進入PPP Session Stage,本地主機便可以和遠端主機(Remote Site)以PPP建立連線和進行通訊了。

瞭解了PPPoE的運作後,接著我們來瞭解PPPoE封包的格式。其格式如下:

Physical header


Ethernet frame


PPPoE Payload


…Date Payload…


Checksum


PPPoE封包內由實體層封包頭(Physical header)為開始,接著依續為:乙太網路訊框(Ethernet frame)﹑PPPoE payload,和Data Payload,最後,以封包的Check Sum作為結束。實體層封包頭為Preamble和SFD,這就不在此討論。


Physical

head


Destination Address

(6 bytes)


Source Address

(6 bytes)


Ether_Type

(2 bytes)


PPPoE


乙太網路訊框(Ethernet frame)長度固定為14 bytes,包含了6 bytes的目地位址(Destination Address),6 bytes的來源位址(Source Address:就是自己的MAC位址),和2 bytes的Ether_Type(上圖黃色區域)。Ether_Type其值為0x8863(Discovery Stage)和0x8864(PPP Session Stage)。而目的位址為端點的MAC位址,若尚未取得端點的MAC位址,則為乙太網路廣播位址(0xff_ff_ff_ff_ff_ff),取代之。

接於乙太網路封包頭後的,便是PPPoE Payload,格式如下圖:


Ethernet frame


Version(4 bits)


Type(4 bits)


Code(8 bits)


Session_ID(16 bits)


Length (16bits)


Payload …


Version欄寬是4 bits,版本為第一版,所以值為0x1;Type欄寬是4 bits,值亦為0x1 (Version和Type值皆為0x1,定義於PPPoE RFC2516 Feb 1999;後來有沒更新,則不得而知);Code欄寬是8 bits,其值如下表:


Ether_Type


Code


Definition


0x8863


0x09


Initiation Packet (PADI)


0x07


Offer Packet (PADO)


0x19


Session Request packet (PADR)


0x65


Session-Confirmation Packet (PADS)


0xa7


Terminate Packet (PADT)


0x8864


0x00


Session Data


Length欄寬為16 bits,其值代表為data payload的長度(單位:byte)。在Discovery Stage,Data payload 內容為TAGs;而在PPPoE Session Stage,Data payload內容則為PPP協定和其資料。

在Discovery Stage,PPPoE payload可包含一個以上的標籤(TAGs),標籤的格式為TLV(type-length-value)。


TAG1_TYPE (16bits)


TAG1_LENGTH (16bits)


TAG1_VALUE ...


TAG2_TYPE…


TAG_TYPE其值可自行參閱RFC2516的附錄A;TAG_LENGTH值代表著TAG_VALUE的長度。若有二個以上的TAG(s),接續的TAG(s)直接放置於前一個TAG_VALUE後。

@@Discovery Stage共定義五個型態的封包。分為Initiation Packet(PADI)、Offer Packet(PADO)、Session Request Packet(PADR)、Session-Confirmation Packet(PADS),和Terminate Packet(PADT)。

The PPPoE Active Discovery Initiation (PADI) packet.

PADI封包內的目的位址為廣播位址(0xff_ff_ff_ff_ff_ff),Code欄位值為0x09,而SESSION_ID值需為0x0000,且必需帶有‘Service-Name TAG’。Host發送PADI封包其目的探索收集網路區域內,是否存在提供PPPoE服務的端點。所以PADI封包使用廣播位址,使其不跨越閘通器的網路下,每一個網路端點(Peer)皆可收到此一封包。而提供PPPoE服務的端點收到PADI後,便回傳PADO,通知Host自己的位址。若網路上沒有任何可提供PPPoE服務的端點,便沒有任何PADO的回覆。

The PPPoE Active Discovery Offer (PADO) packet.

PADO封包內的目的位址為Host的MAC位址,來源位址則為自己(Peer)的位址,Code欄位值為0x07,SESSION_ID值必需為0x0000,必需帶有‘AC-Name TAG’。

PADO封包是用來回應PADI封包的,因為封包內的來源位址會放置自己的MAC位址,Host便可由此得到‘提供PPPoE服務的端點’的MAC位址。並由‘AC-Name TAG’資訊來選擇合適的端點。


The PPPoE Active Discovery Request (PADR) packet.

PADR封包內的Code欄位值為0x19,SESSION_ID值需為0x0000,且必需帶有‘Service-Name TAG’。

當Host發出PADI後,可能有一台以上的端點以PADO回應,於是Host便依據‘AC-Name TAG’來選擇合適的端點。當Host決定了合適的端點後,便會向該端點送出PADR封包,來要求取得SESSION_ID。

The PPPoE Active Discovery Session-confirmation (PADS) Packet.

PADS封包內的Code欄位值為0x65,此時,端點會依據PADR內的‘Service-Name’ 來決定是否建立連線。此時,端點有最後的決定權,決定是給予連線;

若端點同意連線,則端點在回覆PADS時, SESSION_ID欄位將填入由端點產的唯一的對話識別碼(Unique Session ID),並且附上‘Service-Name TAG’。

反之;若端點不同意連線,則所回覆的PADS,其SESSION_ID欄位將依然保持為0x0000值,且附上‘Service-Name-Error TAG’

當端點回PADS封包為同意連線後,此時便進入了PPP Session Stage。

The PPPoE Active Discovery Terminate (PADT) packet.

PADT封包內的Code欄位值為0xa7,SESSION_ID欄位值必需為PADS所得的Unique Session ID,以指出是那個連線要終止。而沒有要求附有TAGs。

PADT封包可在建立連線後,任意時間發出。可由Host或端點發出皆可。籍由SESSION_ID欄位指出那個連線欲終止。

@@PPP Session Stage只有一種封包的型態。Code欄位其值必定為0x00,SESSION_ID值為在Discovery Stage時所取得的PPPoE對話識別碼。而Data Payload內容為PPP訊框。訊框起始為PPP Protocol-ID(有關PPP協定請參閱RFC1661或等我完成PPP協定筆記)


 

Windows XP WZC related

Category: , By 人生有夢,築夢踏實
There are two value will effect to WZC.
1. Register : HKEY_LOCAL_MACHINE\SOFTWARE\WZCSVC\Parameters\Interfaces\{NetServiceID}\ControlFlags
2. Service : Wireless Zero Configuration. (Abbr:SCMWZC)

NetCard configuration property page included wireless tab if SCMWZC is running.
But NetCard configuration property page excluded wireless tab if SCMWZC is stop.

There values are check/uncheck wzc button on wireless property page. As below:
a. SCMWZC off; unchecked; => No tab, ControlFlags: 0x3910002.
b. SCMWZC off; checked; => No tab, ControlFlags: 0xb918002.
c. SCMWZC on; unchecked; => ControlFlags: 0xf910002.
d. SCMWZC on; checked; => ControlFlags: 0x7918002.



 

CComboBox GetWindowText vs. GetLBText

Category: , By 人生有夢,築夢踏實
CComboBox 使用於視窗中的下拉式選單。
你可以由下拉選單中,來挑選你要的值;亦可透過直接輸入的方式來設定你要的值。
但在這二種方法中,要取得編輯欄 (Edit Control) 內的值是不同的。

於編輯欄內,直接輸入:
輸入欄內容的變更會觸發 CBN_EDITCHANGE 和 CBN_EDITUPDATE 。這二個訊息不同點在於螢幕的顯示:EDITUPDATE 是在未顯示於螢幕上,而 EDITCHANGE 則發生於螢幕顯示後。我的偏好是利用 EDITCHANGE 訊息,透過 GetWindowText 函式來取得編輯欄內的文字內容。

利用下拉選單來選擇:
使用下拉選單來選擇,則會觸發 CBN_SELCHANGE 訊息;若使用 GetWindowText 函式來取得編輯欄內的文字內容,會取得錯誤的內容。需使用 GetLBText 函式來取得編輯欄內的內容;步驟先使用 GetCurSel 函式取得選到選項的 Index number 。再利用 GetLBText 函式透過 CString或
tchar[] 來取得。

 

Develop application with Vista SDK on VC6.

Category: By 人生有夢,築夢踏實
Ref: http://www.armleg.com/forum/viewtopic.php?mforum=diodiaforum&t=34

我試著在 VC6 開發一些 應用程式,但由於需使用到 NativeWiFi API,以致於一定要將 Vista SDK 放入我的開發環境。

這會發生一些問題。
msxml2.lib(msxml2_i.obj) : fatal error LNK1103: debugging information corrupt; recompile module

在 Nick 提供的 rebuild 的版本,測試一下,是可以解決目前問題。

 

省油十招!對抗高油價秘笈出籠

By 人生有夢,築夢踏實
油價一直漲,再加上炎炎夏日即將來到,屆時冷氣吹送,勢必會讓原本就高居不下的加油開支,更雪上加霜。這一點不管是國內還是國外的消費者,都同樣關心,因此英國IAM(Institute of Advanced Motorist)高等駕駛機構,提供了十項省油小秘方,讓開車人參考,拯救自己的荷包。

一、需要開車嗎?
在拿起鑰匙,準備開車出門之前,問問自己「今天真的需要開車嗎?」也許你只是要到巷口或者是幾條街之外的便利商店,買一罐飲料。不開車當然會省油,這一點是無庸置疑的。另外還有一個很重要的理由,就是短程駕駛的情況下,車輛引擎的熱效率沒有辦法發揮到最好,會比達到理想工作溫度的引擎,多製造60%左右的污染物,油耗也更高。因此,短程距離,走走路或是騎腳踏車吧,除了省油,還可以順便燃燒自己體內幾十萬大卡的脂肪,一舉兩得。

二、計畫路線
事前的計畫有助於減少迷路的機會,除了能夠少走一點冤枉路,省油、省時間,也可以少磨一點輪胎,少聽一點副手座傳來喋喋不休的嘮叨。規劃路線的時候,盡量避免碰到上下坡或者經常需要停下來等待的擁擠路段。就算這樣子能幫你少走幾公里,但平均下來並不會比較省油。

三、定期保養
定期保養車子,讓車輛各項機件都維持在良好狀況,對於減少油耗也有正面幫助。引擎如果沒有適當保養,就可能多出將近10%的油耗,也會造成環境污染。除了定期回到車廠做保養以外,車主最好也能自己檢查愛車的各項狀況,以保持最佳性能。

四、檢查胎壓
毫無疑問的,輪胎的胎壓不足,會讓油耗增加,也會造成輪胎不正常耗損。不管是哪一種結果,都會讓車主的荷包受到傷害,因此開車前養成習慣,四周巡視一下,檢查胎壓是否正常,除了省錢,更可以避免因為胎壓不正常所可能造成的行車危險。即使再忙碌,也要養成至少一個禮拜檢查一次的好習慣。

五、遵守速限
好,雖然大家都知道,有些路段的時速限制的確需要檢討,即使不合理、變化無常,但是規定就是規定,少一張罰單就可以加好幾次油。此外,時速90公里比時速110公里平均油耗節省將近25%,開快車也許會早一點到目的地,不過不會比較省油。此外,溫柔細微地控制油門,盡量減少大幅度的動作,也有助於降低油耗。但是,不合理的省油動作,像是下坡打空檔、折後照鏡等等千萬不要嘗試,也許省油,但是跟安全比起來,這一點差異絲毫不值得考慮。

六、減低風阻
用不到的時候,就把車頂行李架或者是車上載的雜物通通拿掉。開車的時候把窗戶打開也會增加風阻,造成油耗上升。加了油所換的贈品,像是礦泉水、飲料、衛生紙,這些都是增加車輛負擔的兇手,別小看這一點重量,長期累積下來也是一筆可觀的數字。開冷氣當然也會增加油耗,盡量關掉壓縮機,只開風扇。壓縮機開開關關不太需要擔心會增加油耗,頂多會讓壓縮機離合器片的磨耗增加,不過也是微乎其微。

七、購買環保油品
在臺灣的情況跟國外有所不同,我們能買到的油品,全臺灣幾乎都一樣。除了因為加油站的不同,以及油槽的新舊,會讓油品的品質有些微差異以外,但是基本上芳香脛或者是含硫量全都沒有差異。低含硫量或者芳香脛的油品,能夠降低環境污染,省不了油沒關係,起碼可以讓我們生活的品質好一點。

八、善用油門
這一點在臺灣都會區格外重要,你是不是常常綠燈起不知後,馬上又遇到另外一個紅燈?走走停停的情況,許多動力以及燃油就這樣平白消耗掉,煞車系統也會有多餘耗損。如果在市區裡行車的時候,注意一下遠方的交通狀況,如果前面在塞車,或者即將變換燈號,試著慢慢將車輛開到定點。一起步就衝出去,不會讓你現在車陣裡也可以早點到達目的地,只會讓你需要早一點加油。

九、車尾停進停車格
這一點很有趣吧?停車方式偏偏就跟油耗有關係,熄火之後車輛引擎回復到冷卻狀態,如果你是車頭停進停車格的話,這個時候就必須要以倒車的方式將車輛開出來。在冷車的狀態下倒車,是車子最耗油的時候。所以,趁車子引擎還火熱的時候,以倒車入庫的方式停車,離開時緩慢順暢地讓引擎溫度提高至工作溫度,可以減少不必要油耗。除此之外,倒車入庫停車的話,離開的時候視野也比較良好。

十、當個吝嗇鬼
一次把油箱加滿方便許多,可以使用更長一段距離再加油。但假使你的習慣是如此,最好稍微更改一下。因為你把油箱加滿,就代表你的車子重量更重,油耗更高。習慣讓油箱不要全滿,試著只加2/3或者一半的油量,也許你會有驚奇的發現,自己的車子原來並不是那麼耗油。
 

ARCHIVES