內容簡介

本書全面講解IPv6及相關協議實現的事實標準KAME,揭示了KAME IPv6協議棧的所有細節,對每行代碼到底做了什麼以及為什麼要這樣設計都進行了解釋。全書共分7章,分別介紹IPv6地址結構、IPv6、ICMPv6、鄰居發現和無狀態地址自動配置、傳輸層協議及套接字API擴展。每章都包含兩個主要部分︰第一部分提供了作為RFC發布的主要協議規範的摘要,定義各種協議分組,解釋每個分組中每個字段的含義和目的;第二部分則描述實現這些RFC的KAME的數據結構及功能。書的最後還提供了一些例子,說明如何編寫既可以在IPv4網絡上運行、又可以在IPv6網絡上運行的可移植應用程序。

本書是IPv6的權威參考書,適合網絡設計和開發人員閱讀。此外,本書還適合作為高校相關專業網絡課程的教學參考書。
 

目錄

第1章 緒論
1.1 引言
1.2 IPv6和KAME的簡史
1.3 KAME發行版概述
1.3.1 源代碼樹結構
1.3.2 構建過程
1.4 BSD網絡實現概述
1.5 源代碼描述
1.5.1 排版約定
1.5.2 源代碼描述示例
1.5.3 預處理器變量
1.5.4 網絡設備與體系結構假設
1.6 mbuf與IPv6
1.6.1 常見的mbuf操縱宏和函數
1.6.2 mbuf標簽
1.6.3 IPv6的mbuf要求
1.6.4 診斷mbuf鏈
第2章 IPv6編址體系結構
2.1 引言
2.2 IPv6地址
2.3 IPv6地址的文本表示
2.4 地址範圍
2.4.1 範圍區域
2.4.2 區域索引
2.4.3 範圍受限地址的文本表示
2.4.4 單播站點本地地址的廢棄
2.5 IPv6地址格式
2.5.1 接口標識符的產生
2.5.2 有關地址格式的注解
2.5.3 多播地址格式
2.6 節點地址要求
2.7 IPv6地址空間管理
2.8 代碼介紹
2.8.1 IPv6地址結構︰in6_addr{}與sockaddr_in6{}
2.8.2 宏與變量
2.9 對範圍區域的處理
2.9.1 範圍區域的初始化
2.9.2 範圍區域ID
2.9.3 地址結構中的區域ID
2.9.4 與範圍相關的實用函數
2.10 接口地址結構
2.10.1 ifaddr{}和in6_ifaddr{}結構
2.10.2 in6_ifreq{}和in6_aliasreq{}結構
2.10.3 多播地址結構
2.11 IPv6前綴結構
2.12 地址操縱程序概述
2.13 IPv6的接口初始化
2.13.1 in6_if_up()函數
2.13.2 in6_ifattach()函數
2.13.3 in6_ifattach_loopback{}函數
2.13.4 in6_ifattach_linklocal()函數
2.13.5 get_ifid()函數
2.13.6 get_hw_ifid()函數
2.13.7 get_rand_ifid()函數
2.13.8 in6if_do_dad()函數
2.14 IPv6接口地址配置
2.14.1 in6_control()函數
2.14.2 in6_update_ifa()函數
2.14.3 in6_joingroup()和in6_leavegroup()函數
2.14.4 in6_addmulti()和in6_delmulti()函數
2.14.5 in6_ifinit()函數
2.14.6 in6_ifaddloop()和in6_ ifloop_request()函數
2.15 刪除IPv6地址
2.15.1 in6_purgeaddr()函數
2.15.2 in6_ifremloop()函數
2.15.3 in6_unlink_ifa()函數
2.16 用地址配置工具進行的操作
第3章 IPv6
3.1 引言
3.2 IPv6首部格式
3.3 IPv6擴展首部
3.3.1 擴展首部的順序
3.3.2 逐跳選項首部
3.3.3 目的選項首部
3.3.4 路由首部
3.3.5 片首部
3.3.6 IPv6選項
3.4 源地址選擇
3.4.1 默認地址選擇
3.4.2 源地址選擇
3.4.3 目的地址選擇
3.5 代碼介紹
3.5.1 統計數據
3.5.2 首部結構
3.5.3 ip6protosw{}結構
3.6 mbuf中的IPv6分組地址信息
3.6.1 ip6_setdstifaddr()函數
3.6.2 ip6_getdstifaddr()函數
3.6.3 ip6_setpktaddrs()函數
3.6.4 ip6_getpktaddrs()函數
3.7 輸入處理︰ip6_input()函數
3.8 逐跳選項首部的處理︰ip6_hopopts_input()函數
3.8.1 對每個選項進行處理︰ip6_ process_hopopts()函數
3.8.2 處理未知選項︰ip6_unknown_opt()函數
3.9 對目的選項首部的處理︰dest6_input()函數
3.10 已分片分組的重裝
3.10.1 用于分組重裝的結構
3.10.2 frag6_input()函數
3.11 對路由首部的處理︰route6_input()函數
3.12 轉發︰ip6_forward()函數
3.13 輸出處理
3.13.1 源地址選擇︰in6_selectsrc()函數
3.13.2 路由選擇︰ip6_selectroute()函數
3.13.3 ip6_output()函數
3.13.4 構建擴展首部︰ip6_copyexthdr()函數
3.13.5 分割首部︰ip6_splithdr()函數
3.13.6 插入特大淨荷選項︰ip6_insert_jumboopt()函數
3.13.7 分片︰ip6_insertfraghdr()函數
3.13.8 路徑MTU判斷︰ip6_getpmtu()函數
3.13.9 多播環回︰ip6_mloopback()函數
第4章 ICMPv6
4.1 引言
4.2 ICMPv6報文
4.2.1 目的不可達報文
4.2.2 分組太長報文
4.2.3 超時報文
4.2.4 參數問題報文
4.2.5 回送請求報文
4.2.6 回送應答報文
4.2.7 ICMPv6報文處理規則
4.3 PMTU發現機制
4.4 節點信息查詢
4.4.1 節點信息報文的格式
4.4.2 NOOP查詢
4.4.3 支持的Qtype查詢
4.4.4 節點名查詢
4.4.5 節點地址查詢
4.4.6 IPv4地址查詢
4.5 代碼介紹
4.5.1 統計數據
4.5.2 ICMPv6首部
4.6 ICMPv6輸入處理
4.6.1 icmp6_input()函數
4.6.2 錯誤通知︰icmp6_notify_error()函數
4.7 PMTU發現的實現
4.8 ICMPv6輸出處理
4.8.1 發送錯誤︰icmp6_error()函數
4.8.2 錯誤速率限制︰icmp6_ratelimit()函數
4.8.3 icmp6_reflect()函數
4.9 節點信息查詢的實現
4.9.1 類型和變量
4.9.2 ping6命令︰發送查詢
4.9.3 ping6命令︰接收應答
4.9.4 ping6命令︰打印支持的Qtype
4.9.5 ping6命令︰打印節點地址
4.9.6 查詢處理︰ni6_input()函數
4.9.7 節點名的操作
4.9.8 創建節點地址應答︰ni6_store_addrs()函數
4.10 節點信息操作
第5章 鄰居發現和無狀態地址自動配置
5.1 引言
5.2 鄰居發現協議概述
5.3 無狀態地址自動配置概述
5.4 鄰居發現協議報文
5.5 鄰居發現協議報文的交換示例
5.6 鄰居發現協議分組類型及格式
5.6.1 路由器請求報文
5.6.2 路由器廣告報文
5.6.3 鄰居請求報文
5.6.4 鄰居廣告報文
5.6.5 重定向報文
5.7 鄰居發現選項類型及格式
5.7.1 鏈路層地址選項
5.7.2 前綴信息選項
5.7.3 重定向首部選項
5.7.4 MTU選項
5.7.5 路由信息選項
5.8 下一跳判定和地址解析
5.9 鄰居不可達檢測算法
5.10 無狀態地址自動配置
5.10.1 地址的構成和地址狀態
5.10.2 重復地址檢測算法
5.10.3 處理路由器廣告
5.10.4 隱私擴展
5.11 路由器特有的操作
5.11.1 發送未經請求的路由器廣告
5.11.2 處理路由器請求
5.11.3 處理路由器廣告
5.12 主機特有的操作
5.12.1 發送路由器請求
5.12.2 處理路由器廣告
5.12.3 默認路由器選項
5.13 代碼介紹
5.13.1 鄰居發現報文定義
5.13.2 鄰居緩存︰llinfo_nd6{}結構
5.13.3 操作變量︰nd_ifinfo{}結構
5.13.4 默認路由器︰nd_defrouter{}結構
5.13.5 前綴︰nd_prefix{}結構
5.13.6 前綴控制︰nd_prefixctl{}結構
5.13.7 鄰居發現報文選項︰nd_opts{}結構
5.13.8 DAD隊列條目︰dadq{}結構
5.13.9 IPv6地址︰in6_ifaddr{}結構
5.13.10 目的地緩存
5.13.11 操作常量
5.14 初始化函數
5.14.1 nd6_init()函數
5.14.2 nd6_ifattach()函數
5.15 鄰居緩存管理函數
5.15.1 nd6_rtrequest()函數
5.15.2 nd6_cache_lladdr()函數
5.15.3 nd6_lookup()函數
5.15.4 nd6_free()函數
5.15.5 nd6_timer函數
5.16 鄰居發現協議報文處理函數
5.16.1 nd6_ns_output()函數
5.16.2 nd6_ns_input()函數
5.16.3 nd6_na_input()函數
5.16.4 nd6_na_output()函數
5.16.5 nd6_rs_input()函數
5.16.6 nd6_ra_input()函數
5.16.7 icmp6_redirect_input()函數
5.16.8 icmp6_redirect_output()函數
5.17 鄰居發現協議報文選項處理函數
5.17.1 nd6_option_init()函數
5.17.2 nd6_option()函數
5.17.3 nd6_options()函數
5.18 默認路由器管理函數
5.18.1 defrouter_addreq()函數
5.18.2 defrouter_delreq()函數
5.18.3 defrouter_addifreq()函數
5.18.4 defrouter_delifreq()函數
5.18.5 defrouter_lookup()函數
5.18.6 defrouter_select()函數
5.18.7 defrtrlist_del()函數
5.18.8 defrtrlist_update()函數
5.19 前綴管理函數
5.19.1 nd6_prelist_add()函數
5.19.2 prelist_remove()函數
5.19.3 prelist_update()函數
5.19.4 find_pfxlist_reachable_router()函數
5.19.5 與在鏈條件有關的前綴和地址狀態
5.19.6 pfxlist_onlink_check()函數
5.19.7 nd6_prefix_onlink()函數
5.19.8 nd6_prefix_offlink()函數
5.20 無狀態地址自動配置函數
5.20.1 in6_ifadd()函數
5.20.2 in6_tmpifadd()函數
5.20.3 regen_tmpaddr()函數
5.21 重復地址檢測函數
5.21.1 nd6_dad_find()函數
5.21.2 nd6_dad_starttimer()函數
5.21.3 nd6_dad_stoptimer()函數
5.21.4 nd6_dad_start()函數
5.21.5 nd6_dad_stop()函數
5.21.6 nd6_dad_timer()函數
5.21.7 nd6_dad_duplicated()函數
5.21.8 nd6_dad_ns_output()函數
5.21.9 nd6_dad_ns_input()函數
5.21.10 nd6_dad_na_input()函數
5.22 其他函數
5.22.1 nd6_is_addr_neighbor()函數
5.22.2 nd6_output()函數
5.22.3 rt6_flush()函數
5.22.4 nd6_rtmsg()函數
第6章 傳輸層的實現
6.1 簡介
6.2 IPv6上的TCP和UDP
6.3 IPv6的偽首部
6.4 IPv4校驗和與IPv6校驗和的區別
6.5 IPv4映射的IPv6地址的用法
6.6 代碼介紹
6.7 對PCB和套接字的一般操作
6.7.1 IPv6 PCB的分配︰in_pcballoc()函數
6.7.2 綁定本地地址︰in6_pcbbind()函數
6.7.3 固定遠程地址︰in6_pcbconnect()函數
6.7.4 in6_pcbladdr()函數
6.7.5 搜索PCB條目︰in6_ pcblookup_local()函數
6.7.6 搜索IPv4映射的PCB︰in_pcblookup_local()函數
6.7.7 搜索PCB條目︰in6_pcblookup_hash()函數
6.7.8 搜索IPv4映射的PCB︰in_pcblookup_hash()函數
6.7.9 分離一個IPv6 PCB︰in6_pcbdetach()函數
6.7.10 控制報文信令︰in6_pcbnotify()函數
6.7.11 清空PCB緩存路由︰in6_rtchange()函數
6.7.12 獲取對等實體地址︰in6_setpeeraddr()函數
6.7.13 獲取本地地址︰in6_setsockaddr()函數
6.8 IPv6上的TCP
6.8.1 ip6protosw{}的IPv6上的TCP實例
6.8.2 TCP輸出
6.8.3 初始化首部︰tcp_fillheaders()函數
6.8.4 TCP輸入︰tcp6_input()和tcp_input()函數
6.8.5 TCP控制輸入︰tcp6_ctlinput()函數
6.8.6 TCP用戶請求
6.9 IPv6上的UDP
6.9.1 ip6protosw{}的IPv6上的UDP實例
6.9.2 UDP輸出︰udp6_output()函數
6.9.3 UDP輸入︰udp6_input()函數
6.9.4 UDP控制輸入︰udp6_ctlinput()函數
6.9.5 UDP用戶請求的處理
6.10 原始IPv6
6.10.1 原始IPv6統計數據
6.10.2 原始IPv6輸出︰rip6_output()函數
6.10.3 原始IPv6輸入︰rip6_input()函數
6.10.4 ICMPv6輸入︰icmp6_rip6_input()函數
6.10.5 原始IPv6控制輸入︰rip6_ctlinput()函數
6.10.6 原始IPv6控制輸出︰rip6_ctloutput()函數
6.10.7 原始IPv6用戶請求處理
6.11 對IPv4映射的IPv6地址操作的總結
6.12 用netstat查看IPv6連接
6.13 配置IPv4映射的IPv6地址支持
第7章 套接字API擴展
7.1 簡介
7.2 基本套接字API
7.2.1 基本定義
7.2.2 接口標識
7.2.3 在AF_INET6套接字上進行IPv4通信
7.2.4 地址和名字轉換函數
7.2.5 基本套接字選項
7.3 高級套接字API——[RFC3542]
7.3.1 一些高級的定義
7.3.2 IPv6原始套接字
7.3.3 輔助數據介紹
7.3.4 IPv6分組信息
7.3.5 處理IPv6擴展首部
7.3.6 路徑MTU的API
7.3.7 用于一批“r”命令的套接字擴展
7.3.8 列表總結套接字選項
7.4 IPv6套接字API的內核實現
7.4.1 代碼介紹
7.4.2 ip6_pktopts{}結構
7.4.3 IPv6套接字選項處理︰ip6_ctloutput()函數
7.4.4 獲取套接字選項︰ip6_getpcbopt()函數
7.4.5 設置套接字選項與輔助數據
7.4.6 清理︰ip6_freepcbopts()函數
7.4.7 IPv6多播套接字選項
7.4.8 IPv6原始套接字選項︰ip6_raw_ctloutput()函數
7.4.9 ICMPv6套接字選項︰rip6_ctloutput()函數
7.4.10 傳送輸入信息︰ip6_savecontrol()函數
7.5 套接字選項與輔助數據示例
7.5.1 發送路徑示例
7.5.2 接收路徑示例
7.6 庫函數的實現︰libinet6
7.6.1 inet_pton()函數和inet_pton6()函數
7.6.2 inet_ntop()函數和inet_ntop6()函數
7.6.3 getaddrinfo()函數
7.6.4 地址排序示例
7.6.5 freeaddrinfo()函數
7.6.6 gai_strerror()函數
7.6.7 getnameinfo()函數
7.6.8 其他庫函數
參考文獻
索引
 

早在1994年IETF接受這個現在被稱為IPv6的建議時,我就確信,如果沒有可以免費獲得的高質量的開源參考實現,這樣一個新的基礎協議即便不是不可能,也是很難被網絡群體接受、采納和部署的。

這種信念源于我對最初的TCP/IPv4協議,以及加州大學伯克利分校完成的這些協議的BSD實現的密切參與。我親眼目睹了BSD實現是如何對TCP/IPv4(通常統稱為因特網協議)的成功作出巨大貢獻的。我們需要能夠為IPv6扮演同樣角色的新的成就。

從開發者的視角為因特網世界作出貢獻是我們的責任,但那時,因特網的繁榮帶來的經濟沖擊已經使我伯克利的同事們忙得不可開交了。我知道這是我們的使命,為此,我們在WIDE項目中成立了IPv6工作組,這個工作組最終發展成了KAME項目。

對KAME項目組開發的軟件提出的要求之一就是︰說明IPv6協議是怎樣工作的,以及這些協議在實際環境中運行得如何。這是一項艱難且具有挑戰性的任務。在所有支持者長期、耐心的幫助下,KAME項目組成員以他們的勤勉和不懈努力完成了這個目標。所有主要的BSD變體都已經將KAME實現當作事實上的IPv6實現。在IETF會議上討論IPv6時也經常提到KAME。我堅信,在IPv6技術被廣泛接受並不斷被采納的過程中,KAME項目的成功起了非常重要的作用。

現在,我將部分注意力轉移到了采納這項技術後的知識傳遞方面。我們必須將我們的經驗和智慧與那些追隨KAME腳步以及將成為KAME主要用戶的新一代工程師們分享。雖然一個成熟的工程師可以直接從源代碼中進行學習,但一本由“知道怎樣做”的專家寫成的關于“如何去做”的好書所能提供的深入理解和指導,要遠比標準文檔和源代碼所能提供的多得多。

盡管現在有很多關于IPv6的學習資料都很不錯,但那些資料通常只是一些更易讀的協議規範。我一直渴望能有些與眾不同的東西,為下一代網絡高手提供一個創造性的舞台,使其在這個新技術舞台上做更多的事情。本書填補了這個空白。

本書揭示了KAME IPv6協議棧的所有細節,對每行代碼到底做了什麼以及為什麼要這樣設計都進行了解釋。通過閱讀本書,讀者可以深刻理解這一實現,並從整體上理解IPv6。

本書是關于KAME和IPv6的權威參考書,涵蓋了很多其他書中都沒有的內容。希望本書能夠成為你在IPv6方面最主要而且最好的參考書。

IPv6正向著無處不在的應用發展,我相信本書將會成為當今“因特網協議”的教科書。

Jun Murai博士
WIDE項目
慶應義塾(KEIO)大學副校長
網路書店 類別 折扣 價格
  1. 新書
    87
    $668