描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111617778
内容简介
第3卷详细介绍了当今TCP/IP程序员和网络管理员必须非常熟悉的四个基本主题: TCP的扩展、Hyper文本传输协议、网络新闻传输协议和UNIX域协议。与前两卷一样,本书介绍了4.4BSD-Lite网络代码中的示例和实现细节。
目 录
出版者的话
本书赞誉
译者序
前言
第一部分 TCP事务协议
第1章 T/TCP概述1
1.1 概述1
1.2 UDP上的客户-服务器1
1.3 TCP上的客户-服务器6
1.4 T/TCP上的客户-服务器12
1.5 测试网络15
1.6 时间测量程序15
1.7 应用17
1.8 历史19
1.9 实现20
1.10 小结21
第2章 T/TCP协议23
2.1 概述23
2.2 T/TCP中的新TCP选项23
2.3 T/TCP实现所需变量25
2.4 状态变迁图27
2.5 T/TCP的扩展状态28
2.6 小结30
第3章 T/TCP使用举例31
3.1 概述31
3.2 客户重新启动31
3.3 常规的T/TCP事务33
3.4 服务器收到过时的重复SYN34
3.5 服务器重启动35
3.6 请求或应答超出报文段最大长度36
3.7 向后兼容性39
3.8 小结41
第4章 T/TCP协议(续)43
4.1 概述43
4.2 客户的端口号和TIME_WAIT状态43
4.3 设置TIME_WAIT状态的目的45
4.4 TIME_WAIT状态的截断48
4.5 利用TAO跳过三次握手51
4.6 小结55
第5章 T/TCP实现:插口层56
5.1 概述56
5.2 常量56
5.3 sosend函数56
5.4 小结58
第6章 T/TCP实现:路由表59
6.1 概述59
6.2 代码介绍59
6.3 radix_node_head结构60
6.4 rtentry结构61
6.5 rt_metrics结构61
6.6 in_inithead函数61
6.7 in_addroute函数62
6.8 in_matroute函数63
6.9 in_clsroute函数63
6.10 in_rtqtimo函数64
6.11 in_rtqkill函数66
6.12 小结69
第7章 T/TCP实现:协议控制块70
7.1 概述70
7.2 in_pcbladdr函数71
7.3 in_pcbconnect函数71
7.4 小结72
第8章 T/TCP实现: TCP概要73
8.1 概述73
8.2 代码介绍73
8.3 TCP的protosw结构74
8.4 TCP控制块74
8.5 tcp_init函数75
8.6 tcp_slowtimo函数75
8.7 小结76
第9章 T/TCP实现:TCP输出77
9.1 概述77
9.2 tcp_output函数77
9.3 小结83
第10章 T/TCP实现:TCP函数84
10.1 概述84
10.2 tcp_newtcpcb函数84
10.3 tcp_rtlookup函数85
10.4 tcp_gettaocache函数86
10.5 重传超时间隔的计算86
10.6 tcp_close函数89
10.7 tcp_msssend函数90
10.8 tcp_mssrcvd函数91
10.9 tcp_dooptions函数96
10.10 tcp_reass函数98
10.11 小结99
第11章 T/TCP实现:TCP输入101
11.1 概述101
11.2 预处理103
11.3 首部预测104
11.4 被动打开的启动105
11.5 主动打开的启动108
11.6 PAWS:防止序号重复114
11.7 ACK处理115
11.8 完成被动打开和同时打开115
11.9 ACK处理(续)116
11.10 FIN处理118
11.11 小结119
第12章 T/TCP实现:TCP用户请求120
12.1 概述120
12.2 PRU_CONNECT请求120
12.3 tcp_connect函数120
12.4 PRU_SEND和PRU_SEND_EOF请求124
12.5 tcp_usrclosed函数125
12.6 tcp_sysctl函数126
12.7 T/TCP的前景126
12.8 小结127
第二部分 TCP的其他应用
第13章 HTTP:超文本传输协议129
13.1 概述129
13.2 HTTP和HTML概述130
13.3 HTTP132
13.4 一个例子136
13.5 HTTP的统计资料138
13.6 性能问题139
13.7 小结141
第14章 在HTTP服务器上找到的分组142
14.1 概述142
14.2 多个HTTP服务器144
14.3 客户端SYN的到达间隔时间145
14.4 RTT的测量149
14.5 用listen设置入连接队列的容量150
14.6 客户端的SYN选项154
14.7 客户端的SYN重传156
14.8 域名157
14.9 超时的持续探测157
14.10 T/TCP路由表大小的模拟160
14.11 mbuf的交互162
14.12 TCP的PCB高速缓存和首部预测163
14.13 小结165
第15章 NNTP:网络新闻传输协议166
15.1 概述166
15.2 NNTP167
15.3 一个简单的新闻客户170
15.4 一个复杂的新闻客户171
15.5 NNTP的统计资料172
15.6 小结173
第三部分 Unix域协议
第16章 Unix域协议:概述175
16.1 概述175
16.2 用途176
16.3 性能177
16.4 编码举例177
16.5 小结179
第17章 Unix域协议:实现180
17.1 概述180
17.2 代码介绍180
17.3 Unix domain和protosw结构181
17.4 Unix域插口地址结构182
17.5 Unix域协议控制块183
17.6 uipc_usrreq函数185
17.7 PRU_ATTACH请求和unp_attach函数186
17.8 PRU_DETACH请求和unp_detach函数187
17.9 PRU_BIND请求和unp_bind函数189
17.10 PRU_CONNECT请求和unp_connect函数191
17.11 PRU_CONNECT2请求和unp_connect2函数195
17.12 socketpair系统调用198
17.13 pipe系统调用202
17.14 PRU_ACCEPT请求203
17.15 PRU_DISCONNECT请求和unp_disconnect函数204
17.16 PRU_SHUTDOWN请求和unp_shutdown函数205
17.17 PRU_ABORT请求和unp_drop函数206
17.18 其他各种请求207
17.19 小结209
第18章 Unix域协议:I/O和描述符的传递210
18.1 概述210
18.2 PRU_SEND和PRU_RCVD请求210
18.3 描述符的传递214
18.4 unp_internalize函数218
18.5 unp_externalize函数220
18.6 unp_discard函数221
18.7 unp_dispose函数222
18.8 unp_scan函数222
18.9 unp_gc函数223
18.10 unp_mark函数230
18.11 性能(再讨论)231
18.12 小结231
附录A 测量网络时间232
附录B 编写T/TCP应用程序242
参考文献246
缩略语251
本书赞誉
译者序
前言
第一部分 TCP事务协议
第1章 T/TCP概述1
1.1 概述1
1.2 UDP上的客户-服务器1
1.3 TCP上的客户-服务器6
1.4 T/TCP上的客户-服务器12
1.5 测试网络15
1.6 时间测量程序15
1.7 应用17
1.8 历史19
1.9 实现20
1.10 小结21
第2章 T/TCP协议23
2.1 概述23
2.2 T/TCP中的新TCP选项23
2.3 T/TCP实现所需变量25
2.4 状态变迁图27
2.5 T/TCP的扩展状态28
2.6 小结30
第3章 T/TCP使用举例31
3.1 概述31
3.2 客户重新启动31
3.3 常规的T/TCP事务33
3.4 服务器收到过时的重复SYN34
3.5 服务器重启动35
3.6 请求或应答超出报文段最大长度36
3.7 向后兼容性39
3.8 小结41
第4章 T/TCP协议(续)43
4.1 概述43
4.2 客户的端口号和TIME_WAIT状态43
4.3 设置TIME_WAIT状态的目的45
4.4 TIME_WAIT状态的截断48
4.5 利用TAO跳过三次握手51
4.6 小结55
第5章 T/TCP实现:插口层56
5.1 概述56
5.2 常量56
5.3 sosend函数56
5.4 小结58
第6章 T/TCP实现:路由表59
6.1 概述59
6.2 代码介绍59
6.3 radix_node_head结构60
6.4 rtentry结构61
6.5 rt_metrics结构61
6.6 in_inithead函数61
6.7 in_addroute函数62
6.8 in_matroute函数63
6.9 in_clsroute函数63
6.10 in_rtqtimo函数64
6.11 in_rtqkill函数66
6.12 小结69
第7章 T/TCP实现:协议控制块70
7.1 概述70
7.2 in_pcbladdr函数71
7.3 in_pcbconnect函数71
7.4 小结72
第8章 T/TCP实现: TCP概要73
8.1 概述73
8.2 代码介绍73
8.3 TCP的protosw结构74
8.4 TCP控制块74
8.5 tcp_init函数75
8.6 tcp_slowtimo函数75
8.7 小结76
第9章 T/TCP实现:TCP输出77
9.1 概述77
9.2 tcp_output函数77
9.3 小结83
第10章 T/TCP实现:TCP函数84
10.1 概述84
10.2 tcp_newtcpcb函数84
10.3 tcp_rtlookup函数85
10.4 tcp_gettaocache函数86
10.5 重传超时间隔的计算86
10.6 tcp_close函数89
10.7 tcp_msssend函数90
10.8 tcp_mssrcvd函数91
10.9 tcp_dooptions函数96
10.10 tcp_reass函数98
10.11 小结99
第11章 T/TCP实现:TCP输入101
11.1 概述101
11.2 预处理103
11.3 首部预测104
11.4 被动打开的启动105
11.5 主动打开的启动108
11.6 PAWS:防止序号重复114
11.7 ACK处理115
11.8 完成被动打开和同时打开115
11.9 ACK处理(续)116
11.10 FIN处理118
11.11 小结119
第12章 T/TCP实现:TCP用户请求120
12.1 概述120
12.2 PRU_CONNECT请求120
12.3 tcp_connect函数120
12.4 PRU_SEND和PRU_SEND_EOF请求124
12.5 tcp_usrclosed函数125
12.6 tcp_sysctl函数126
12.7 T/TCP的前景126
12.8 小结127
第二部分 TCP的其他应用
第13章 HTTP:超文本传输协议129
13.1 概述129
13.2 HTTP和HTML概述130
13.3 HTTP132
13.4 一个例子136
13.5 HTTP的统计资料138
13.6 性能问题139
13.7 小结141
第14章 在HTTP服务器上找到的分组142
14.1 概述142
14.2 多个HTTP服务器144
14.3 客户端SYN的到达间隔时间145
14.4 RTT的测量149
14.5 用listen设置入连接队列的容量150
14.6 客户端的SYN选项154
14.7 客户端的SYN重传156
14.8 域名157
14.9 超时的持续探测157
14.10 T/TCP路由表大小的模拟160
14.11 mbuf的交互162
14.12 TCP的PCB高速缓存和首部预测163
14.13 小结165
第15章 NNTP:网络新闻传输协议166
15.1 概述166
15.2 NNTP167
15.3 一个简单的新闻客户170
15.4 一个复杂的新闻客户171
15.5 NNTP的统计资料172
15.6 小结173
第三部分 Unix域协议
第16章 Unix域协议:概述175
16.1 概述175
16.2 用途176
16.3 性能177
16.4 编码举例177
16.5 小结179
第17章 Unix域协议:实现180
17.1 概述180
17.2 代码介绍180
17.3 Unix domain和protosw结构181
17.4 Unix域插口地址结构182
17.5 Unix域协议控制块183
17.6 uipc_usrreq函数185
17.7 PRU_ATTACH请求和unp_attach函数186
17.8 PRU_DETACH请求和unp_detach函数187
17.9 PRU_BIND请求和unp_bind函数189
17.10 PRU_CONNECT请求和unp_connect函数191
17.11 PRU_CONNECT2请求和unp_connect2函数195
17.12 socketpair系统调用198
17.13 pipe系统调用202
17.14 PRU_ACCEPT请求203
17.15 PRU_DISCONNECT请求和unp_disconnect函数204
17.16 PRU_SHUTDOWN请求和unp_shutdown函数205
17.17 PRU_ABORT请求和unp_drop函数206
17.18 其他各种请求207
17.19 小结209
第18章 Unix域协议:I/O和描述符的传递210
18.1 概述210
18.2 PRU_SEND和PRU_RCVD请求210
18.3 描述符的传递214
18.4 unp_internalize函数218
18.5 unp_externalize函数220
18.6 unp_discard函数221
18.7 unp_dispose函数222
18.8 unp_scan函数222
18.9 unp_gc函数223
18.10 unp_mark函数230
18.11 性能(再讨论)231
18.12 小结231
附录A 测量网络时间232
附录B 编写T/TCP应用程序242
参考文献246
缩略语251
前 言
引言和本书的组织
本书是套书《TCP/IP详解》的第3卷,这套书的卷1是[Stevens 1994],卷2是[Wright and Stevens 1995]。本书分成三个部分,每个部分覆盖了不同的内容。
1) TCP事务协议,通常叫作T/TCP。这是对TCP的扩展,其设计目的是使客户-服务器事务更快、更高效和更可靠。这个目标的实现省略了连接开始时TCP的三次握手,并缩短了连接结束时TIME_WAIT状态的持续时间。我们将会看到,在客户-服务器事务中,T/TCP的性能与UDP相当,而且T/TCP具有可靠性和适应性,这两点相对UDP来说都是很大的改进。
事务是这样定义的:一个客户向服务器发出请求,接下来是服务器给出响应(这里的名词“事务”(transaction)并非数据库中的事务处理,数据库中的事务处理有封锁、两步提交和回退)。
2) TCP/IP应用,特别是HTTP(超文本传输协议,WWW的基础)和NNTP(网络新闻传输协议Usenet新闻系统的基础)。
3) Unix域协议。这些协议是所有Unix的TCP/IP实现中都提供的,在许多非Unix的实现中也有提供。这些协议提供了一种进程之间通信(IPC)的手段,采用了与TCP/IP中一样的插口接口。当客户与服务器进程在同一主机上时,Unix域协议通常要比TCP/IP快1倍。
第一部分是对T/TCP的介绍,又分成两个小部分。第1~4章介绍协议,并给出了大量实例来说明它们是怎样工作的。这些材料主要是对卷1中24.7节的补充,在那里对T/TCP只是做了简单的介绍。第5~12章介绍T/TCP在4.4BSD-Lite网络代码(即卷2中给出的代码)中的确切实现。由于最早的T/TCP实现迟至1994年9月才发布,已经是本书卷1出版一年以后了,那时卷2也快完成了,因此T/TCP的详细叙述,包括诸多实例和所有的实现细节都只好放在本系列书的卷3中了。
第二部分介绍HTTP和NNTP应用,是卷1的第25~30章中介绍的TCP/IP应用的延续。在卷1出版后的两年里,随着Internet的发展,HTTP得到了极大的流行,而NNTP的使用则在最近的10多年中每年增长了大约75%。T/TCP对HTTP来说也是非常好的,可以这样来用TCP:在少量数据传输中缩短连接时间,因为这种时候连接的建立和拆除时间往往占总时间的大头。在繁忙的Web服务器上,成千上万个不同而且不断变化的客户对HTTP(因此也对TCP)的高负荷使用,也提供了唯一可以对服务器上确切的分组进行考察的机会(第14章),可以回顾卷1和卷2中给出的TCP/IP的许多特性。
第三部分中的Unix域协议原本是准备在卷2中介绍的,但由于卷2已多达1200页而删去了。在名为《TCP/IP详解》这样的套书中夹杂着TCP/IP以外的协议不免令人奇怪,但Unix域协议几乎15年前就已经伴随着BSD版TCP/IP的实现在4.2BSD中发布了。今天,它们在任何一个从伯克利衍生而来的内核中都在频繁地使用,但它们的使用往往“被掩盖在后台”,大多数用户不知道它们的存在。除了在从伯克利衍生而来的内核中充当Unix管道的基础外,它们的另一个大用户是当客户程序和服务器程序在同一主机(典型的情况是工作站)上时的X Window系统。Unix域的插口也用于进程之间传递描述符,是进程之间通信的一个强大工具。由于Unix域协议所用的插口API(应用编程接口)与TCP/IP所用的插口API几乎是相同的,Unix域协议以最小的代码变化提供了一个简单的手段来增强本地应用的性能。
以上三个部分的每个部分都可以独立阅读。
读者
与这套书的前两卷一样,这一卷是为所有想要理解TCP/IP如何工作的人写的:编写网络应用的程序员,负责维护采用TCP/IP的计算机网络的系统管理员,以及在日常工作中经常与TCP/IP应用程序打交道的用户。
第一和第二部分是理解TCP/IP工作原理的基础。不熟悉TCP/IP的读者应该看看这套书的卷1,见[Stevens 1994],以便对TCP/IP协议集有一个全面的了解。第一部分的前半部分(第1~4章,TCP/IP中的概念和例子)与卷2无关,可以直接阅读。但后半部分(第5~12章,T/TCP的实现)则需要先熟悉4.4 BSD-Lite网络程序,这些内容在卷2中介绍。
在整本书中有大量的向前和向后参考索引,这些参考索引是针对本书的两个主题,以及对卷1和卷2的内容,为想要了解更详细内容的读者提供的。在本书最后有书中用到的所有缩略语,书中介绍的所有结构、函数和宏(以字母顺序排列)及其介绍起始页码的交叉索引。如果本书引用了卷2中的定义,则该交叉索引也列出了卷2中的定义。
源码版权
本书中引自4.4BSD-Lite版的所有源码(源程序)都包括下面这样的版权声明:
第6章路由表的源码则包括下面这样的版权声明:
印刷惯例
当需要显示交互的输入和输出信息时,将用黑体表示键盘输入,而计算机输出则用Courier体,并用中文宋体做注释。
书中总是把系统名作为命令解释程序提示符的一部分(例如sun),以说明命令是在哪个主机上执行的。在正文中引用的程序名通常都是首字母大写(如Telnet和Tcpdump),以避免过多的字体形式。
在整本书中,我们会使用这种缩进格式的附加说明来描述实现细节或历史观点。
本书是套书《TCP/IP详解》的第3卷,这套书的卷1是[Stevens 1994],卷2是[Wright and Stevens 1995]。本书分成三个部分,每个部分覆盖了不同的内容。
1) TCP事务协议,通常叫作T/TCP。这是对TCP的扩展,其设计目的是使客户-服务器事务更快、更高效和更可靠。这个目标的实现省略了连接开始时TCP的三次握手,并缩短了连接结束时TIME_WAIT状态的持续时间。我们将会看到,在客户-服务器事务中,T/TCP的性能与UDP相当,而且T/TCP具有可靠性和适应性,这两点相对UDP来说都是很大的改进。
事务是这样定义的:一个客户向服务器发出请求,接下来是服务器给出响应(这里的名词“事务”(transaction)并非数据库中的事务处理,数据库中的事务处理有封锁、两步提交和回退)。
2) TCP/IP应用,特别是HTTP(超文本传输协议,WWW的基础)和NNTP(网络新闻传输协议Usenet新闻系统的基础)。
3) Unix域协议。这些协议是所有Unix的TCP/IP实现中都提供的,在许多非Unix的实现中也有提供。这些协议提供了一种进程之间通信(IPC)的手段,采用了与TCP/IP中一样的插口接口。当客户与服务器进程在同一主机上时,Unix域协议通常要比TCP/IP快1倍。
第一部分是对T/TCP的介绍,又分成两个小部分。第1~4章介绍协议,并给出了大量实例来说明它们是怎样工作的。这些材料主要是对卷1中24.7节的补充,在那里对T/TCP只是做了简单的介绍。第5~12章介绍T/TCP在4.4BSD-Lite网络代码(即卷2中给出的代码)中的确切实现。由于最早的T/TCP实现迟至1994年9月才发布,已经是本书卷1出版一年以后了,那时卷2也快完成了,因此T/TCP的详细叙述,包括诸多实例和所有的实现细节都只好放在本系列书的卷3中了。
第二部分介绍HTTP和NNTP应用,是卷1的第25~30章中介绍的TCP/IP应用的延续。在卷1出版后的两年里,随着Internet的发展,HTTP得到了极大的流行,而NNTP的使用则在最近的10多年中每年增长了大约75%。T/TCP对HTTP来说也是非常好的,可以这样来用TCP:在少量数据传输中缩短连接时间,因为这种时候连接的建立和拆除时间往往占总时间的大头。在繁忙的Web服务器上,成千上万个不同而且不断变化的客户对HTTP(因此也对TCP)的高负荷使用,也提供了唯一可以对服务器上确切的分组进行考察的机会(第14章),可以回顾卷1和卷2中给出的TCP/IP的许多特性。
第三部分中的Unix域协议原本是准备在卷2中介绍的,但由于卷2已多达1200页而删去了。在名为《TCP/IP详解》这样的套书中夹杂着TCP/IP以外的协议不免令人奇怪,但Unix域协议几乎15年前就已经伴随着BSD版TCP/IP的实现在4.2BSD中发布了。今天,它们在任何一个从伯克利衍生而来的内核中都在频繁地使用,但它们的使用往往“被掩盖在后台”,大多数用户不知道它们的存在。除了在从伯克利衍生而来的内核中充当Unix管道的基础外,它们的另一个大用户是当客户程序和服务器程序在同一主机(典型的情况是工作站)上时的X Window系统。Unix域的插口也用于进程之间传递描述符,是进程之间通信的一个强大工具。由于Unix域协议所用的插口API(应用编程接口)与TCP/IP所用的插口API几乎是相同的,Unix域协议以最小的代码变化提供了一个简单的手段来增强本地应用的性能。
以上三个部分的每个部分都可以独立阅读。
读者
与这套书的前两卷一样,这一卷是为所有想要理解TCP/IP如何工作的人写的:编写网络应用的程序员,负责维护采用TCP/IP的计算机网络的系统管理员,以及在日常工作中经常与TCP/IP应用程序打交道的用户。
第一和第二部分是理解TCP/IP工作原理的基础。不熟悉TCP/IP的读者应该看看这套书的卷1,见[Stevens 1994],以便对TCP/IP协议集有一个全面的了解。第一部分的前半部分(第1~4章,TCP/IP中的概念和例子)与卷2无关,可以直接阅读。但后半部分(第5~12章,T/TCP的实现)则需要先熟悉4.4 BSD-Lite网络程序,这些内容在卷2中介绍。
在整本书中有大量的向前和向后参考索引,这些参考索引是针对本书的两个主题,以及对卷1和卷2的内容,为想要了解更详细内容的读者提供的。在本书最后有书中用到的所有缩略语,书中介绍的所有结构、函数和宏(以字母顺序排列)及其介绍起始页码的交叉索引。如果本书引用了卷2中的定义,则该交叉索引也列出了卷2中的定义。
源码版权
本书中引自4.4BSD-Lite版的所有源码(源程序)都包括下面这样的版权声明:
第6章路由表的源码则包括下面这样的版权声明:
印刷惯例
当需要显示交互的输入和输出信息时,将用黑体表示键盘输入,而计算机输出则用Courier体,并用中文宋体做注释。
书中总是把系统名作为命令解释程序提示符的一部分(例如sun),以说明命令是在哪个主机上执行的。在正文中引用的程序名通常都是首字母大写(如Telnet和Tcpdump),以避免过多的字体形式。
在整本书中,我们会使用这种缩进格式的附加说明来描述实现细节或历史观点。
W. Richard Stevens
图森,亚利桑那
1995年11月
[email protected]
http://www.noao.edu/~rstevens
评论
还没有评论。