APPENDIX A. 實驗網路說明
為了進一步實地了解IPv6在無線網路上的行為,並尋求可能發生的困難,我們利用以Linux為作業系統的PC主機建置了一套簡易的IPv6實驗網路。
我們使用了四台Pentium III PC以及一台Pentium Notebook來建置這個實驗網路,其中兩台作為IPv6 Router,其他主機則當作一般v6 Host。
用來連接這幾台主機的介面,分成有線及無線兩種,在有線部分我們所使用的一般100M Ethernet,而在無線部份則是使用Lucent的ORINOCO 802.11 silver PC card[1] (IEEE 802.11b)作為介面。在介面卡之外,另外作為測試用的兩台Lucent Orinoco AP-1000型Access Point,這兩台AP主要是用來作為試驗Mobile Host能否在AP之間移動並仍能保持與網路之間的連線所用。
在實際架設時,為了降低架設複雜度並逐步確認各個Component都能正確運作,我們設定了不同的階段來一步步了解現有的軟硬體能同時對IPv6與wireless communication作到什麼程度的支援。
以下為在實驗網路中的主機列表,
Host Name |
O.S |
Function |
Odyssey |
RedHat 7.2[2] |
Router |
Drake |
RedHat 7.2 |
Router |
Notebook |
RedHat 7.2 |
Wireless Host |
Mobile_1 |
RedHat 7.2 |
Wire Host |
Daemon |
Windows 2000[3] |
Wire Host |
Table 2. Host List
我們的目標是觀察Mobile
Host在IPv6無線網路內作移動所引起的問題與狀況,簡單的移動可以利用一主機跨越兩個鄰近的網域來達成,而兩個網域可以利用同一台router的不同interface來達成,但是為了讓packet在不同網域中轉送的效果更易觀察,我們決定把兩個網域分別利用不同台router上的interface來切分,這使得在實驗網路中最起碼要有兩台router,才能達到上述的效果。
而這樣的設計也增加了部份困難度,因為packet不會只經過一個hop,在經過兩個hop以上時,要妥善設定的就不只是一台router上的各個介面,而要讓router間彼此能交換packet。
Figure 9. A simple setting in Experimental Network
第一步,我們希望能先確認現有的Linux與Microsoft的IPv6 implementation是否有效。利用第一個Scenario,首先可以確認IPv6 router是否具有RFC2460所描述的Router behavior,在這方面,我們發現這個版本的router並不會定時發出RA (Router Advertisement) ,尚需另外安裝其他application[4]來輔助router來發RA,讓其下的IPv6 host能根據此RA來進行stateless auto-configuration。
在正式進行資傳輸前,我們要先確定所有的IPv6 link都是通的,在這方面有線部份較沒有問題,比較有問題的是wireless段。由於wireless段的介面有多種版本,造成使用不同版本驅動程式的介面無法互通,而在不同作業系統上這個問題顯得更加嚴重,並不是所有版本的驅動程式都能讓互通,當情況成為與AP溝通時又會有所不同,為了降低複雜度,所有在Linux上的wireless card都使用由Lucent發出的同一版本Driver[5]。
由於Router本身便具有wireless interface,故在此網路中不使用AP,驅動一個wireless interface時可以有三種不同的模式選擇{Managed|Ad-hoc|AP},由於目前可用的Driver並未將AP的功能實作完成,而Managed模式又必須要另外有AP存在,故採用Ad-hoc模式,同樣的在一般Host端的wireless interface也一樣設定為Ad-hoc模式。
在Router部份,一方面由於topology相當簡單一方面也為了降低複雜度,我們沒有使用任何routing protocol,改以在所有的Router上設定static route,並且手動設定Router上的所有Interface[6]。
第一個簡單的測試如圖9,理想的狀況為Daemon與Notebook兩台主機都能在開機後進行auto-configuration,並在完成這項動作後能直接存取網路資源。在這個測試裡,我們試圖讓Daemon與Notebook在開機後對彼此進行傳輸。要讓這樣的動作完成,先決條件是所有的Host都必須先藉由auto-configuration取得unicast address以及default router的相關資訊,當packet送至中介的router時,router必須要能夠先進行每個hop要完成的基本動作,如檢查Hop Limit,check sum等,再根據IPv6 routing table決定要將packet forward出的方向,在另一端的Host也必須要能認出送往自身的packet並進行收取packet的動作。
第一個測試相當的成功,我們可以利用icmpv6來辨認所有host是否仍在線上,也可以進行一般IP packet的傳送,我們利用修改過能支援IPv6 socket的telnet與ftp,來看一般IP packet forwarding的效果,結果兩種應用程式都運作的相當順利。
接下來我們要作的是建立起連結兩個router的網路,為了降低複雜度排除不穩定的元件。在這個實驗中,所有的連結都是有線的,這是為了將無線界面的設定與router的設定動作分開處理,再分別確定兩者都是可行的之後,再將兩者合併。
在這個階段(如圖10),我們所遭遇到的主要困難為router間routing table的設定問題,由於router間不會利用auto-configuration找出其他router,在設定routing table時除了要設定輸出界面外,尚要指明下一站router的IP位址,才能真正讓packet在兩個router間作forwarding[詳細設定請見附件二]。
Figure 10. Experiment for 2 hop forwarding
在完成設定之後,我們採取跟上一個實驗類似的方式來測試經過兩站的forwarding能否成功,利用icmpv6、telnet以及ftp的傳輸來觀察packet在兩個router間是否有如預期般的進行轉送並經過適當的處理。結果相當令人振奮,此時網路內所有的節點皆可互相連通進行傳輸。
最後,我們試圖將上述兩種不同特性的元件合併在一起進行測試,以真正觀察mobile host在wireless IPv6 network內的行為。
網路topology如圖11,每台router上分別有三個interface連結至不同的子網段,其中各有一個無線界面提供一個無線網段的連結,其餘的界面皆為有線。這樣設計的目的在產生一個single hop wireless network,讓mobile host利用無線界面連結上網路,並可以跨越網段後改經由另外一個gateway接上網路。其他的主機如router、corresponding node則不會改變他們的網路連接點。
我們讓Notebook在Odyssey所轄範圍內開機,讓Notebook以Odyssey為一開始的default router,先進行所有node之間的連結測試,若一切正常(即所有node之間都為reachable),再將Notebook移動到Drake所轄之無線網路範圍內,觀察Notebook在這種handoff下會有什麼樣的行為與問題。理論上由於在跨越子網路後Mobile Host會在新的router範圍內進行另一個auto-configuratoin以取得在該網路內之合法IP,並改變它的default router成Drake。雖然原有connection會因此中斷,但Notebook可在handoff完成後開啟新的connection。
在測試時雖然遭遇到些許困難,主要是由於router上的interface變多使得在設定routing table時必須更仔細,所幸結果最後還是成功的。
Figure 11. Experiment for integrated test
Windows
2000 IPv6 package installation
Requirement﹕Windows 2000 with Service
Pack 2
Download Site﹕http://www.research.microsoft.com/msripv6/
Documentation﹕http://www.research.microsoft.com/msripv6/docs/config.htm
安裝說明﹕在取得msripv6-bin-1.4.exe自解檔後,可以將它解壓縮至想放置之處,接下來在控制台à網路和撥號連線à欲安裝IPv6協定之連線上選內容,加入新通訊協定à選擇由磁片安裝,此時將檔案指向剛剛解壓縮的IPv6kit目錄內,再選取MSR
IPv6 PROTOCOL即可完成在windows上的IPv6安裝。
Linux Host installation
Requirement﹕RedHat 7.2、RADVD(required for
router)
Download Site﹕RedHat,http://www.redhat.com、
RADVD,ftp://ftp.cityline.net/pub/systems/linux/network/ipv6/radvd/
Documentation Site﹕http://www.bieringer.de/linux/IPv6/
http://www.csc.fi/~psavola/ipv6/ipv6.html
http://www.wcug.wwu.edu/ipv6/faq/
安裝說明﹕通常generic的kernel中不會包含有IPv6 component,所以必須由我們自己enable在Networking Option中的IPv6
Option。以下為在Linux下建立一個有IPv6 functionality kernel的步驟。
u
/usr/src/{CURRENT_KERNEL}/make
menuconfig。
u
Enable
Networking optinsàThe IPv6
protocol (EXPERIMENTAL),在這個部份可以依使用者需要compile成kernel module或直接將它compile進kernel內。
u
Save current
setting for kernel and Leave menuconfig。
u
之後便可依照一般編譯kernel的方式來編譯它,一般使用的方式為/usr/src/{CURRENT_KERNEL}/make clean;make
dep;make bzImage
l
若為kernel
module則需另外make modules再make modules_install
若一切順利,只要重新啟動這個編譯好的kernel,便能開始使用IPv6協定。以下為在Linux下一主機開機取得Link-Local Address à 收到 RA à 取得 Global unicast Address的示意圖。
Figure 12. Configuration without RA
Figure 13. Configuration after RA received
但對router來說,在有了IPv6
networking能力之外,使用者還要將此主機設定為router,才會將此主機IPv6行為改為IPv6 router而不是一般的IPv6 host。最簡單的作法便是利用sysctl將net.ipv6.conf.all.forwarding這個核心參數設定為TRUE。使用者可以利用以下的命令來改變這個參數值
u
sysctl –w net.ipv6.conf.all.forwarding=1 ,or
u
echo 1
>> /proc/sys/net/ipv6/conf/all/forwarding
由於router本身(最起碼直到實驗網路所用的版本為止)不會主動定時送RA出去,想要建立一個可讓IPv6
host自行進行auto-configuration的網路,必須要在router處多安裝一個daemon來協助router以定時發出RA,此daemon即為RADVD。
把從網路上下載的RADVD
tar包解壓縮後,可以按照一般在Linux下安裝應用程式的方式的安裝RADVD。以下為RADVD之安裝步驟。
u
cd {Directory
of RADVD}
u
./configure
u
make all;make
install
u
在編譯好後欲啟動radvd只需執行radvd便可讓radvd進行它的工作
現在我們有了定時發出RA的機制,但我們需要對RA的內容依據不同需一些調整,隨著不同distribution版本,RADVD所使用的config
file的位置也不相同,不過通常是在/usr/src/local/v6/etc或是/etc裡的radvd.conf,以下為在Odyssey上所使用的radvd.conf,此時所用的topology可見圖,其中eth0為與Daemon相連之界面、eth1與Drake相連、eth2則為無線界面。
interface eth0
{
AdvSendAdvert on;
MinRtrAdvInterval 3;
MaxRtrAdvInterval 5;
prefix
3ffe::202:b3ff:fe0c:4d86/64
{
AdvOnLink on;
AdvAutonomous on;
AdvPreferredLifetime 10;
AdvValidLifetime 20;
};
};
interface eth1
{
AdvSendAdvert on;
MinRtrAdvInterval 3;
MaxRtrAdvInterval 5;
prefix
3ffe:0:0:100:2:b3ff:fe15:fca7/64
{
AdvOnLink on;
AdvAutonomous on;
};
};interface eth2
{
AdvSendAdvert on;
MinRtrAdvInterval 3;
MaxRtrAdvInterval 5;
prefix
3ffe:0:0:200:2:2dff:fe0b:c51b/64
{
AdvOnLink on;
AdvAutonomous on;
AdvPreferredLifetime 10;
AdvValidLifetime 20;
};
};
在RADVD啟動之後,可以在/var/log/message裡找到RADVD所產生的偵錯訊息,可以幫助使用者找出RADVD無法正常運作的原因。使用者可以另外使用RADVD所內附的工具程式如radvdump來檢視主機有沒有如預期送出正確的RA,radvdump會把所有不論是由本機發出或來自其它主機的RA攔截並顯示出來,功能有點類似sniffer軟體,但是radvdump只針對RA作攔截。
Figure 14. Dump message from radvdump
Wireless Card installation on Linux
由於我們所使用的PCMCIA
Card,故在此小節所描述的為安裝PCMCIA wireless card的步驟,更詳細的原理與安裝方式可以參考PCMCIA HOW-TO。
Requirement﹕Linux Driver Source/Library
for ORiNOCO PC Card Version 6.10
PCMCIA
package Version 3.1.25
Download Site﹕http://www.orinocowireless.com
http://pcmcia-cs.sourceforge.net
Documentation﹕http://www.orinocowireless.com
http://pcmcia-cs.sourceforge.net
安裝說明﹕由於Linux內附的WaveLan Driver較舊,兩個wireless Interface無法利用Ad-hoc mode進行連結,只能個別使用Managed
mode與AP作通訊,新版的Driver支援到11Mbps的傳輸速率,同時也解決了上述問題。但新的問題是使用這個版本的Driver會造成無法使用Managed
mode跟AP連結。由於我們不使用AP,而是利用Ad-hoc mode來作測試,故我們採用新版的Driver。以下為安裝此PCMCIA driver
module的步驟。
u
把pcmcia
package解壓縮至/usr/src
u
把Orinoco
Driver解壓縮至/usr/src/{PCMCIA-package}
u
cd
/usr/src/{PCMCIA-package}
u
make config,填入目前所使用的Linux
Kernel目錄路徑
u
make all
u
./Install
如此便將新版的WaveLan
Driver安裝進目前的kernel module中,使用者可以利用RedHat內建的pcmcia啟動script來重新驅動無線網卡,/etc/rc.d/init.d/pcmcia
restart,若一切正常,應該可以聽到三聲較高的Beep聲,若沒有表示安裝出現問題,可以自 /var/log/message中尋找錯誤訊息來作偵錯。
在安裝成功並驅動之後,使用者可以利用iwconfig這個公用程式來設定無線網卡的無線通訊屬性。以下為iwconfig一些常用的parameter。
u
mode。即目前所使用之無線模式,一般常用的為{Ad-hoc|Managed|AP}三個模式。
u
channel。網卡目前所使用之channel
id,一般來說有0~11號可供使用。網卡間必須使用同一個channel才能互相通訊。
u
Encryption
key。網卡目前所用以為其資料加解密之key,off時為不為資料作加解密。
u
ESSID。網卡所屬ESS之ID,可以填入any以加入任何可用之ESS。
Figure 15. output of “iwconfig eth2”
Configuration on router
如同上文所述,IPv6
router並不會進行auto-configuration,在router上還是要有管理者來為這個網路作設定,以下為在此實驗網路中用來設定各router之routing
table與為各個Interface設定IP的script。
Startup Script on Odyssey
ifconfig eth0 up
啟動所有Interface
ifconfig
eth1 up
ifconfig eth2 up
ifconfig eth0 140.112.8.185
設定無線網卡
iwconfig
eth2 mode ad-hoc
iwconfig eth2 enc off
iwconfig eth2 channel 10
modprobe ipv6
Enable IPv6 forwarding
echo 1 >> /proc/sys/net/ipv6/conf/all/forwarding
Assign IP
ifconfig
eth1 add 3ffe::100:2:b3ff:fe15:fca7/128
ifconfig eth0 add 3ffe::202:b3ff:fe0c:4d86/128
ifconfig eth2 add 3ffe::200:2:2dff:fe0b:c51b/128
建立 static routing entry
route
-A inet6 add 3ffe::100:50:4ff:feb9:c34b eth1
route -A inet6 add 3ffe:0:0:100::/56 dev eth1
route -A inet6 add 3ffe:0:0:200::/56 dev eth2
route -A inet6 add 3ffe:0:0:110::/60 gw
3ffe::100:50:4ff:feb9:c34b dev eth1
route -A inet6 add 3ffe:0:0:120::/60 gw
3ffe::100:50:4ff:feb9:c34b dev eth1
route -A inet6 add 3ffe:0:0:100::/56 gw
3ffe::100:50:4ff:feb9:c34b dev eth1
route -A inet6 add default dev eth0
Startup Script on Drake
啟動所有Interface 設定無線網卡
ifconfig eth1 up
ifconfig eth2 up
modprobe ipv6
iwconfig eth2 enc off
iwconfig eth2 mode ad-hoc
iwconfig eth2 channel 3
Enable IPv6 forwarding
echo 1 >> /proc/sys/net/ipv6/conf/all/forwarding
ifconfig eth1 add 3ffe::110:2:b3ff:fe0c:4f9e/128
Assign IP
ifconfig
eth0 add 3ffe::100:50:4ff:feb9:c34b/128
ifconfig eth2 add 3ffe::120:202:2dff:fe1f:f1af/128
建立 static routing entry
route -A inet6 add 3ffe::100:2:b3ff:fe15:fca7 eth0
route -A inet6 add 3ffe:0:0:100::/64 gw
3ffe::100:2:b3ff:fe15:fca7 dev eth0
route -A inet6 add 3ffe:0:0:200::/64 gw
3ffe::100:2:b3ff:fe15:fca7 dev eth0
route -A inet6 add 3ffe:0:0:110::/64 dev eth1
route -A inet6 add 3ffe:0:0:120::/64 dev eth2