本书是“TCP/IP详解系列”的延续。主要内容包括:TCP事务协议,即T/TCP,这是对TCP的扩展,使客户-服务器事务更快、更高效和更可靠;TCP/IP应用,主要是HTTP和NNTP;UNIX域协议,这些协议提供了进程之间通信的一种手段。当客户与服务器进程在同一台主机上时,UNIX域协议通常要比TCP/IP快一倍。本书同样采用了大量的实例和实现细节,并参考引用了卷2中的大量源程序。适用于希望理解TCP/IP如何工作的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。
译者序\r\n前言\r\n第一部分 TCP事务协议\r\n第1章 T/TCP概述\r\n 1.1 概述 \r\n 1.2 UDP上的客户-服务器\r\n 1.3 TCP上的客户-服务器\r\n 1.4 T/TCP上的客户-服务器\r\n 1.5 测试网络\r\n 1.6 时间测量程序\r\n 1.7 应用\r\n 1.8 历史\r\n 1.9 实现\r\n 1.10 小结\r\n第2章 T/TCP协议\r\n 2.1 概述\r\n 2.2 T/TCP中的新TCP选项\r\n 2.3 T/TCP实现所需变量\r\n 2.4 状态变迁图\r\n 2.5 T/TCP的扩展状态\r\n 2.6 小结\r\n第3章 T/TCP使用举例\r\n 3.1 概述\r\n 3.2 客户重新启动\r\n 3.3 常规的T/TCP事务\r\n 3.4 服务器收到过时的重复SYN\r\n 3.5 服务器重启动\r\n 3.6 请求或应答超出报文段最大长度MSS\r\n 3.7 向后兼容性\r\n 3.8 小结\r\n第4章 T/TCP协议(续)\r\n 4.1 概述\r\n 4.2 客户的端口号和TIME_WAIT状态\r\n 4.3 设置TIME_WAIT状态的目的\r\n 4.4 TIME_WAIT状态的截断\r\n 4.5 利用TAO跳过三次握手\r\n 4.6 小结\r\n第5章 T/TCP协议的实现:插口层\r\n 5.1 概述\r\n 5.2 常量\r\n 5.3 sosend函数\r\n 5.4 小结\r\n第6章 T/TCP的实现:路由表\r\n 6.1 概述\r\n 6.2 代码介绍\r\n 6.3 radix_node_head结构\r\n 6.4 rtentry结构\r\n 6.5 rt_metrics结构\r\n 6.6 in_inithead函数\r\n 6.7 in_addroute函数\r\n 6.8 in_matroute函数\r\n 6.9 in_clsroute函数\r\n 6.10 in_rtqtimo函数\r\n 6.11 in_rtqkill函数\r\n 6.12 小结\r\n第7章 T/TCP实现:协议控制块\r\n 7.1 概述\r\n 7.2 in_pcbladdr函数\r\n 7.3 in_pcbconnect函数\r\n 7.4 小结\r\n第8章 T/TCP实现: TCP概要\r\n 8.1 概述\r\n 8.2 代码介绍\r\n 8.3 TCP的protosw结构\r\n 8.4 TCP控制块\r\n 8.5 tcp_init函数\r\n 8.6 tcp_slowtimo函数\r\n 8.7 小结\r\n第9章 T/TCP实现:TCP输出\r\n 9.1 概述\r\n 9.2 tcp_output函数\r\n 9.2.1 新的自动变量\r\n 9.2.2 增加隐藏的状态标志\r\n 9.2.3 在SYN_SENT状态不要重传SYN\r\n 9.2.4 发送器的糊涂窗口避免机制\r\n 9.2.5 有RST或SYN标志时强制发送报文段\r\n 9.2.6 发送MSS选项\r\n 9.2.7 是否发送时间戳选项\r\n 9.2.8 发送T/TCP的CC选项\r\n 9.2.9 根据TCP选项调整数据长度\r\n 9.3 小结\r\n第10章 T/TCP实现:TCP函数\r\n 10.1 概述\r\n 10.2 tcp_newtcpcb函数\r\n 10.3 tcp_rtlookup函数\r\n 10.4 tcp_gettaocache函数\r\n 10.5 重传超时间隔的计算\r\n 10.6 tcp_close函数\r\n 10.7 tcp_msssend函数\r\n 10.8 tcp_mssrcvd函数\r\n 10.9 tcp_dooptions函数\r\n 10.10 tcp_reass函数\r\n 10.11 小结\r\n第11章 T/TCP实现:TCP输入\r\n 11.1 概述\r\n 11.2 预处理\r\n 11.3 首部预测\r\n 11.4 被动打开的启动\r\n 11.5 主动打开的启动\r\n 11.6 PAWS:防止序号重复\r\n 11.7 ACK处理\r\n 11.8 完成被动打开和同时打开\r\n 11.9 ACK处理(续)\r\n 11.10 FIN处理\r\n 11.11 小结\r\n第12章 T/TCP实现:TCP用户请求\r\n 12.1 概述\r\n 12.2 PRU_CONNECT请求\r\n 12.3 tcp_connect函数\r\n 12.4 PRU_SEND和PRU_SEND_EOF请求\r\n 12.5 tcp_usrclosed函数\r\n 12.6 tcp_sysctl函数\r\n 12.7 T/TCP的前景\r\n 12.8 小结\r\n第二部分 TCP的其他应用\r\n第13章 HTTP:超文本传送协议\r\n 13.1 概述\r\n 13.2 HTTP和HTML概述\r\n 13.3 HTTP\r\n 13.3.1 报文类型:请求与响应\r\n 13.3.2 首部字段\r\n 13.3.3 响应代码\r\n 13.3.4 各种报文头举例\r\n 13.3.5 例子:客户程序缓存\r\n 13.3.6 例子:服务器重定向\r\n 13.4 一个例子\r\n 13.5 HTTP的统计资料\r\n 13.6 性能问题\r\n 13.7 小结\r\n第14章 在HTTP服务器上找到的分组\r\n 14.1 概述\r\n 14.2 多个HTTP服务器\r\n 14.3 客户端SYN的到达间隔时间\r\n 14.4 RTT的测量\r\n 14.5 用listen设置入连接队列的容量\r\n 14.6 客户端的SYN选项\r\n 14.7 客户端的SYN重传\r\n 14.8 域名\r\n 14.9 超时的持续探测\r\n 14.10 T/TCP路由表大小的模拟\r\n 14.11 mbuf的交互\r\n 14.12 TCP的PCB高速缓存和首部预测\r\n 14.13 小结\r\n第15章 NNTP:网络新闻传送协议\r\n 15.1 概述\r\n 15.2 NNTP\r\n 15.3 一个简单的新闻客户\r\n 15.4 一个复杂的新闻客户\r\n 15.5 NNTP的统计资料\r\n 15.6 小结\r\n第三部分 Unix域协议\r\n 第16章 Unix域协议:概述\r\n 16.1 概述\r\n 16.2 用途\r\n 16.3 性能\r\n 16.4 编码举例\r\n 16.5 小结\r\n第17章 Unix域协议:实现\r\n 17.1 概述\r\n 17.2 代码介绍\r\n 17.3 Unix domain和protosw结构\r\n 17.4 Unix域插口地址结构\r\n 17.5 Unix域协议控制块\r\n 17.6 uipc_usrreq函数\r\n 17.7 PRU_ATTACH请求和unp_attach函数\r\n 17.8 PRU_DETACH请求和unp_detach函数\r\n 17.9 PRU_BIND请求和unp_bind函数\r\n 17.10 PRU_CONNECT请求和unp_connect函数\r\n 17.11 PRU_CONNECT2请求和unp_connect2函数\r\n 17.12 socketpair系统调用\r\n 17.13 pipe系统调用\r\n 17.14 PRU_ACCEPT请求\r\n 17.15 PRU_DISCONNECT请求和unp_disconnect函数\r\n 17.16 PRU_SHUTDOWN请求和unp_shutdown函数\r\n 17.17 PRU_ABORT请求和unp_drop函数\r\n 17.18 其他各种请求\r\n 17.19 小结\r\n第18章 Unix域协议:I/O和描述符的传递\r\n 18.1 概述\r\n 18.2 PRU_SEND和PRU_RCVD请求\r\n 18.3 描述符的传递\r\n 18.4 unp_internalize函数\r\n 18.5 unp_externalize函数\r\n 18.6 unp_discard函数\r\n 18.7 unp_dispose函数\r\n 18.8 unp_scan函数\r\n 18.9 unp_gc函数\r\n 18.10 unp_mark函数\r\n 18.11 性能(再讨论)\r\n 18.12 小结\r\n附录A 测量网络时间\r\n附录B 编写T/TCP应用程序\r\n参考文献\r\n缩略语
引言和本书的组织
本书是“TCP/IP详解系列”的延续:此系列的卷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快一倍。
第一部分,即对T/TCP的介绍,又分成两个小部分。第1~4章介绍协议,并给出了大量实例来说明它们是怎样工作的。这些材料主要是对卷1中24.7节的补充,在那里对T/TCP只是做了简单的介绍。第2小部分,即第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中的定义。