目前正在研究,IPv6封包傳送的方式。
依IPv4的經驗,
當我要傳送出去的目的端位址,
是依目前的route table來判斷,
要送去哪一個介面。
在命令提示字元輸入
route print
而要判斷是否為同一個network,則必需要使用到網路位址(IP)與網路遮罩做AND運算元的動作。
例如我要傳送一個封包到192.168.1.89,
則我route table要由下往上看。
先把網路遮罩(255.255.255.255)與192.168.1.89做AND運算元的動作,
255.255.255.255 & 192.168.1.89 = 192.168.1.89
並不與網路目的地255.255.255.255相同,
因此再往上比對上一個。
一直到比對到了倒數第7個,
先把網路遮罩(255.255.255.0)與192.168.1.89做AND運算元的動作,
255.255.255.0 & 192.168.1.89 = 192.168.1.0
與網路目的地192.168.1.0相同,因此會把這一個封包送到介面(192.168.1.100)
而當我要傳送一個封包到168.95.1.1(HiNet DNS),
一樣是由最底下開始比對,
一直到最上面那一筆做運算,
0.0.0.0 & 168.95.1.1 = 0.0.0.0
與網路目的地0.0.0.0相同,因此會把這一個封包送到介面(192.168.1.100)
並且透過把封包傳給Gateway(192.168.1.254)
以上是IPv4的情況。
在IPv6其實是差不多的。
在命令提示字元輸入
route print
而要判斷要把封包傳送到哪一個介面,一樣要使用網路目的地這個東東。
而這一個組成結構是IPv6/Prefix。
而運算的方式跟IPv4差不多。
若我要傳送資料到目的位址(2001:470:871c:581:bd81:7828:ca57:8888)
prefix是8的意思是說IPv6的128 bit前8bit是1,其餘的都是0。
則把目的位址與Prefix做AND運算元的動作。
2001:470:871c:581:bd81:7828:ca57:8888 & FF00:: = 2000::
結果並不等於ff00::
因此,再往上尋找。
一直到了到數第10個,
2001:470:871c:581:bd81:7828:ca57:8888 & FFFF:FFFF:FFFF:FFFF:: = 2001:470:871c:581::
結果與網路目的(2001:470:871c:581::)相同,
因此就把封包送到介面16。
若我想把封包送到2001:4860:4860::8888 (Google IPv6 DNS)
一樣是由最底下開始比對,
一直到最上面那一筆做運算,
:: & 2001:4860:4860::8888 = ::
與網路目的地::相同,因此會把這一個封包送到介面16,
並且透過把封包傳給Gateway(fe80::250:18ff:fe22:4491)
而這個fe80::250:18ff:fe22:4491剛好會是router的LAN port的IPv6 Link-Local Address
而若想知道介面代號指的是哪一個介面的話,可以使用下面的指令
netsh interface ipv6 show interface
沒有留言:
張貼留言