引言和本书的组织
本书是套书《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