目录

  • 你怎么想到要写UNIX Network Programming
  • 你为什么要写Advanced Programming in the UNIX Environment
  • 你为什么要写TCP/IP Illustrated, Volume 1: The Protocols
  • 你为什么要写TCP/IP Illustrated, Volume 2: The Implementation
  • 你为什么要写TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP, and the Unix - Domain Protocols
  • 我应该看其中哪本书?
  • 你跟Doug Comer合作写过书吗?
  • 写一本书要花多长时间?

问:你怎么想到要写UNIX Network Programming

1980年代,我在Health Systems International工作,那时候我们先后为很多平台开发过Unix[1]软件。我们跟大多数同时代的创业公司一样,经历过一系列硬件的变迁:起先是VAX-11/750[2],运行4.2BSD[3],然后是个头稍大的VAX(785),接着又是多台VAX(又加了一台8500),有几台PC运行着一种风格的操作系统(Venix、Xenix[4]、DOS),另外还有一台IBM大型机运行VM。因为有多台VAX运行4.xBSD,所以我们就通过以太网把它们连接起来运行TCP/IP,当然装有Unix系列操作系统的PC和那台大型机也都可以运行TCP/IP。除了使用标准的实用工具(ftp、rlogin),我们还着手使用套接字自己开发工具。当时几乎没有文档可查(我从一堆4.3BSD手册中找到两本Leffler等人编写的文档,但非常破旧),因而在想解决某个问题时,就得查源代码。就这样查了一段时间的源代码之后,我意识到应该把自己发现的东西诉诸文字。1988年我开始写UNP,因为每天都要工作,所以这本书写了两年。

我相信UNP以及我的其他书之所以能够获得成功,是我的背景起了决定性的作用。换句话说,我既不是Berkeley也不是AT&T的开发人员,因此写作中就没有“内存转储”[5]的问题。书中的所有内容都是我自己经过深入钻研想明白的。在深入钻研和思考各种原理的过程中,我经常会绕很大的弯子,有时候甚至会走进死胡同。但这个过程对于理解新知识是极为必要的。有很多次我想在书中把某方面的工作原理写出来,自己也觉得很明白,但才刚写了几个测试程序,马上就又碰到了新的、不懂的问题。我在自己的几本书中也尽力传达了这种探索的盲目性,因为我觉得看到某个问题的错误解决方案(并理解它错在哪里),常常要比直接看到正确的解决方案收获更大。

问:你为什么要写Advanced Programming in the UNIX Environment

整个1980年代,我翻看最勤的就是Marc Rochkind的Advanced UNIX Programming。但那本书的内容只涵盖了System III[6],我也知道他没有升级那本书的打算。所以,我决定自己写一本高级的Unix图书。

问:你为什么要写TCP/IP Illustrated, Volume 1: The Protocols

我对TCP/IP产生兴趣始于1987年夏天在菲尼克斯(Phoenix,美国亚利桑纳州首府)召开的Summer Usenix[7]大会,当时我买了一本Doug Comer的Internetworking With Xinu[8]。(我是在Jim Joyce的书店买的这本书,这个书店开在酒店的一个套间里,他可能也是第一个尝试在Usenix大会上卖书的人。会场上是不允许卖书的。)在回康涅狄格的飞机上,我从头到尾看完了这本书。撰写UNP期间以及1990年代早几年,Doug Comer“卷I”的第1版和第2版先后都被我翻得书脊开了胶。我毕竟是一个业内人士,相对于理论阐述,我更关心对实际工作有指导意义的内容。在翻阅Doug这本教材的过程中,我不断提出一些非常实际但又在书中找不到答案的问题。与此同时,一位在IBM教TCP/IP的朋友也时不时地向我询问一些问题,而这些问题不管是在RFC规范还是其他任何教材中同样也找不到答案。我开始编写一些小测试程序,观察程序运行的结果(参见我这本书的“附录C:sock程序”的开头),冥冥之中感觉到以这种方式来写一本书倒是个不错的主意。我也知道有很多唾手可得的现成工具(大多数都是Van Jacobson写的,了不起!)可以帮我理解这两个协议,这些工具谁都可以拿来用。比如说Tcpdump吧,它不仅仅是一个诊断网络问题的工具,更是一个辅助理解协议原理的无价之宝。最终,在经历了数年的网络编程之后,我慢慢地认识到:80%的网络编程问题根本就不是编程问题,都是对协议运行原理理解不够造成的。

问:你为什么要写TCP/IP Illustrated, Volume 2: The Implementations

同样,我是Doug Comer的“卷II”(TCP/IP的Xinu实现)的忠实读者,但在遇到没有实现的功能时总会感到很无助,况且Xinu也不是标准。Berkeley的实现才是事实标准,而且其代码基也“小”(15000行C代码)到可以用1本书——尽管是一本“大”书——来讲完。

问:你为什么要写TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP, and the Unix Domain Protocols

这本书实际上是由3本更小的书构成的。第一部分“TCP for Transactions”是对Volume 1第24.7节的重要扩展。这一部分从两个方面讲解了T/TCP:一是通过实例讲解TCP协议扩展(第1至4章,延续了Volume 1的风格),二是分析了4.4BSD-Lite连网代码对T/TCP的实现(第5至13章,延续了Volume 2的风格)。第二部分“HTTP(Hypertext Transfer Protocol) and NNTP(Network News Transfer Protocol)”是对Volume 1的补充,因为这一部分讲解了构建于TCP之上的两个应用层协议。其中有一章详细地解释了繁忙的World Wide Web服务器上实际的数据包,展示了多变的、有时候完全不可思议的TCP行为及实现。这两部分的主题完全取材于Volume 1和Volume 2,而且都是相关领域中重要而流行的实际应用。第三部分“Unix Domain Protocols”是对Volume 2的补充,因为这一部分专注于这些协议在4.4BSD-Lite连网代码中的实现。所以说,最后这一卷其实是对前两卷的一个延伸。

问:我应该看其中哪本书?

这取决于你对哪个领域感兴趣。UNP是一本网络编程教材:包含15000行C源代码和大量有关网络编程的详细解释。但是,UNP只介绍了基本的Unix和TCP/IP。相对而言,APUE则完全是一本Unix编程教材,没有涉及网络编程。事实上,可以将APUE看作是对UNP第2章的一个重要扩展。TCP/IPIv1纯粹讲协议:这些协议怎么运行,为什么那么运行(是对UNP第5.2节的一个重要扩展)。这本书里连一行C代码都没有。TCP/IPIv2讲的是TCP/IP的实际实现:包含15000行内核中的C源代码。TCP/IPIv3则是由协议(T/TCP、HTTP、NNTP)和实现(大约2200行内核C源代码)构成的。

我自己对网络编程非常感兴趣,但是我发现要做好网络编程,必须理解网络底层的运行系统(APUE)和底层的协议(TCP/IPIv[123])。

问:你跟Doug Comer合作写过书吗?

没有,那个人是普渡大学的David L. Stevens。我们不是一个人。

问:写一本书要花多长时间?

每一面大约要花2小时左右。这个时间包含了为出版商制作可供照排机使用的PostScript[9]文件的时间。这样算来,一本600页的书,大约要花1200小时。如果你不制作供照排机使用的文件(例如,让出版商自己排版和做索引),还可以节省一点时间,但我喜欢完全控制最终结果。


  1. Unix操作系统(官方商标是UNIX,有时候也写作Unix )最早是1969年由美国AT&T公司贝尔实验室的员工肯·汤普逊(Ken Thompson)、丹尼斯·里奇( Dennis Ritchie)、布赖恩·凯尔尼汗(Brian Kernighan)、道格拉斯·麦克伊罗(Douglas McIlroy)和 Joe Ossanna开发的。Unix是1971年最早在在PDP-11(PDP,Programmed Data Processor;PDP-11由DEC公司制造)上运行的操作系统,具有多用户、多任务的特点,支持多种处理器架构。AT&T公司以低廉甚至免费的许可将Unix源码授权给学术机构做研究或教学之用,许多机构在此源码基础上加以扩充和改进,形成了所谓的“Unix变体”,这些变体反过来也促进了Unix的发展,其中最著名的变体之一是由加州大学柏克利分校开发的BSD产品。后来AT&T意识到了Unix的商业价值,不再将Unix源码授权给学术机构,并对之前的Unix及其变体声明了版权权利。结果,导致了一场旷日持久的版权官司。这场官司一直打到AT&T将自己的Unix系统实验室卖掉——同时也为Linux的诞生创造了难得的条件,新接手的Novell公司采取了一种比较开明的做法,允许柏克利分校自由发布自己的BSD,但是前提是必须将来自于AT&T的代码完全删除,于是诞生了4.4 BSD Lite版,由于这个版本不存在法律问题,4.4BSD Lite成为了现代BSD系统的基础版本。要了解完整的Unix及其变体的时间线,请参考:http://www.levenez.com/unix/。——译者注
  2. VAX(Virtual Address eXtension)是一种可以支持机器语言和虚拟地址的32位小型计算机。VAX最初由DEC(Digital Equipment Corporation)公司在20世纪70年代初发明,是原来16位PDP-11的扩展产品。DEC公司1998年1月26日被Compaq(康柏)公司收购,后者2001年9月4日又被HP(惠普)公司收购。VAX被誉为最成功的小型机,其设计师、DEC技术灵魂、小型机之父戈登·贝尔(Gordon Bell)的个人主页为:http://research.microsoft.com/en-us/um/people/gbell/。——译者注

  3. 1974年,伯克利加州大学(University of California, Berkeley)从AT&T公司获得修改UNIX的许可,并在此基础上发布BSD(Berkeley Software Distribution,伯克利软件套件);换句话说,BSD是Unix的衍生系统。1BSD(first Berkeley Software Distribution)是1977年由伯克利的研究生比尔·乔伊(Bill Joy,Sun公司的联合创办人)整理开发出来的。1978年、1979年和1980年,Joy分别发布了2BSD、3BSD和4BSD。4BSD以后的版本由1980年成立的CSRG(Computer System Research Group,计算机系统研究小组)负责发行。该小组于1981年6月发行了称之为4.1BSD的新版本——不是5BSD。由于AT&T觉得5BSD会使用户将它和AT&T Unix System V混淆,Berkely同意改变BSD将来版本的命名规则,将版本号仅保留在4BSD上,以后只增加4后面的小版本号。到1995年CSRG解散时,BSD的最高版本是4.4。1990年代初、中期,NetBSD、FreeBSD以及OpenBSD(从NetBSD小组中分离出来)小组相继成立,它们努力的结晶成为BSD的三个主要变体。BSD的另外两个主要变体NeXTSTEP和Darwin(Mac OS X的核心, 由FreeBSD 4.5和NeXTSTEP混合派生)如今已经演变成苹果公司Mac OS X及iPhone OS的核心。BSD对Unix最重要的贡献之一是TCP/IP。BSD有8个主要的发行版中包含了TCP/IP:4.1c、4.2、4.3、4.3-Tahoe、4.3-Reno、Net2、4.4以及4.4-lite。这些发行版中的TCP/IP代码几乎是现在所有系统中TCP/IP实现的前身,包括AT&T System V 和Microsoft Windows。——译者注

  4. Xenix是微软为微型计算机推出的Unix版本。由于微软购买的授权无法直接让该操作系统以“UNIX”为名,便命名该系统为Xenix。微软在1979年从美国电话电报公司购买了 Version 7 Unix 的授权,并于1980年8月25日发布面向16位系统的版本,由SCO公司将该系统移植至英特尔8086/8088架构。在Unix V7的基础上,Xenix整合了BSD的技术,再加上当时x86处理器的价格低廉,很快便成为当时最受欢迎的Unix发行版。据The Design and Implementation of the 4.3BSD UNIX Operating System(Samuel J. Leffler、Marshall Kirk McKusick,Addison-Wesley,1991.3)称:“如果就运行它的机器数量而言,Xenix可能是发行量最大的一个Unix版本了。”——译者注

  5. “内存转储”原指把内存中的二进制数据以原来的表达方式转存成文件,用于对内存的运行状态进行事后分析。在这里指的是作者不会照搬开发文档,因此书的内容框架和语言表达自然更接近一般读者。——译者注

  6. UNIX System III (有时也称System 3)是由AT&T的Unix Support Group(USG)于1982年发布了一个Unix版本,也是第一个面向贝尔实验室之外发布的版本。UNIX System III综合了多个AT&T版本: PWB/UNIX 2.0、CB UNIX 3.0、UNIX/TS 3.0.1和UNIX/32V。System III支持DEC PDP-11和VAX计算机。之所以将这个版本称为System III,是因为它是UNIX/TS 3.0.1和CB UNIX 3这两个由贝尔实验室内部支持的Unix系统的对外发行版。这个版本的文档叫做UNIX Edition 3.0。之前,根本没有System I和System II这两个Unix版本。而且也没有官方发布的UNIX/TS 4.0(否则,就会有System IV了)。换句话说,System III之后就是基于UNIX/TS 5.0System V了。——译者注

  7. USENIX协会(USENIX Association)是一个高级计算技术协会。其前身是成立于1975年的Unix Users Group(Unix用户组),主要致力于Unix及类似系统的研发。1977年,AT&T的律师通知这个小组不能使用UNIX这个词,因为它是Western Electric(截止到1995年一直是AT&T的生产部门)的注册商标。于是,该小组遂更名为USENIX。这个协会受到了计算机操作系统领域的众多业内人士、开发人员和研究人员的推崇。这个协会每年都会举办一些会议和研讨会,最著名的是OSDI(USENIX Symposium on Operating Systems Design and Implementation ,USENIX操作系统设计与实现研讨会)、USENIX Annual Technical Conference(USENIX年度技术大会)、 USENIX Security Symposium(USENIX安全研讨会)、 FAST(USENIX Conference on File and Storage Technologies,USENIX文件及存储技术大会),以及SAGE(The USENIX Special Interest Group for Sysadmins,USENIX系统管理员特别兴趣小组——非盈利的专业系统管理员的国际性协会)主办的LISA(Large Installation System Administration Conference,大型系统管理员大会)。——译者注

  8. Xinu是一种类Unix操作系统,1980年代由Douglas Comer为教学在普渡大学(Purdue University)开发。Xinu这外名字既是递归缩写(Xinu Is Not Unix),又是“Unix”的反向拼写形式。这个系统曾被移植到很多硬件平台,包括DEC LSI-11和VAX系统、 Sun-2 and Sun-3工作站、Intel x86、PowerPC G3 和MIPS等。——译者注

  9. PostScript是1982年由John Warnock和Charles Geschke专门为打印图形和文字而设计的一种页面描述语言和编程语言,它与打印的介质无关,不管是在纸上、胶片上打印,还是在屏幕显示都没有问题。PostScript的主要目标是提供一种独立于设备的能够方便地描述图像的语言。独立于设备意味着,不需要借助任何具体设备的特性(例如,打印机的分辨率)来描述图像,因而这个描述不需要经过任何修改即可在其他的PostScript打印机上进行打印。PostScript作为一种语言,自己有语法和格式规范,这种语言描述的页面由PostScript文件表示。PostScript文件本身只是用PostScript语言描述了所要显示或者打印的文本及图像有哪些特征、参数,在显示或者打印PostScript文件的时候,再由PostScript解释器解释并打印或者显示。PostScript不仅与设备无关,而且与操作系统无关。无论是Windows操作系统,还是Unix操作系统,都可以阅读和打印PostScript文件。由于PostScript文件是以文本形式存储,因而文件比较小,适合在Internet上传输。(1982年12月,John Warnock和Charles Geschke离开施乐公司创建Adobe,以开发和销售PostScript为生。后来成就了Adobe“帝国”。)——译者注

原文地址:http://www.kohala.com/start/rstevensfaq.html