研究所一年級上學期時修了一門恩師的“電腦網路”,第一次考試裡面有一題到現在還記憶猶新的考題:使用瀏覽器連線到台大網站時,電腦(網路)做了哪些事?
在知道連線目的端的 IP 位址 (DST) 後,電腦必須要知道 DST 是在本地還是遠端網路。如果是在本地網路,則必須使用 ARP 取得對方的 MAC 位址;如果是在遠端網路,則必須先將封包送到 Router 去,由 Router 轉送 (當然要先使用 ARP 取得 router 的 MAC 位址)。
但是,電腦怎麼知道 DST 是在本地網路還是遠端網路呢?IPv4 是利用 netmask 與 DST 做 AND 運算,再與自己的網路位址做比對,以決定是否在本地網路。(參閱 RFC 1122)
IPv6 不是這樣子做的!網路是不是本地端,與 IP 位址(還有 netmask) 是沒有關係的。
IPv6 預設只將 link-local 網段 (FE80::/10) 視為本地網路。那麼,IPv6 要怎麼判斷 DST 是否在本地網路呢?
當 IPv6 hosts 利用 Router Advertisement 取得有效 prefix 資訊的時候,如果 Prefix Information Option (PIO) 的欄位裡面的 L-bit (on-link) 為 1,那麼該 prefix 就是本地網路 (on-link)。而這個 prefix 就會被加入或更新 IPv6 的 Prefix List。所以 IPv6 hosts 的 Prefix List,其實就是記錄有哪些 prefix 是本地端的。當然,這個 Prefix List 也可以手動設定。
如果封包目的地 MAC 位址不存在於 Neighbor Table (等同於 IPv4 的 ARP Table),目的地也是屬於本地網路 (on-link prefix),IPv6 hosts 便會開始 address resolution (NS/NA),以求得對方的 MAC 位址。其他的,IPv6 hosts 會將封包送到 default router 轉送。如果 hosts 沒有 default router,就會產生 Neighbor Unreachable 的訊息。
詳細做法請參閱 RFC 5942。