第1章 IPv6单播路由选择协议 1
1.1 引言 1
1.2 路由选择概念概述 2
1.3 基于向量的算法和链路状态算法概述 4
1.3.1 距离向量算法 4
1.3.2 路径向量算法 5
1.3.3 链路状态算法 6
1.4 RIPng简介 7
1.4.1 RIPng报文格式 8
1.4.2 RIPng操作 11
1.4.3 RIPng存在的问题 12
1.5 BGP4+简介 13
1.5.1 BGP4+操作 14
1.5.2 BGP4+报文 17
1.5.3 路径属性 20
1.5.4 BGP4+的IPv6扩展 22
1.5.5 BGP4+路由选择过程 24
1.6 OSPFv3简介 25
1.6.1 路由器邻接和LSDB同步 25
1.6.2 区域类型和路由器分类 26
1.6.3 链路状态广告和LSA类型 27
1.6.4 LSA格式 28
1.6.5 OSPF树的构造和路由计算 34
1.7 代码介绍 37
1.8 BSD内核中的IPv6路由表 38
1.9 路由选择API 42
1.9.1 路由选择套接字 42
1.9.2 通过sysctl()转储路由表 48
1.10 route6d守护进程概述 51
1.11 公用数据结构、例程和全局变量 51
1.11.1 RIPng报文结构 52
1.11.2 route6d的路由表 52
1.11.3 本地接口的结构 54
1.11.4 route6d路由过滤器条目 56
1.11.5 子例程和全局变量 56
1.12 接口配置 57
1.12.1 ifconfig()函数 58
1.12.2 ifconfigl()函数 60
1.13 RIPng协议操作 63
1.13.1 sendrequest()函数 64
1.13.2 riprecv()函数 65
1.13.3 riprequest()函数 77
1.13.4 ripsend()函数 77
1.13.5 ripalarm()函数 84
1.14 使用route6d的路由选择操作 85
1.14.1 叶子网络 85
1.14.2 简单环状网 87
1.14.3 层次网 90
第2章 IPv6多播技术 92
2.1 引言 92
2.2 IPv6多播地址到第2层多播地址的映射 92
2.3 多播监听发现协议 93
2.3.1 MLD协议报文格式 93
2.3.2 路由器警告选项 94
2.3.3 源地址选择 94
2.3.4 目的地址选择 94
2.3.5 MLD查询器 95
2.3.6 操作变量 95
2.3.7 MLD的加入进程 95
2.3.8 MLD离开进程 96
2.4 多播路由选择的基本原理 97
2.4.1 反向路径转发 97
2.4.2 多播路由选择模型 97
2.4.3 协议无关多播 101
2.4.4 PIM的IPv6特定问题 104
2.4.5 IPv6多播的未来:MLDv2和SSM 105
2.5 代码介绍 106
2.6 MLD实现 107
2.6.1 类型和结构 108
2.6.2 mld6_init()函数 109
2.6.3 加入组:mld6_start_listening()函数 111
2.6.4 离开组:mld6_stop_listening()函数 112
2.6.5 输入处理:mld6_input()函数 113
2.6.6 mld6_fasttimeo()函数 117
2.6.7 mld6_sendpkt()函数 118
2.6.8 mld_allocbuf()函数 121
2.7 IPv6多播接口:mif6{}结构 122
2.8 IPv6多播路由选择API 124
2.8.1 ip6_mrouter_set()函数 125
2.8.2 ip6_mrouter_init()函数 126
2.8.3 ip6_mrouter_get()函数 128
2.8.4 set_pim6()函数 128
2.8.5 add_m6if()函数 129
2.8.6 del_m6if()函数 131
2.8.7 ip6_mrouter_done()函数 132
2.8.8 mrt6_ioctl()函数 135
2.8.9 get_mif6_cnt()函数 135
2.9 IPv6多播转发缓存 136
2.9.1 add_m6fc()函数 137
2.9.2 del_m6fc()函数 141
2.9.3 expire_upcalls()函数 142
2.9.4 get_sg_cnt()函数 143
2.10 IPv6多播转发 144
2.10.1 ip6_mforward()函数 145
2.10.2 ip6_mdq()函数 152
2.10.3 phyint_send()函数 158
2.10.4 register_send()函数 160
2.10.5 socket_send()函数 162
2.10.6 pim6_input()函数 163
2.11 IPv6多播操作 169
2.11.1 ifmcstat命令 169
2.11.2 启动IPv6多播路由选择 169
2.11.3 pim6dd和pim6sd路由选择守护进程 170
2.11.4 pim6stat输出 171
2.11.5 netstat命令 172
第3章 IPv6的DNS 174
3.1 引言 174
3.2 DNS的定义和协议基础 174
3.2.1 DNS、域和区域 174
3.2.2 资源记录和区域文件 176
3.2.3 DNS事务和分组格式 177
3.2.4 名字解析和缓存 179
3.3 DNS中与IPv6相关的主题 181
3.3.1 AAAA资源记录 181
3.3.2 IPv6的DNS反向树 182
3.3.3 DNS的IPv6传输 182
3.3.4 分组大小的问题和EDNS0 183
3.3.5 DNS服务器对AAAA的不当操作 186
3.3.6 废弃的标准 188
3.4 IPv6 DNS解析器的实现 189
3.4.1 _dns_getaddrinfo()函数 191
3.4.2 getanswer()函数 196
3.4.3 res_queryN()函数 204
3.4.4 解析器声明结构 206
3.4.5 res_init()函数 208
3.4.6 res_send()函数 211
3.4.7 IPv6反向查找:_dns_ghbyaddr()函数 219
3.5 BIND的IPv6 DNS操作 223
3.5.1 BIND9概述 224
3.5.2 获得BIND9 224
3.5.3 构建和安装BIND9 225
3.5.4 IPv6操作的BIND9配置 225
3.5.5 实现的相关要点 231
3.5.6 完整的配置示例 238
3.5.7 dig和host工具 241
第4章 DHCPv6 243
4.1 引言 243
4.2 DHCPv6协议概述 243
4.2.1 DHCPv6案例 244
4.2.2 DHCPv6的定义 246
4.2.3 DHCPv6报文交换 249
4.2.4 DHCPv6选项总结 259
4.2.5 与邻居发现的交互 265
4.2.6 与DHCPv4的比较 265
4.3 代码介绍 265
4.4 客户实现 271
4.4.1 客户特定的数据结构 272
4.4.2 client6_mainloop()函数 277
4.4.3 client6_timo()函数 278
4.4.4 client6_send()函数 282
4.4 5 client6_recv()函数 287
4.4.6 client6_recvadvert()函数 289
4.4.7 client6_recvreply()函数 294
4.4.8 处理身份关联 299
4.4.9 update_ia()函数 302
4.4.10 update_address()函数 306
4.4.11 reestablish_ia()函数 310
4.4.12 ia_timo()函数 315
4.4.13 释放资源 320
4.5 服务器实现 323
4.5.1 server6_mainloop()函数 326
4.5.2 server6_recv()函数 327
4.5.3 process_relayforw()函数 331
4.5.4 react_solicit()函数 334
4.5.5 react_request()函数 340
4.5.6 make_ia()函数 345
4.5.7 react_renew()函数 355
4.5.8 react_rebind()函数 358
4.5.9 binding_timo()函数 365
4.5.10 react_release()函数 367
4.5.11 react_informreq()函数 371
4.5.12 server6_send()函数 373
4.6 中继代理实现 377
4.6.1 relay6_loop()函数 378
4.6.2 relay6_recv()函数 379
4.6.3 relay_to_server()函数 382
4.6.4 relay_to_client()函数 387
4.7 DHCPv6鉴别实现 390
4.7.1 与DHCPv6鉴别相关的数据结构 390
4.7.2 set_auth()函数 392
4.7.3 process_auth()函数(客户端) 394
4.7.4 process_auth()函数(服务器端) 397
4.8 DHCPv6操作 403
4.8.1 构建DHCPv6实现 403
4.8.2 配置DUID 404
4.8.3 配置DHCPv6服务器 404
4.8.4 配置DHCPv6客户 405
4.8.5 配置DHCPv6中继代理 408
4.8.6 配置DHCPv6鉴别 409
4.8.7 配置控制命令密钥 409
4.8.8 DHCPv6服务操作 410
第5章 移动IPv6 416
5.1 引言 416
5.2 移动IPv6概述 416
5.2.1 节点的类型 417
5.2.2 移动IPv6运行的基本过程 418
5.3 首部扩展 421
5.3.1 对齐要求 422
5.3.2 归属地址选项 422
5.3.3 类型2路由首部 423
5.3.4 移动首部 423
5.3.5 移动选项 429
5.3.6 邻居发现报文 431
5.3.7 ICMPv6报文 433
5.4 移动IPv6的过程 436
5.4.1 协议常量和变量 436
5.4.2 归属注册 437
5.4.3 双向隧道技术 439
5.4.4 截获移动节点分组 440
5.4.5 返回归属 441
5.5 路由优化 442
5.5.1 迂回路由 443
5.5.2 发送发起报文 443
5.5.3 响应发起报文 444
5.5.4 计算共享密钥 445
5.5.5 验证报文 446
5.5.6 安全性考虑 446
5.5.7 注销通信节点绑定 447
5.5.8 向后兼容性 447
5.6 移动检测 448
5.7 动态归属代理地址发现 449
5.8 移动前缀请求/广告 451
5.9 与IPsec的关系 452
5.10 代码介绍 454
5.11 与移动IPv6相关的结构 455
5.11.1 文件 455
5.11.2 移动首部报文:ip6_mh{}结构 456
5.11.3 绑定刷新请求报文:ip6_mh_binding_request{}结构 456
5.11.4 归属测试发起报文:ip6_mh_home_test_init{}结构 457
5.11.5 转交测试发起报文:ip6_mh_careof_test_init{}结构 457
5.11.6 归属测试报文:ip6_mh_home_test{}结构 458
5.11.7 转交测试报文:ip6_mh_careof_test{}结构 459
5.11.8 绑定更新报文:ip6_mh_binding_update{}结构 460
5.11.9 绑定确认报文:ip6_mh_binding_ack{}结构 461
5.11.10 绑定错误报文:ip6_mh_binding_error{}结构 462
5.11.11 移动选项报文的结构 462
5.11.12 移动选项报文:ip6_mh_opt{}结构 463
5.11.13 绑定刷新建议选项:ip6_mh_opt_refresh_advice{}结构 463
5.11.14 替换转交地址选项:ip6_mh_opt_altcoa{}结构 463
5.11.15 现时索引选项:ip6_mh_opt_nonce_index{}结构 464
5.11.16 授权数据选项:ip6_mh_opt_auth_data{}结构 464
5.11.17 内部移动选项:mip6_mobility_options{}结构 465
5.11.18 归属地址选项:ip6_opt_home_address{}结构 465
5.11.19 类型2路由首部:ip6_rthdr2{}结构 466
5.11.20 修改的路由器广告报文:nd_router_advert{}结构 466
5.11.21 修改的前缀信息选项:nd_opt_prefix_info{}结构 467
5.11.22 广告间隔选项:nd_opt_adv_interval{}结构 467
5.11.23 归属代理信息选项:nd_opt_homeagent_info{}结构 468
5.11.24 动态归属代理地址发现请求报文:mip6_dhaad_req{}结构 468
5.11.25 动态归属代理地址发现应答报文:mip6_dhaad_rep{}结构 469
5.11.26 移动前缀请求报文:mip6_prefix_solicit{}结构 469
5.11.27 移动前缀广告报文:mip6_prefix_advert{}结构 469
5.11.28 绑定缓存条目:mip6_bc{}结构 470
5.11.29 绑定更新列表条目:mip6_bu{}结构 471
5.11.30 归属代理条目:mip6_ha{}结构 473
5.11.31 前缀条目:mip6_prefix{}结构 474
5.11.32 归属虚拟接口:hif_softc{}结构 475
5.12 宏和类型定义 479
5.13 全局变量 480
5.14 实用函数 480
5.14.1 文件 481
5.14.2 创建IPv6首部 481
5.14.3 校验和计算 482
5.15 常规移动首部处理 484
5.15.1 文件 484
5.15.2 移动首部输入 484
5.15.3 生成绑定错误报文 490
5.15.4 绑定错误报文的速度限制 491
5.15.5 绑定错误报文的创建 492
5.15.6 向原始套接字传递移动首部报文 493
5.16 归属代理和通信节点 496
5.16.1 文件 496
5.16.2 绑定更新报文的输入 497
5.16.3 绑定缓存条目的管理 504
5.16.4 移动选项的处理 512
5.16.5 通信节点绑定更新报文的确认 514
5.16.6 Kbm和授权数据计算 515
5.16.7 通信节点对绑定缓存条目的管理 520
5.16.8 发送绑定刷新请求报文 522
5.16.9 归属注册的处理过程 526
5.16.10 DAD过程 532
5.16.11 代理邻居发现的控制 538
5.16.12 归属注销的过程 542
5.16.13 发送绑定确认报文 545
5.16.14 现时和节点关键字的管理 551
5.16.15 接收归属地址选项 554
5.16.16 通过隧道向移动节点发送分组 561
5.16.17 恢复临时禁用的代理条目 565
5.16.18 接收ICMPv6错误报文 566
5.16.19 归属代理列表的管理 570
5.16.20 前缀列表的管理 583
5.16.21 发送移动前缀广告报文 583
5.16.22 构造净荷 585
5.17 移动节点 587
5.17.1 文件 587
5.17.2 绑定更新列表条目的管理 588
5.17.3 移动检测 596
5.17.4 配置归属地址 606
5.17.5 发送绑定更新报文 615
5.17.6 接收绑定确认报文 629
5.17.7 接收类型2路由首部 641
5.17.8 接收绑定刷新请求报文 644
5.17.9 接收绑定错误报文 646
5.17.10 源地址选择 649
5.17.11 归属代理列表的管理 653
5.17.12 前缀信息的管理 661
5.17.13 通过路由器广告报文接收前缀信息 672
5.17.14 发送移动前缀请求报文 680
5.17.15 接收移动前缀广告报文 682
5.17.16 发送动态归属代理地址发现请求报文 690
5.17.17 接收动态归属代理地址发现应答报文 693
5.17.18 接收ICMPv6错误报文 698
5.17.19 状态机 700
5.17.20 主状态机 701
5.17.21 从状态机 718
5.17.22 虚拟归属接口 725
5.17.23 迂回路由过程和路由优化 737
5.17.24 路由优化通信 753
5.17.25 隧道控制 762
5.17.26 从隧道中接收分组 765
5.17.27 I/O控制 767
5.18 运行移动IPv6 770
5.18.1 重建支持移动IPv6扩展的内核 770
5.18.2 重建用户空间程序 770
5.18.3 IPsec信令保护 771
5.18.4 配置节点 773
5.18.5 查看状态信息 774
5.18.6 查看统计信息 775
5.19 mip6control手册 776
第6章 IPv6与IP安全 778
6.1 引言 778
6.2 鉴别首部 778
6.3 ESP 780
6.4 传输模式和隧道模式 781
6.5 安全关联数据库 783
6.5.1 安全策略数据库 783
6.5.2 安全关联数据库 784
6.5.3 SAD和SPD示例 784
6.6 IPsec流量处理 785
6.7 SPD和SAD管理 786
6.8 手工配置 787
6.8.1 配置文件格式 788
6.8.2 处理SP条目的示例 791
6.8.3 处理SA条目的示例 793
6.9 ISAKMP概述 794
6.9.1 ISAKMP交换 795
6.9.2 解释域 797
6.9.3 IKE协议 797
6.10 Racoon操作 798
6.10.1 配置Racoon 798
6.10.2 配置文件格式 798
6.11 场景 803
6.11.1 在3个网络间创建VPN 803
6.11.2 创建星型拓扑VPN 808
6.11.3 使用传输模式的IP安全 812
6.11.4 从公共接入点到服务器的连接 813
参考文献 816
索引 821