蓋索林 Gasolin

人們總是高估一年可以完成的事,卻低估十年能完成的事

0%

前文提到 IPv6 的位址為128位元. 這麼高的位元數換算成一般十進位數字表示法的話, 長度將達到10的39次方:

2^128-1: 340282366920938463463374607431768211455

這麼長的數字或位址將很難記得住. 而且, IPv6的位址是逐位定位的(就像IPv4, 但這個觀點不是公認的). 所以透過十六進制表示法能更好地表示這些數字. 將每 4 位元(也叫做"nibble")表示為數字(0-9)或字符 a-f(10-15). 這種表示法可以將IPv6的地址長度縮減到可用32個字符來表示.

2^128-1: 0xffffffffffffffffffffffffffffffff

這種表示法仍然不是很方便. (因為這樣一長串看下來很容易就會混淆或遺漏了單個十六進制數字), 所以IPv6的設計者將地址形式定為每16位元就用"冒號"區分開來. 此外, 開頭的"0x"(在程式設計當中用來表示十六進制數值)也被省略了:

2^128-1: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

如此一來, 一個可用的地址(請參考之後提到的地址類型)如下:

3ffe:ffff:0100:f101:0210:a4ff:fee3:9566

為了簡化, 每個16位元區塊中高位元的0可以被省略:

3ffe:ffff:0100:f101:0210:a4ff:fee3:9566 -> ¬ 3ffe:ffff💯f101:210:a4ff:fee3:9566

連續值為0的16位元位址區塊可以用"::"表示. 但是在一個IPv6位址當中只能使用這種簡寫一次, 否則就不再是唯一表示的位址了:

3ffe:ffff💯f101:0:0:0:1 -> 3ffe:ffff💯f101::1

簡化得最短的 IPv6 本地位址:

0000:0000:0000:0000:0000:0000:0000:0001 -> ::1

也有一種方法叫做簡潔 (compact, base85 coded) 表示法. 定義於 RFC 1924 / IPv6簡潔位址表示法 (定於1996年四月一日), 但從沒有被廣泛使用過, 可能只是個愚人節笑話. 但還是給個例子:

ipv6calc --addr_to_base85 3ffe:ffff:0100:f101:0210:a4ff:fee3:9566

Itu&-ZQ82s>J%s99FJXT

資訊: ipv6calc 是一個IPv6地址格式的計算和轉換的計劃, 您可以在 ipv6calc 首頁中找到: http://www.deepspace6.net/projects/ipv6calc.html 鏡像站: http://mirrors.bieringer.de/www.deepspace6.net/projects/ipv6calc.html

//2/22/2005 //8/6/2004

1. 概述

1.1\. 版權,許可與其它
1.2\. 歸類
1.3\. 版本, 歷史和待辦事項
1.4\. 翻譯
1.5\. 技術
1.6\. 序
1.7\. 使用詞彙與縮寫
1.8\. 了解這個 HOWTO 的必需條件

2. 基礎

2.1\. 什麼是 IPv6?
2.2\. IPv6 在 Linux 作業系統上的歷史
2.3\. IPv6 的位址格式的形式 ?
2.4\. FAQ 問與答(基礎)

3. 位址格式

3.1\. 沒有特殊前綴的位址
3.2\. 位址前綴
3.3\. 位址格式 (主機部份)
3.4\. 用作路由的位址前綴長度

4. IPv6-支援(ready) 系統確認

4.1\. IPv6-支援 kernel
4.2\. IPv6-支援 網路設定工具
4.3\. IPv6-支援 測試/調試 程式
4.4\. IPv6-支援 程式
4.5\. IPv6-支援 客戶端程式 (selection)
4.6\. IPv6-支援 伺服器端程式
4.7\. FAQ 問與答 (IPv6-支援 系統確認)

5. 設定界面

5.1\. 不同的網路設備
5.2\. 啟動與關閉界面

6. 設定 IPv6 位址

6.1\. 顯示目前的 IPv6 位址
6.2\. 新增 IPv6 位址
6.3\. 移除 IPv6 位址

7. 設定正常 IPv6 路由

7.1\. 顯示目前的 IPv6 路由
7.2\. 新增 IPv6 通過閘道器的路由
7.3\. 移除 IPv6 通過閘道器的路由
7.4\. 新增 IPv6 通過介面的路由
7.5\. 移除 IPv6 通過介面的路由
7.6\. IPv6 路由FAQ

8. 芳鄰搜尋

8.1\. 使用 "ip" 指令顯示芳鄰
8.2\. 使用 "ip" 指令處理芳鄰列表

9. 設定 IPv6-in-IPv4 通道

9.1\. 通道的類型
9.2\. 顯示目前通道
9.3\. 設定點對點的通道
9.4\. 設定 6to4 通道

10. 設定 IPv4-in-IPv6 通道 11. 在 /proc-filesystem 的內核設定

11.1\. 如何存取 /proc-filesystem
11.2\. /proc/sys/net/ipv6/ 中的數值類型.
11.3\. /proc/sys/net/ipv4/ 中 IPv6 相關的數值類型
11.4\. /proc/net/ 中 IPv6 相關的數值類型

12. Netlink-Interface to kernel 13. 網路調試

13.1\. 伺服器接口(socket) 繫結
13.2\. tcpdump 封包傾印範例

14. 在不同的發行版中設定 IPv6

14.1\. Red Hat Linux and "clones"
14.2\. SuSE Linux
14.3\. Debian Linux

15.自動設定與移動性

15.1\. 無狀態自動設定
15.2\. 使用Router Advertisement Daemon (radvd)達成有狀態自動設定
15.3\. 動態主機設定協定 v6 (DHCPv6)
15.4\. 移動性

16. 防火牆

16.1\. 使用 netfilter6 防火牆
16.2\. 準備
16.3\. 使用方法

17.安全性

17.1\. 節點安全性
17.2\. 存取限制
17.3\. IPv6 安全性驗證

18. 加密與認證 18.1. 使用加密與認證的模式 18.2. 核心支援(ESP與AH) 18.3. 自動金鑰交換(IKE) 18.4. 額外訊息

19. 服務品質 (QoS) 20. Hints for IPv6-enabled daemons

20.1\. Berkeley Internet Name Daemon BIND (named)
20.2\. Internet super daemon (xinetd)
20.3\. Webserver Apache2 (httpd2)
20.4\. Router Advertisement Daemon (radvd)
20.5\. tcp_wrapper

21. 程式設計 (使用 API) 22. Interoperability 23. 更多資訊與網址

23.1\. 書籍, 文章, 線上評論 (mixed)
23.2\. Conferences, Meetings, Summits
23.3\. 線上資訊
23.4\. IPv6 基礎架構
23.5\. Maillists
23.6\. 線上工具
23.7\. Trainings, Seminars
23.8\. 'The Online Discovery' ...

24. Revision history / Credits / The End

24.1\. Revision history
24.2\. Credits
24.3\. 結語

用來與 OMNET++ IPv6Suite 模組 作對照的模擬工具是 NS2 上的 Mobiwan2 模組. 這是目前最多人使用的模擬模組. 除了基礎對照系統架設之外, 還將根據之前學長在 NS2.1b1 上使用 Mobiwan 的程式, 改寫成 for NS2.27 的 Mobiwan2 版本. 以順便了解其架構, 並利用其優點在 INET6 porting 上

剛開始照著NS2 (Network Simulator) 教學手冊 的 安裝篇 裝, 成功後再裝 Mobiwan2 卻遇到問題.

解決方法是在執行NS2-AllinOne 安裝前先照著 Mobiwan2 網站上的指令 patch 好,

# cd <your>ns-allinone-2.27/ns-2.27
# zcat <patchfile.gz></patchfile.gz></your>patchfile.gz<your><patchfile.gz> |patch -p1</patchfile.gz></your>

然後再執行 NS2 安裝

./install

要是已經把 NS2 裝好了怎麼辦? 還能怎麼辦, 我只會一個笨方法… 先把之前裝的整個目錄砍掉後, 再裝一次吧…Orz.

在Cygwin上測試的方法: 命令列中輸入 startxwin.bat。會產生一個新的視窗,在此命令視窗中輸入

$ cd your path to ns-2.27
$ ./ns simple-mipv6.tcl

若要在Fedora Core 3 上安裝, 因為 gcc 版本太新(3.34)的關係, 笨笨的 NS2 不懂得支援, 去下載 http://www.ececs.uc.edu/~cdmc/ucbt/src/ns227-gcc34.patch 這個好心人寫的修正檔, 丟到 ns-allinone-2.27 目錄下, 打入

#patch -p0 -p0 < ns227-gcc34.patch

修正後再來裝就可以了.

這系列文章僅記錄過程, 目的是從紀錄中看到自己對的 ipv6 了解, 對做事方法的改進. 不總結經驗. 因為一但總結經驗就會陷入長段撰寫文件的誤區. 而且在現在階段, 甚至不能確定此專案能否成功. 希望我能有寫出總結經驗文章來的一天吧:)

1st. Part: 第一步先從ICMPv6開始著手 Porting. 在熟悉INET目錄規劃後, 首先是根據INET目錄規則來建立INET專案所應用到的目錄, 剛開始在Network目錄下先建立IPv6與IPv6d兩個目錄. 並在Nodes目錄下建立INET6目錄.

從 IETF RFC列表 中挖出了 RFC 2463, Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification, 依此為憑開始 porting.

編輯 Network/IPv6/ICMPv6.ned 參照 IPv6Suite, 從 IPv6Suite/IP/IPv6/Generic 目錄下的 ICMPv6.ned. 觀察它的 ICMPv6 模組組成. 發現該模組與INET的ICMP.ned大不相同, 是由 IPv6Core, Neighbourdiscovery, ICMPv6Combine, 還有 MLD (multicast) 模組組成的複合模組. MLD模組在剛開始 porting 時可以忽略暫時不處理. 剩下的三塊中…應不應分拆成三個檔案三個simplemodule? , 是否要使用到 ICMPv6Combine 這塊呢? 我馬上陷入了第一個難題中.

2nd. Part: 告解式除錯(Confessional Debug): 為何不先弄好IP header呢? 這絕對是問題. 還好意識到這件事情的時間點還算早. 更堅定了我"只有邊寫邊紀錄才能意識到自己的錯誤"的想法, 因此接下來應先搜尋 IP header 定義的部分, 從這裡開始作修改.

暫時將 DualStack 放到一邊, 完成純 IPv6 Support 的模組後再考慮 DualStack. 但一定會將之排入計畫裡. 因為雖然 DualStack 對我的論文模擬來說重要性不大, 但在實際工作上將會遇到. porting 過一遍心裡會先有點底, 相信多少有些助益.