标题：IPv6详解:核心协议实现
内容简介
《IPv6详解》全面讲解IPv6及相关协议实现的事实标准KAME，揭示了KAMEIPv6协议栈的所有细节，对每行代码到底做了什么以及为什么要这样设计都进行了解释。共分7章，分别介绍IPv6地址结构、IPv6、ICMPv6、邻居发现和无状态地址自动配置、传输层协议及套接字API扩展。每章都包含两个主要部分：第一部分提供了作为RFC发布的主要协议规范的摘要，定义各种协议分组，解释每个分组中每个字段的含义和目的；第二部分则描述实现这些RFC的KAME的数据结构及功能。书的最后还提供了一些例子，说明如何编写既可以在IPv4网络上运行、又可以在IPv6网络上运行的可移植应用程序。
《IPv6详解》是IPv6的权威参考书，适合网络设计和开发人员阅读。此外，还适合作为高校相关专业网络课程的教学参考书。
作者简介
QingLi(李清)，BlueCoat系统公司资深架构师，负责领导下一代支持IPV6的安全代理应用系统的设计和开发工作。他曾在风河系统公司工作8年，是风河嵌入式IPV6产品的首席架构师。他拥有多项美国专利，并著有Real-TimeConceptsforEmbeddedSystems等畅销书。他还是FreeBSD操作系统项目活跃的开发者。
TatuyaJinmei(神明达哉)，东芝公司研究与开发中心的科学。KAME项目核心开发人员。2003年在日本庆应义塾大学获得博士学位。
KeiichiShima(岛庆一)，日本InternetInitiative公司的资深研究人员。他的研究领域是IPv6和IPv6移动性。KAME项目核心开发人员，开发了移动IPv6/NEMO基本支持协议栈。现在正致力于BSD操作系统中新的移动栈（SHISA栈）的研究。
编辑推荐
“阅读《IPv6详解》是一种享受，让我想起了RiehardStevens的《TCP/IP详解》，《IPv6详解》的技术深度完一可以与之媲美。”
——JimBound北美IPV6工作组主席
“在IPV6时代，《IPv6详解》将取代RiehardStevens的《TCP/IP详解》一书。我强烈推荐给所有程序员阅读。”
——JunichiroHaginoEAME项目核心开发者
目录
第1章绪论1
1.1引言1
1.2IPv6和KAME的简史1
1.3KAME发行版概述5
1.3.1源代码树结构5
1.3.2构建过程6
1.4BSD网络实现概述8
1.5源代码描述10
1.5.1排版约定10
1.5.2源代码描述示例11
1.5.3预处理器变量12
1.5.4网络设备与体系结构假设12
1.6mbuf与IPv613
1.6.1常见的mbuf操纵宏和函数14
1.6.2mbuf标签14
1.6.3IPv6的mbuf要求18
1.6.4诊断mbuf链20
第2章IPv6编址体系结构22
2.1引言22
2.2IPv6地址22
2.3IPv6地址的文本表示23
2.4地址范围24
2.4.1范围区域25
2.4.2区域索引27
2.4.3范围受限地址的文本表示29
2.4.4单播站点本地地址的废弃30
2.5IPv6地址格式31
2.5.1接口标识符的产生32
2.5.2有关地址格式的注解33
2.5.3多播地址格式33
2.6节点地址要求35
2.7IPv6地址空间管理35
2.8代码介绍36
2.8.1IPv6地址结构：in6_addr{}与sockaddr_in6{}36
2.8.2宏与变量37
2.9对范围区域的处理39
2.9.1范围区域的初始化39
2.9.2范围区域ID40
2.9.3地址结构中的区域ID41
2.9.4与范围相关的实用函数43
2.10接口地址结构49
2.10.1ifaddr{}和in6_ifaddr{}结构50
2.10.2in6_ifreq{}和in6_aliasreq{}结构52
2.10.3多播地址结构53
2.11IPv6前缀结构56
2.12地址操纵程序概述57
2.13IPv6的接口初始化60
2.13.1in6_if_up()函数60
2.13.2in6_ifattach()函数61
2.13.3in6_ifattach_loopback{}函数64
2.13.4in6_ifattach_linklocal()函数65
2.13.5get_ifid()函数69
2.13.6get_hw_ifid()函数71
2.13.7get_rand_ifid()函数75
2.13.8in6if_do_dad()函数76
2.14IPv6接口地址配置77
2.14.1in6_control()函数77
2.14.2in6_update_ifa()函数83
2.14.3in6_joingroup()和in6_leavegroup()函数95
2.14.4in6_addmulti()和in6_delmulti()函数96
2.14.5in6_ifinit()函数98
2.14.6in6_ifaddloop()和in6_ifloop_request()函数100
2.15删除IPv6地址102
2.15.1in6_purgeaddr()函数103
2.15.2in6_ifremloop()函数104
2.15.3in6_unlink_ifa()函数105
2.16用地址配置工具进行的操作106
第3章IPv6110
3.1引言110
3.2IPv6首部格式110
3.3IPv6扩展首部112
3.3.1扩展首部的顺序113
3.3.2逐跳选项首部113
3.3.3目的选项首部114
3.3.4路由首部114
3.3.5片首部116
3.3.6IPv6选项118
3.4源地址选择120
3.4.1默认地址选择120
3.4.2源地址选择121
3.4.3目的地址选择123
3.5代码介绍124
3.5.1统计数据125
3.5.2首部结构126
3.5.3ip6protosw{}结构130
3.6mbuf中的IPv6分组地址信息132
3.6.1ip6_setdstifaddr()函数134
3.6.2ip6_getdstifaddr()函数134
3.6.3ip6_setpktaddrs()函数134
3.6.4ip6_getpktaddrs()函数136
3.7输入处理：ip6_input()函数136
3.8逐跳选项首部的处理：ip6_hopopts_input()函数150
3.8.1对每个选项进行处理：ip6_process_hopopts()函数151
3.8.2处理未知选项：ip6_unknown_opt()函数155
3.9对目的选项首部的处理：dest6_input()函数156
3.10已分片分组的重装157
3.10.1用于分组重装的结构157
3.10.2frag6_input()函数160
3.11对路由首部的处理：route6_input()函数172
3.12转发：ip6_forward()函数177
3.13输出处理186
3.13.1源地址选择：in6_selectsrc()函数187
3.13.2路由选择：ip6_selectroute()函数199
3.13.3ip6_output()函数206
3.13.4构建扩展首部：ip6_copyexthdr()函数237
3.13.5分割首部：ip6_splithdr()函数237
3.13.6插入特大净荷选项：ip6_insert_jumboopt()函数238
3.13.7分片：ip6_insertfraghdr()函数241
3.13.8路径MTU判断：ip6_getpmtu()函数242
3.13.9多播环回：ip6_mloopback()函数245
第4章ICMPv6247
4.1引言247
4.2ICMPv6报文247
4.2.1目的不可达报文248
4.2.2分组太长报文249
4.2.3超时报文250
4.2.4参数问题报文251
4.2.5回送请求报文252
4.2.6回送应答报文252
4.2.7ICMPv6报文处理规则253
4.3PMTU发现机制253
4.4节点信息查询254
4.4.1节点信息报文的格式255
4.4.2NOOP查询257
4.4.3支持的Qtype查询257
4.4.4节点名查询257
4.4.5节点地址查询258
4.4.6IPv4地址查询259
4.5代码介绍260
4.5.1统计数据260
4.5.2ICMPv6首部262
4.6ICMPv6输入处理263
4.6.1icmp6_input()函数263
4.6.2错误通知：icmp6_notify_error()函数272
4.7PMTU发现的实现280
4.8ICMPv6输出处理283
4.8.1发送错误：icmp6_error()函数284
4.8.2错误速率限制：icmp6_ratelimit()函数290
4.8.3icmp6_reflect()函数291
4.9节点信息查询的实现297
4.9.1类型和变量297
4.9.2ping6命令：发送查询298
4.9.3ping6命令：接收应答303
4.9.4ping6命令：打印支持的Qtype309
4.9.5ping6命令：打印节点地址312
4.9.6查询处理：ni6_input()函数314
4.9.7节点名的操作322
4.9.8创建节点地址应答：ni6_store_addrs()函数330
4.10节点信息操作333
第5章邻居发现和无状态地址自动配置335
5.1引言335
5.2邻居发现协议概述336
5.3无状态地址自动配置概述336
5.4邻居发现协议报文337
5.5邻居发现协议报文的交换示例338
5.6邻居发现协议分组类型及格式340
5.6.1路由器请求报文340
5.6.2路由器广告报文341
5.6.3邻居请求报文344
5.6.4邻居广告报文344
5.6.5重定向报文346
5.7邻居发现选项类型及格式347
5.7.1链路层地址选项347
5.7.2前缀信息选项348
5.7.3重定向首部选项349
5.7.4MTU选项349
5.7.5路由信息选项350
5.8下一跳判定和地址解析351
5.9邻居不可达检测算法351
5.10无状态地址自动配置352
5.10.1地址的构成和地址状态353
5.10.2重复地址检测算法354
5.10.3处理路由器广告355
5.10.4隐私扩展356
5.11路由器特有的操作357
5.11.1发送未经请求的路由器广告359
5.11.2处理路由器请求359
5.11.3处理路由器广告360
5.12主机特有的操作360
5.12.1发送路由器请求361
5.12.2处理路由器广告361
5.12.3默认路由器选项362
5.13代码介绍362
5.13.1邻居发现报文定义362
5.13.2邻居缓存：llinfo_nd6{}结构365
5.13.3操作变量：nd_ifinfo{}结构367
5.13.4默认路由器：nd_defrouter{}结构368
5.13.5前缀：nd_prefix{}结构369
5.13.6前缀控制：nd_prefixctl{}结构370
5.13.7邻居发现报文选项：nd_opts{}结构371
5.13.8DAD队列条目：dadq{}结构372
5.13.9IPv6地址：in6_ifaddr{}结构372
5.13.10目的地缓存372
5.13.11操作常量372
5.14初始化函数373
5.14.1nd6_init()函数373
5.14.2nd6_ifattach()函数374
5.15邻居缓存管理函数375
5.15.1nd6_rtrequest()函数375
5.15.2nd6_cache_lladdr()函数385
5.15.3nd6_lookup()函数395
5.15.4nd6_free()函数398
5.15.5nd6_timer函数401
5.16邻居发现协议报文处理函数408
5.16.1nd6_ns_output()函数408
5.16.2nd6_ns_input()函数414
5.16.3nd6_na_input()函数422
5.16.4nd6_na_output()函数432
5.16.5nd6_rs_input()函数437
5.16.6nd6_ra_input()函数440
5.16.7icmp6_redirect_input()函数447
5.16.8icmp6_redirect_output()函数454
5.17邻居发现协议报文选项处理函数461
5.17.1nd6_option_init()函数461
5.17.2nd6_option()函数462
5.17.3nd6_options()函数463
5.18默认路由器管理函数465
5.18.1defrouter_addreq()函数465
5.18.2defrouter_delreq()函数466
5.18.3defrouter_addifreq()函数467
5.18.4defrouter_delifreq()函数469
5.18.5defrouter_lookup()函数470
5.18.6defrouter_select()函数471
5.18.7defrtrlist_del()函数475
5.18.8defrtrlist_update()函数477
5.19前缀管理函数479
5.19.1nd6_prelist_add()函数479
5.19.2prelist_remove()函数481
5.19.3prelist_update()函数482
5.19.4find_pfxlist_reachable_router()函数491
5.19.5与在链条件有关的前缀和地址状态491
5.19.6pfxlist_onlink_check()函数493
5.19.7nd6_prefix_onlink()函数497
5.19.8nd6_prefix_offlink()函数500
5.20无状态地址自动配置函数503
5.20.1in6_ifadd()函数503
5.20.2in6_tmpifadd()函数506
5.20.3regen_tmpaddr()函数509
5.21重复地址检测函数511
5.21.1nd6_dad_find()函数511
5.21.2nd6_dad_starttimer()函数512
5.21.3nd6_dad_stoptimer()函数512
5.21.4nd6_dad_start()函数512
5.21.5nd6_dad_stop()函数515
5.21.6nd6_dad_timer()函数516
5.21.7nd6_dad_duplicated()函数519
5.21.8nd6_dad_ns_output()函数520
5.21.9nd6_dad_ns_input()函数521
5.21.10nd6_dad_na_input()函数522
5.22其他函数523
5.22.1nd6_is_addr_neighbor()函数523
5.22.2nd6_output()函数525
5.22.3rt6_flush()函数531
5.22.4nd6_rtmsg()函数533
第6章传输层的实现534
6.1简介534
6.2IPv6上的TCP和UDP534
6.3IPv6的伪首部535
6.4IPv4校验和与IPv6校验和的区别536
6.5IPv4映射的IPv6地址的用法536
6.6代码介绍536
6.7对PCB和套接字的一般操作544
6.7.1IPv6PCB的分配：in_pcballoc()函数544
6.7.2绑定本地地址：in6_pcbbind()函数546
6.7.3固定远程地址：in6_pcbconnect()函数554
6.7.4in6_pcbladdr()函数556
6.7.5搜索PCB条目：in6_pcblookup_local()函数558
6.7.6搜索IPv4映射的PCB：in_pcblookup_local()函数561
6.7.7搜索PCB条目：in6_pcblookup_hash()函数563
6.7.8搜索IPv4映射的PCB：in_pcblookup_hash()函数565
6.7.9分离一个IPv6PCB：in6_pcbdetach()函数567
6.7.10控制报文信令：in6_pcbnotify()函数569
6.7.11清空PCB缓存路由：in6_rtchange()函数573
6.7.12获取对等实体地址：in6_setpeeraddr()函数573
6.7.13获取本地地址：in6_setsockaddr()函数575
6.8IPv6上的TCP576
6.8.1ip6protosw{}的IPv6上的TCP实例576
6.8.2TCP输出577
6.8.3初始化首部：tcp_fillheaders()函数582
6.8.4TCP输入：tcp6_input()和tcp_input()函数582
6.8.5TCP控制输入：tcp6_ctlinput()函数587
6.8.6TCP用户请求590
6.9IPv6上的UDP596
6.9.1ip6protosw{}的IPv6上的UDP实例596
6.9.2UDP输出：udp6_output()函数597
6.9.3UDP输入：udp6_input()函数602
6.9.4UDP控制输入：udp6_ctlinput()函数609
6.9.5UDP用户请求的处理612
6.10原始IPv6618
6.10.1原始IPv6统计数据619
6.10.2原始IPv6输出：rip6_output()函数619
6.10.3原始IPv6输入：rip6_input()函数623
6.10.4ICMPv6输入：icmp6_rip6_input()函数627
6.10.5原始IPv6控制输入：rip6_ctlinput()函数632
6.10.6原始IPv6控制输出：rip6_ctloutput()函数633
6.10.7原始IPv6用户请求处理637
6.11对IPv4映射的IPv6地址操作的总结644
6.12用netstat查看IPv6连接648
6.13配置IPv4映射的IPv6地址支持650
第7章套接字API扩展652
参考文献797
索引801
……