目      录
译者序
前言
第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
15.1   引言	348
15.2   代码介绍	349
15.3   socket结构	349
15.4   系统调用	354
15.4.1   举例	355
15.4.2   系统调用小结	355
15.5   进程、描述符和插口	357
15.6    socket系统调用	358
15.6.1   socreate函数	359
15.6.2   超级用户特权	361
15.7    getsock和sockargs函数	361
15.8    bind系统调用	363
15.9    listen系统调用	364
15.10   tsleep和wakeup函数	365
15.11   accept系统调用	366
15.12   sonewconn和soisconnected
函数	369
15.13   connect系统调用	372
15.13.1   soconnect函数	374
15.13.2   切断无连接插口和外部地址的
关联	375
15.14   shutdown系统调用	375
15.15   close系统调用	377
15.15.1   soo_close函数	377
15.15.2   soclose函数	378
15.16   小结	380
第16章   插口I/O	381
16.1   引言	381
16.2   代码介绍	381
16.3   插口缓存	381
16.4   write、writev、sendto和sendmsg
系统调用	384
16.5   sendmsg系统调用	387
16.6   sendit函数	388
16.6.1   uiomove函数	389
16.6.2   举例	390
16.6.3   sendit代码	391
16.7   sosend函数	392
16.7.1   可靠的协议缓存	393
16.7.2   不可靠的协议缓存	393
16.7.3   sosend函数小结	401
16.7.4   性能问题	401
16.8   read、readv、recvfrom和recvmsg
         系统调用	401
16.9   recvmsg系统调用	402
16.10   recvit函数	403
16.11   soreceive函数	405
16.11.1   带外数据	406
16.11.2   举例	406
16.11.3   其他的接收操作选项	407
16.11.4   接收缓存的组织：报文边界	407
16.11.5   接收缓存的组织：没有报文边界	408
16.11.6   控制信息和带外数据	409
16.12   soreceive代码	410
16.13   select系统调用	421
16.13.1   selscan函数	425
16.13.2   soo_select函数	425
16.13.3   selrecord函数	427
16.13.4   selwakeup函数	428
16.14   小结	429
第17章   插口选项	431
17.1   引言	431
17.2   代码介绍	431
17.3   setsockopt系统调用	432
17.4   getsockopt系统调用	437
17.5   fcntl和ioctl系统调用	440
17.5.1   fcntl代码	441
17.5.2   ioctl代码	443
17.6   getsockname系统调用	444
17.7   getpeername系统调用	445
17.8   小结	447
第18章   Radix树路由表	448
18.1   引言	448
18.2   路由表结构	448
18.3   选路插口	456
18.4   代码介绍	456
18.4.1   全局变量	458
18.4.2   统计量	458
18.4.3   SNMP变量	459
18.5   Radix结点数据结构	460
18.6   选路结构	463
18.7   初始化：route_init和rtable_init
函数	465
18.8   初始化：rn_init和rn_inithead
函数	468
18.9   重复键和掩码列表	471
18.10   rn_match函数	473
18.11   rn_search函数	480
18.12   小结	481
第19章   选路请求和选路消息	482
19.1   引言	482
19.2   rtalloc和rtalloc1函数	482
19.3   宏RTFREE和rtfree函数	484
19.4   rtrequest函数	486
19.5   rt_setgate函数	491
19.6   rtinit函数	493
19.7   rtredirect函数	495
19.8   选路消息的结构	498
19.9   rt_missmsg函数	501
19.10   rt_ifmsg函数	503
19.11   rt_newaddrmsg函数	504
19.12   rt_msg1函数	505
19.13   rt_msg2函数	507
19.14   sysctl_rtable函数	510
19.15   sysctl_dumpentry函数	514
19.16   sysctl_iflist函数	515
19.17   小结	517
第20章   选路插口	518
20.1   引言	518
20.2   routedomain和protosw结构	518
20.3   选路控制块	519
20.4   raw_init函数	520
20.5   route_output函数	520
20.6   rt_xaddrs函数	530
20.7   rt_setmetrics函数	531
20.8   raw_input函数	532
20.9   route_usrreq函数	534
20.10   raw_usrreq函数	535
20.11   raw_attach、raw_detach和raw_disconnect函数	539
20.12   小结	540
第21章   ARP：地址解析协议	542
21.1   介绍	542
21.2   ARP和路由表	542
21.3   代码介绍	544
21.3.1   全局变量	544
21.3.2   统计量	544
21.3.3   SNMP变量	546
21.4   ARP结构	546
21.5   arpwhohas函数	548
21.6   arprequest函数	548
21.7   arpintr函数	551
21.8   in_arpinput函数	552
21.9   ARP定时器函数	557
21.9.1   arptimer函数	557
21.9.2   arptfree函数	557
21.10   arpresolve函数	558
21.11   arplookup函数	562
21.12   代理ARP	563
21.13   arp_rtrequest函数	564
21.14   ARP和多播	569
21.15   小结	570
第22章   协议控制块	572
22.1   引言	572
22.2   代码介绍	573
22.2.1   全局变量	574
22.2.2   统计量	574
22.3   inpcb的结构	574
22.4   in_pcballoc和in_pcbdetach函数	575
22.5   绑定、连接和分用	577
22.6   in_pcblookup函数	581
22.7   in_pcbbind函数	584
22.8   in_pcbconnect函数	589
22.9   in_pcbdisconnect函数	594
22.10   in_setsockaddr和in_setpeeraddr
函数	595
22.11   in_pcbnotify、in_rtchange和in_losing函数	595
22.11.1   in_rtchange函数	598
22.11.2   重定向和原始插口	599
22.11.3   ICMP差错和UDP插口	600
22.11.4   in_losing函数	601
22.12   实现求精	602
22.13   小结	602
第23章   UDP：用户数据报协议	605
23.1   引言	605
23.2   代码介绍	605
23.2.1   全局变量	606
23.2.2   统计量	606
23.2.3   SNMP变量	607
23.3   UDP 的protosw结构	607
23.4   UDP的首部	608
23.5   udp_init函数	609
23.6   udp_output函数	609
23.6.1   在前面加上IP/UDP首部和mbuf簇	612
23.6.2   UDP检验和计算和伪首部	612
23.7   udp_input函数	616
23.7.1   对收到的UDP数据报的一般确认	616
23.7.2   分用单播数据报	619
23.7.3   分用多播和广播数据报	622
23.7.4   连接上的UDP插口和多接口主机	625
23.8   udp_saveopt函数	625
23.9   udp_ctlinput函数	627
23.10   udp_usrreq函数	628
23.11   udp_sysctl函数	633
23.12   实现求精	633
23.12.1   UDP PCB高速缓存	633
23.12.2   UDP检验和	634
23.13 小结	635
第24章   TCP：传输控制协议	636
24.1   引言	636
24.2   代码介绍	636
24.2.1   全局变量	636
24.2.2   统计量	637
24.2.3   SNMP变量	640
24.3   TCP 的protosw结构	641
24.4   TCP的首部	641
24.5   TCP的控制块	643
24.6   TCP的状态变迁图	645
24.7   TCP的序号	646
24.8   tcp_init函数	650
24.9   小结	652
第25章   TCP的定时器	654
25.1   引言	654
25.2   代码介绍	655
25.3   tcp_canceltimers函数	657
25.4   tcp_fasttimo函数	657
25.5   tcp_slowtimo函数	658
25.6   tcp_timers函数	659
25.6.1   FIN_WAIT_2和2MSL定时器	660
25.6.2   持续定时器	662
25.6.3   连接建立定时器和保活定时器	662
25.7   重传定时器的计算	665
25.8   tcp_newtcpcb算法	666
25.9   tcp_setpersist函数	668
25.10   tcp_xmit_timer函数	669
25.11   重传超时：tcp_timers函数	673
25.11.1   慢起动和避免拥塞	675
25.11.2   精确性	677
25.12   一个RTT的例子	677
25.13   小结	679
第26章   TCP输出	680
26.1   引言	680
26.2   tcp_output概述	680
26.3   决定是否应发送一个报文段	682
26.4   TCP选项	691
26.5   窗口大小选项	 692
26.6   时间戳选项	692
26.6.1   哪个时间戳需要回显，RFC1323
算法	694
26.6.2   哪个时间戳需要回显，正确的
算法	695
26.6.3   时间戳与延迟ACK	695
26.7   发送一个报文段	696
26.8   tcp_template函数	707
26.9   tcp_respond函数	708
26.10   小结	710
第27章   TCP的函数	712
27.1   引言	712
27.2   tcp_drain函数	712
27.3   tcp_drop函数	712
27.4   tcp_close函数	713
27.4.1   路由特性	713
27.4.2   资源释放	716
27.5   tcp_mss函数	717
27.6   tcp_ctlinput函数	722
27.7   tcp_notify函数	723
27.8   tcp_quench函数	724
27.9   TCP_REASS宏和tcp_reass函数	724
27.9.1   TCP_REASS宏	725
27.9.2   tcp_reass函数	727
27.10   tcp_trace函数	732
27.11   小结	736
第28章   TCP的输入	737
28.1   引言	737
28.2   预处理	739
28.3   tcp_dooptions函数	745
28.4   首部预测	747
28.5   TCP输入：缓慢的执行路径	752
28.6   完成被动打开或主动打开	752
28.6.1   完成被动打开	753
28.6.2   完成主动打开	756
28.7   PAWS：防止序号回绕	760
28.8   裁剪报文段使数据在窗口内	762
28.9   自连接和同时打开	768
28.10   记录时间戳	770
28.11   RST处理	770
28.12   小结	772
第29章   TCP的输入(续)	773
29.1   引言	773
29.2   ACK处理概述	773
29.3   完成被动打开和同时打开	774
29.4   快速重传和快速恢复的算法	775
29.5   ACK处理	778
29.6   更新窗口信息	784
29.7   紧急方式处理	786
29.8   tcp_pulloutofband函数	788
29.9   处理已接收的数据	789
29.10   FIN处理	791
29.11   最后的处理	793
29.12   实现求精	795
29.13   首部压缩	795
29.13.1   引言	796
29.13.2   首部字段的压缩	799
29.13.3   特殊情况	801
29.13.4   实例	802
29.13.5   配置	803
29.14   小结	803
第30章   TCP的用户需求	805
30.1   引言	805
30.2   tcp_usrreq函数	805
30.3   tcp_attach函数	814
30.4   tcp_disconnect函数	815
30.5   tcp_usrclosed函数	816
30.6   tcp_ctloutput函数	817
30.7   小结	820
第31章   BPF：BSD 分组过滤程序	821
31.1   引言	821
31.2   代码介绍	821
31.2.1   全局变量	821
31.2.2   统计量	822
31.3   bpf_if结构	822
31.4   bpf_d结构	825
31.4.1   bpfopen函数	826
31.4.2   bpfioctl函数	827
31.4.3   bpf_setif函数	830
31.4.4   bpf_attachd函数	831
31.5   BPF的输入	832
31.5.1   bpf_tap函数	832
31.5.2   catchpacket函数	833
31.5.3   bpfread函数	835
31.6   BPF的输出	837
31.7   小结	838
第32章   原始IP	839
32.1   引言	839
32.2   代码介绍	839
32.2.1   全局变量	839
32.2.2   统计量	840
32.3   原始 IP的protosw结构	840
32.4   rip_init函数	842
32.5   rip_input函数	842
32.6   rip_output函数	844
32.7   rip_usrreq函数	846
32.8   rip_ctloutput函数	850
32.9   小结	852
结束语	853
附录A   部分习题的解答	854
附录B   源代码的获取	872
附录C   RFC 1122 的有关内容	874
参考文献	895
