目 录
译者序
前言
第1章 概述 1
1.1 引言 1
1.2 源代码表示 1
1.2.1 将拥塞窗口设置为1 1
1.2.2 印刷约定 2
1.3 历史 2
1.4 应用编程接口 3
1.5 程序示例 4
1.6 系统调用和库函数 6
1.7 网络实现概述 6
1.8 描述符 7
1.9 mbuf与输出处理 11
1.9.1 包含插口地址结构的mbuf 11
1.9.2 包含数据的mbuf 12
1.9.3 添加IP和UDP首部 13
1.9.4 IP输出 14
1.9.5 以太网输出 14
1.9.6 UDP输出小结 14
1.10 输入处理 15
1.10.1 以太网输入 15
1.10.2 IP输入 15
1.10.3 UDP输入 16
1.10.4 进程输入 17
1.11 网络实现概述(续) 17
1.12 中断级别与并发 18
1.13 源代码组织 20
1.14 测试网络 21
1.15 小结 22
第2章 mbuf:存储器缓存 24
2.1 引言 24
2.2 代码介绍 27
2.2.1 全局变量 27
2.2.2 统计 28
2.2.3 内核统计 28
2.3 mbuf的定义 29
2.4 mbuf结构 29
2.5 简单的mbuf宏和函数 31
2.5.1 m_get函数 32
2.5.2 MGET宏 32
2.5.3 m_retry函数 33
2.5.4 mbuf锁 34
2.6 m_devget和m_pullup函数 34
2.6.1 m_devget函数 34
2.6.2 mtod和dtom宏 36
2.6.3 m_pullup函数和连续的协议首部 36
2.6.4 m_pullup和IP的分片与重组 37
2.6.5 TCP重组避免调用m_pullup 39
2.6.6 m_pullup使用总结 40
2.7 mbuf宏和函数的小结 40
2.8 Net/3联网数据结构小结 42
2.9 m_copy和簇引用计数 43
2.10 其他选择 47
2.11 小结 47
第3章 接口层 49
3.1 引言 49
3.2 代码介绍 49
3.2.1 全局变量 49
3.2.2 SNMP变量 50
3.3 ifnet结构 51
3.4 ifaddr结构 57
3.5 sockaddr结构 58
3.6 ifnet与ifaddr的专用化 59
3.7 网络初始化概述 60
3.8 以太网初始化 61
3.9 SLIP初始化 64
3.10 环回初始化 65
3.11 if_attach函数 66
3.12 ifinit函数 72
3.13 小结 73
第4章 接口:以太网 74
4.1 引言 74
4.2 代码介绍 75
4.2.1 全局变量 75
4.2.2 统计量 75
4.2.3 SNMP变量 76
4.3 以太网接口 77
4.3.1 leintr函数 79
4.3.2 leread函数 79
4.3.3 ether_input函数 81
4.3.4 ether_output函数 84
4.3.5 lestart函数 87
4.4 ioctl系统调用 89
4.4.1 ifioctl函数 90
4.4.2 ifconf函数 91
4.4.3 举例 94
4.4.4 通用接口ioctl命令 95
4.4.5 if_down和if_up函数 96
4.4.6 以太网、SLIP和环回 97
4.5 小结 98
第5章 接口:SLIP和环回 100
5.1 引言 100
5.2 代码介绍 100
5.2.1 全局变量 100
5.2.2 统计量 101
5.3 SLIP接口 101
5.3.1 SLIP线路规程:SLIPDISC 101
5.3.2 SLIP初始化:slopen和slinit 103
5.3.3 SLIP输入处理:slinput 105
5.3.4 SLIP输出处理:sloutput 109
5.3.5 slstart函数 111
5.3.6 SLIP分组丢失 116
5.3.7 SLIP性能考虑 117
5.3.8 slclose函数 117
5.3.9 sltioctl函数 118
5.4 环回接口 119
5.5 小结 121
第6章 IP编址 123
6.1 引言 123
6.1.1 IP地址 123
6.1.2 IP地址的印刷规定 123
6.1.3 主机和路由器 124
6.2 代码介绍 125
6.3 接口和地址小结 125
6.4 sockaddr_in结构 126
6.5 in_ifaddr结构 127
6.6 地址指派 128
6.6.1 ifioctl函数 130
6.6.2 in_control函数 130
6.6.3 前提条件:SIOCSIFADDR、
SIOCSIFNETMASK和
SIOCSIFDSTADDR 132
6.6.4 地址指派:SIOCSIFADDR 133
6.6.5 in_ifinit函数 133
6.6.6 网络掩码指派:SIOCSIFNETMASK 136
6.6.7 目的地址指派:SIOCSIFDSTADDR 137
6.6.8 获取接口信息 137
6.6.9 每个接口多个IP地址 138
6.6.10 附加IP地址:SIOCAIFADDR 139
6.6.11 删除IP地址:SIOCDIFADDR 140
6.7 接口ioctl处理 141
6.7.1 leioctl函数 141
6.7.2 slioctl函数 142
6.7.3 loioctl函数 143
6.8 Internet实用函数 144
6.9 ifnet实用函数 144
6.10 小结 145
第7章 域和协议 146
7.1 引言 146
7.2 代码介绍 146
7.2.1 全局变量 147
7.2.2 统计量 147
7.3 domain结构 147
7.4 protosw结构 148
7.5 IP 的domain和protosw结构 150
7.6 pffindproto和pffindtype函数 155
7.7 pfctlinput函数 157
7.8 IP初始化 157
7.8.1 Internet传输分用 157
7.8.2 ip_init函数 158
7.9 sysctl系统调用 159
7.10 小结 161
第8章 IP:网际协议 162
8.1 引言 162
8.2 代码介绍 163
8.2.1 全局变量 163
8.2.2 统计量 163
8.2.3 SNMP变量 164
8.3 IP分组 165
8.4 输入处理:ipintr函数 167
8.4.1 ipintr概观 167
8.4.2 验证 168
8.4.3 转发或不转发 171
8.4.4 重装和分用 173
8.5 转发:ip_forward函数 174
8.6 输出处理:ip_output函数 180
8.6.1 首部初始化 181
8.6.2 路由选择 182
8.6.3 源地址选择和分片 184
8.7 Internet检验和:in_cksum函数 186
8.8 setsockopt和getsockopt系统调用 190
8.8.1 PRCO_SETOPT的处理 192
8.8.2 PRCO_GETOPT的处理 193
8.9 ip_sysctl函数 193
8.10 小结 194
第9章 IP选项处理 196
9.1 引言 196
9.2 代码介绍 196
9.2.1 全局变量 196
9.2.2 统计量 197
9.3 选项格式 197
9.4 ip_dooptions函数 198
9.5 记录路由选项 200
9.6 源站和记录路由选项 202
9.6.1 save_rte函数 205
9.6.2 ip_srcroute函数 206
9.7 时间戳选项 207
9.8 ip_insertoptions函数 210
9.9 ip_pcbopts函数 214
9.10 一些限制 217
9.11 小结 217
第10章 IP的分片与重装 218
10.1 引言 218
10.2 代码介绍 219
10.2.1 全局变量 220
10.2.2 统计量 220
10.3 分片 220
10.4 ip_optcopy函数 223
10.5 重装 224
10.6 ip_reass函数 227
10.7 ip_slowtimo函数 237
10.8 小结 238
第11章 ICMP:Internet控制报文协议 239
11.1 引言 239
11.2 代码介绍 242
11.2.1 全局变量 242
11.2.2 统计量 242
11.2.3 SNMP变量 243
11.3 icmp结构 244
11.4 ICMP 的protosw结构 245
11.5 输入处理:icmp_input函数 246
11.6 差错处理 249
11.7 请求处理 251
11.7.1 回显询问:ICMP_ECHO和
ICMP_ECHOREPLY 252
11.7.2 时间戳询问:ICMP_TSTAMP和
ICMP_TSTAMPREPLY 253
11.7.3 地址掩码询问:ICMP_MASKREQ和
ICMP_MASKREPLY 253
11.7.4 信息询问:ICMP_IREQ和ICMP_
IREQREPLY 255
11.7.5 路由器发现:ICMP_ROUTERADVERT
和ICMP_ROUTERSOLICIT 255
11.8 重定向处理 255
11.9 回答处理 257
11.10 输出处理 257
11.11 icmp_error函数 258
11.12 icmp_reflect函数 261
11.13 icmp_send函数 265
11.14 icmp_sysctl函数 266
11.15 小结 266
第12章 IP多播 268
12.1 引言 268
12.2 代码介绍 269
12.2.1 全局变量 270
12.2.2 统计量 270
12.3 以太网多播地址 270
12.4 ether_multi结构 271
12.5 以太网多播接收 273
12.6 in_multi结构 273
12.7 ip_moptions结构 275
12.8 多播的插口选项 276
12.9 多播的TTL值 277
12.9.1 MBONE 278
12.9.2 扩展环搜索 278
12.10 ip_setmoptions函数 278
12.10.1 选择一个明确的多播接口:IP_
MULTICAST_IF 280
12.10.2 选择明确的多播TTL: IP_
MULTICAST_TTL 281
12.10.3 选择多播环回:IP_MULTICAST_
LOOP 281
12.11 加入一个IP多播组 282
12.11.1 in_addmulti函数 285
12.11.2 slioctl和loioctl函数:SIOCADDMULTI和SIOCDELMULTI 287
12.11.3 leioctl函数:SIOCADDMULTI和
SIOCDELMULTI 288
12.11.4 ether_addmulti函数 288
12.12 离开一个IP多播组 291
12.12.1 in_delmulti函数 292
12.12.2 ether_delmulti函数 293
12.13 ip_getmoptions函数 295
12.14 多播输入处理:ipintr函数 296
12.15 多播输出处理:ip_output函数 298
12.16 性能的考虑 301
12.17 小结 301
第13章 IGMP:Internet组管理协议 303
13.1 引言 303
13.2 代码介绍 304
13.2.1 全局变量 304
13.2.2 统计量 304
13.2.3 SNMP变量 305
13.3 igmp结构 305
13.4 IGMP的protosw的结构 306
13.5 加入一个组:igmp_joingroup函数 306
13.6 igmp_fasttimo函数 308
13.7 输入处理:igmp_input函数 311
13.7.1 成员关系查询:IGMP_HOST_
MEMBERSHIP_QUERY 312
13.7.2 成员关系报告:IGMP_HOST_
MEMBERSHIP_REPORT 313
13.8 离开一个组:igmp_leavegroup函数 314
13.9 小结 315
第14章 IP多播选路 316
14.1 引言 316
14.2 代码介绍 316
14.2.1 全局变量 316
14.2.2 统计量 317
14.2.3 SNMP变量 317
14.3 多播输出处理(续) 317
14.4 mrouted守护程序 318
14.5 虚拟接口 321
14.5.1 虚拟接口表 322
14.5.2 add_vif函数 324
14.5.3 del_vif函数 326
14.6 IGMP(续) 327
14.6.1 add_lgrp函数 328
14.6.2 del_lgrp函数 329
14.6.3 grplst_member函数 330
14.7 多播选路 331
14.7.1 多播选路表 334
14.7.2 del_mrt函数 335
14.7.3 add_mrt函数 336
14.7.4 mrtfind函数 337
14.8 多播转发:ip_mforward函数 338
14.8.1 phyint_send函数 343
14.8.2 tunnel_send函数 344
14.9 清理:ip_mrouter_done函数 345
14.10 小结 346
第15章 插口层 348
1