起因:
昨天跟幾個研究生調接入網實驗室的裝置,
完了後抓了下PPPoE的包,
發現封裝很奇特,類似如下:
172.16.1.118和172.16.1.116是兩台機器PPPoE撥號後伺服器分給的地址。
從理論上來講,ping一下,抓到的幀的封裝應該是這樣的:
icmp
ip
ppp
pppoe
mac
感覺這個事情和原理不符合。
又因為之前無意抓過一次,看到了ppp的層。
那次得到的兩個地址是不同子網的,
於是得到了一個結論,
說在同一子網的資料包不經過ppp封裝。(錯)
原理探討:
ppp撥號前應該有一個地址IP,
撥號有一個地址IP(PPP)。
如果是使用前者通訊,
則應該是IP之後直接走到MAC層。
同一內網使用者就是這樣乾的,
所以PPPoE對內網使用者缺乏有力的控制。
如果是使用後者通訊,
那麼不管兩台機器的物理位置如何,
都得和伺服器建立虛串連,
從伺服器那裡繞一圈回來通訊。
在上面的例子中,
用的是PPPoE伺服器給的兩個地址來ping。
所以應該是具有PPP封裝的才對。
上午和老師討論過,
認為現象上確實存在問題,
於是下午重新抓了下包。
抓包的操作問題:
這裡非常感謝cong哥犀利的眼光,
一來就發現了是選擇網卡的問題。
原來選擇物理網卡可以抓出這樣的包:
注意Wireshark這個是低層次放在上面。
這樣出來的結果就是和理論完全符合的了。
--
所以可見昨天的現象純屬巧合了。
當抓不同子網的時候,恰好選到了物理網卡。
當抓同一子網的時候,選到了ppp的虛擬網卡。
這就出現了前面那個彆扭的錯誤結論。
深層次的問題:
在撥號之後,會出現一個ppp的虛擬網卡。
這應該算是系統實現上的巧妙之處吧。
預設路由指向ppp網卡出去的網關,
那麼當使用者在內網互動的時候,
可以直接走MAC,
除此之外,都從ppp這邊交出去。
而實際實現中,並不是像我們想象的,
各個實體從上倒下依次堆疊。
依次堆疊出來的效果將是,
IP實體需要知道某個包應該由哪個下層去交付,
才能夠決定給MAC還是ppp。
這樣會涉及到改變IP實體的實現,不是很科學。
系統的解決辦法是出現一個新的網卡,
從IP的角度來看,他還是交給了一個MAC實體。
就像第一幅抓包出來的圖一樣,
這裡一樣看得到一對MAC地址。
該網卡是ppp虛擬出來的網卡,
它很清楚應該怎樣封裝ppp和pppoe,
然後填上自己的mac和伺服器的mac。
所以都準備好後,
這時才交給物理網卡處理。
這樣就很好地解釋為什麼兩個網卡上抓出來的不一樣了。
這種並列的結構應該是一種巧妙的實現,
相比堆疊的結構,不會導致上層的改變。
cap檔案下載。
兩種網卡下抓的包,
附帶PPPoE串連和斷開過程。
引用:http://hi.baidu.com/hplonline/blog/item/0832b63e8f9c6cf6838b13fb.html