标题：TCPIP高效编程改善网络程序的最新技巧
基本信息
原书名：Effective TCP/IP Programming: 44 Tips to Improve Your Network Programs
原出版社： Addison-Wesley Professional
作者：(美)Jon C. Snader 
译者：陈涓赵振平
丛书名： 图灵程序设计丛书
出版社：人民邮电出版社
ISBN：9787115249371 
出版日期：2011 年4月
开本：16开
页码：268
编辑推荐
历久弥新的经典著作，揭示健壮网络程序的秘密，网络编程人员必备
内容简介
《tcp/ip高效编程:改善网络程序的44个技巧》是tcp/ip 领域的经典著作，对tcp/ip 网络编程中存在的各种问题进行了全面解析，旨在帮助读者深入透彻地理解tcp/ip 网络编程。本书组织方式比较特别，正文部分包括4 章，将网络编程中存在的常见问题组织成44 个技巧，探讨问题的过程中构建并运行了多个程序，并且指出了代码的源地址，便于读者查看。全书以技巧的形式解答了日常工作中遇到的经典问题，将本书作为手册使用，极其方便。
《tcp/ip高效编程:改善网络程序的44个技巧》主要面向有一定经验的初学者或中级网络程序员，也可作为计算机相关专业人士的参考读物。
作译者
Jon C.Snader：TCP/IP专家，Paradigm 4的资深软件工程师。他的工作领域包括通信、网络、编译器开发、操作系统以及无线网络控制器等。最近主要从事公共安全市场的报文交换系统方面的工作。
陈涓 1997年毕业于南京通信工程学院，获得通信与信息系统方向硕士学位。留校任教至今，从事网络应用方面的工作。
赵振平 1998年毕业于南京大学计算机科学系，获得操作系统和网络方向硕士学位。目前任职于南京信风软件有限公司，从事网络安全和多媒体方面的工作。
目录
《tcp/ip高效编程:改善网络程序的44个技巧》
第1章 概述 1
1.1 几个约定 1
1.2 本书其余部分的内容介绍 2
1.3 客户端—服务器结构 4
1.4 对基本套接字api的回顾 5
1.5 小结 12
第2章 基本概念 13
2.1 技巧1：理解面向连接和无连接协议之间的区别 13
2.2 技巧2：理解子网和cidr的概念 18
2.2.1 分类编址 18
2.2.2 子网划分 21
2.2.3 cidr 26
2.2.4 子网划分和cidr的状态 27
2.2.5 小结 27
2.3 技巧3：理解私有地址和nat 28
2.4 技巧4：开发并使用应用程序“框架” 30
2.4.1 tcp服务器框架 31
2.4.2 tcp客户端框架 36
2.4.3 udp服务器框架 38
.2.4.4 udp客户端框架 39
2.4.5 小结 41
2.5 技巧5：套接字接口比xti/tli更好用 41
2.6 技巧6：记住，tcp是一种流协议 43
2.7 技巧7：不要低估tcp的性能 50
2.7.1 udp源程序与接收程序 52
2.7.2 tcp源程序及接收程序 53
2.7.3 小结 59
2.8 技巧8：避免重新编写tcp 59
2.9 技巧9：要认识到tcp是一个可靠的，但并不绝对可靠的协议 61
2.9.1 可靠性——是什么，不是什么 61
2.9.2 故障模式 63
2.9.3 网络中断 63
2.9.4 对等实体崩溃 64
2.9.5 对等实体的主机崩溃 68
2.9.6 小结 69
2.10 技巧10：记住，tcp/ip不是轮询的 69
2.10.1 保持活跃 70
2.10.2 心跳信号 71
2.10.3 另一个例子 76
2.10.4 小结 81
2.11 技巧11：提防对等实体的不友好动作 81
2.11.1 检测客户端的终止 82
2.11.2 检测无效输入 84
2.11.3 小结 88
2.12 技巧12：成功的lan策略不一定能推广到wan中去 88
2.12.1 性能问题举例 88
2.12.2 隐含错误举例 89
2.12.3 小结 93
2.13 技巧13：了解协议是怎样工作的 93
2.14 技巧14：不要把osi七层参考模型太当回事 94
2.14.1 osi模型 95
2.14.2 tcp/ip模型 96
2.14.3 小结 98
第3章 构建高效且健壮的网络程序 99
3.1 技巧15：理解tcp的写操作 99
3.1.1 从应用程序的角度看写操作 99
3.1.2 从tcp角度看写操作 100
3.1.3 小结 103
3.2 技巧16：理解tcp的有序释放操作 103
3.2.1 shutdown调用 104
3.2.2 有序释放 106
3.2.3 小结 110
3.3 技巧17：考虑用inetd来装载应用程序 111
3.3.1 tcp服务器 111
3.3.2 udp服务器 114
3.3.3 小结 118
3.4 技巧18：考虑用tcpmux为服务器“分配”知名端口 118
3.5 技巧19：考虑使用两条tcp连接 126
3.5.1 单连接结构 127
3.5.2 双连接架构 128
3.5.3 小结 133
3.6 技巧20：使应用程序成为事件驱动的（1） 133
3.7 技巧21：使应用程序成为事件驱动的（2） 140
3.8 技巧22：不要用time-wait暗杀来关闭一条连接 147
3.8.1 它是什么 147
3.8.2 为什么要使用它 149
3.8.3 time-wait暗杀 150
3.8.4 小结 151
3.9 技巧23：服务器应该设置so_reuseaddr选项 151
3.10 技巧24：可能的话，使用一个大规模的写操作，而不是多个小规模的写操作 155
3.10.1 禁用nagle算法 158
3.10.2 将写操作合并起来 159
3.10.3 小结 161
3.11 技巧25：理解如何使connect调用超时 162
3.11.1 使用告警 162
3.11.2 使用select 164
3.11.3 小结 167
3.12 技巧26：避免数据复制 167
3.12.1 共享内存缓冲区 168
3.12.2 一个共享内存缓冲区系统 169
3.12.3 一个unix实现 171
3.12.4 一个windows实现 175
3.12.5 小结 179
3.13 技巧27：使用前将结构sockadddr_in清零 179
3.14 技巧28：不要忘记字节的性别 180
3.15 技巧29：不要将ip地址或端口号硬编入应用程序中 182
3.16 技巧30：理解已连接的udp套接字 187
3.17 技巧31：记住，并不是所有程序都是用c编写的 190
3.18 技巧32：理解缓冲区长度带来的影响 195
第4章 工具和资源 199
4.1 技巧33：熟悉ping实用工具 199
4.2 技巧34：学习使用tcpdump或类似的工具 201
4.2.1 tcpdump是如何工作的 202
4.2.2 使用tcpdump 205
4.2.3 tcpdump的输出 206
4.2.4 小结 210
4.3 技巧35：学习使用traceroute 210
4.3.1 traceroute是如何工作的 212
4.3.2 windows tracert 214
4.3.3 小结 215
4.4 技巧36：学习使用ttcp 215
4.5 技巧37：学习使用lsof 219
4.6 技巧38：学习使用netstat 221
4.6.1 活动套接字 221
4.6.2 接口 223
4.6.3 路由表 223
4.6.4 协议统计 225
4.6.5 windows版的netstat 227
4.6.6 小结 227
4.7 技巧39：学习使用系统中的调用追踪工具 227
4.7.1 过早终止 227
4.7.2 ttcp性能问题 231
4.7.3 小结 232
4.8 技巧40：构建并使用捕获icmp报文的工具 233
4.8.1 读取icmp报文 233
4.8.2 打印icmp报文 234
4.8.3 小结 239
4.9 技巧41：读stevens的书 240
4.9.1 《tcp/ip详解》丛书 240
4.9.2 《unix网络编程》丛书 241
4.10 技巧42：阅读代码 242
4.11 技巧43：访问rfc编辑者的页面 243
4.12 技巧44：经常访问新闻组 244
附录a 各种unix代码 247
附录b 各种windows代码 250
参考书目 253
索引 257
译者序
网络已经无处不在，和我们的生活息息相关，绝大部分有趣和有用的程序都需要进行网络访问。
TCP/IP是因特网的核心协议，它最流行的编程接口是套接字。应用程序通过套接字可以很容易地进行网络通信。然而，实际的程序在运行时，常会碰到各种各样的性能和连通性方面的问题。如果对网络协议的底层运作细节没有深入的了解，就会被这些问题所困扰，难以开发出高效和稳健的应用程序。
Jon C. Snader的这本书是深入学习TCP/IP网络编程的必备书籍。通过一个个独立的技巧，本书对网络编程中可能碰到的各种微妙问题一一进行了深入的分析和阐释，并提供了很多可以方便扩展的实例代码。有些复杂的问题还在多个技巧中反复提起，从多种角度帮助读者加深理解。本书还对解决联网问题的常用工具进行了精要的介绍，帮助读者利用工具提高分析和解决联网问题的能力。
如今的编程工作除了靠埋头苦干，还要充分利用网络带来的便利，学习和利用世界上其他编程人员的优秀成果，避免毫无意义的重复劳动，切不可闭门造车或重蹈覆辙。本书最后的阅读代码技巧中，对网络和操作系统方面的可以公开获得的优秀书籍和开源项目进行了梳理，旨在帮助读者找到适宜的学习目标，从而少走弯路，加快学习和成长的速度。
本书适用读者范围广泛，对有一定网络编程基础和经验丰富的工程师都具有很高的参考价值。我自身虽然具有多年网络编程教学和产品开发方面的实践经验，但在翻译本书的过程中也学习和完善了很多知识。
IT技术发展迅猛，许多书籍很快就会过时。而本书的英文原版虽然出版于2000年，但它是作者长期分析实践总结出的真知灼见，如今看来，它不但没有过时，还将会伴随TCP/IP体系的进一步发展，产生深远的影响。
陈涓
2011年1月
前言
简介
因特网、无线通信以及联网技术总体上的爆炸性发展，使得编写联网应用程序的程序员和工程师的数量也在激增。TCP/IP编程看起来很容易，因而很有诱惑力。API（Application Programming Interface，应用编程接口）也很易懂，即使是超级新手也可以把客户端或服务器模板充实为能够工作的应用程序。
但是，在最初的生产率激增之后，新手们往往会陷入细节的泥沼之中，并发现自己的应用程序饱受性能及健壮性问题的困扰。网络编程过程中的黑暗角落和易误解的地方比比皆是。本书就像一盏明灯照亮了这些角落，并通过对TCP/IP编程中一些微妙问题的解释来帮助大家纠正了很多错误的理解。
看完本书之后，你会透彻地理解网络编程中的许多问题。书中讨论了很多看起来好像与一个网络程序员所需掌握的核心知识只有一些外围联系的内容。但我们会看到，理解了这些细节问题，就可以帮助我们更好地理解网络协议的内部运作机制是怎样与应用程序进行交互的。有了这种洞察力，原来看起来让人困惑的程序行为就会变得很好理解，怎么解决问题也就很明显了。
本书的组织方式有些与众不同，我们将一些常见问题组织成一系列的技巧，每个技巧讨论一个问题。在讨论特定问题的过程中，通常会对TCP/IP编程的某些方面进行深入的研究。完成对特定问题的讨论之后，我们不仅能够掌握这些常见问题的特点和解决方案，还会对TCP/IP协议是怎样工作的，以及它如何与我们编写的应用程序进行交互有相当全面的理解。
将内容以技巧的形式组织起来会显得不够连贯，为了便于理解，第1章提供了相应的内容介绍，对每章涵盖的技巧以及这些技巧之间的联系进行了说明。目录中列出了每一个技巧，可以从中看出正文的组织结构。每个技巧的标题都是祈使句，因此也可以把目录当作网络编程的规则来用。
从另一方面来看，将内容以技巧的形式组织起来，使本书更像一本实用而又方便查阅的手册。在日常工作中遇到问题时，可以很方便地去重温其中的技巧，加深对特定问题的理解。你会发现很多话题都会在多个技巧中提到，有时只是换个角度来讨论。这种重复有助于巩固概念，让你对它们达成更自然的理解。
读者对象
本书主要是面向有一定经验的初学者或中级网络程序员，但经验更丰富的读者会发现本书也是很有用的。我们假设读者熟悉联网知识，以及基本的套接字API，但第1章也对基本的套接字调用进行了复习，并用它们构建了初级的客户端和服务器。技巧4更详细地介绍了各种客户端和服务器模型。因此，哪怕只具有少量背景知识的读者也能理解本书，并从中获益。
由于所有的示例基本上都是用C语言编写的，因此要看懂本书的程序，至少需要有基本的C语言编程经验。技巧31展示了一些用Perl编写的例子，但并不需要读者掌握Perl的知识。类似地，还有几个小的shell程序示例，理解它们同样也不需要有shell编程的经验。
本书所有示例和内容都争取做到独立于平台。除了少数几个例子之外，其他示例都可以在任何UNIX或Win32系统中编译并运行。即使那些没有工作在UNIX或Windows系统下的程序员，要把这些例子移植到他们所使用的平台上去也应该不会有什么问题。
排版约定
在探讨技巧的过程中，我们会构建并运行很多小程序，设计这些小程序是为了从不同方面来说明问题。在显示交互式输入输出时，会使用下列约定：
输入的文本被设置为粗体的Courier；
系统输出的文本被设置为标准的Courier；
非实际输入或输出的注释内容，用楷体表示。
下面是技巧9中的一个例子。
bsd: $ tcprw localhost 9000
hello
received message 1 延迟5秒之后打印此消息
媒体评论
“本书从程序员的角度剖析了TCP/IP的基本原理，没有任何照本宣科式的说教，而是采用了大量实用的建议、技巧，一定会让每一位网络编程人员爱不释手、受益匪浅。”
─—Uri Raz，TCP/IP专家、资深网络工程师
“本书可以跟Stevens的书互为补充。书中的内容可以用言简意赅来形容，作者在如此少的篇幅中讨论了那么多TCP/IP开发的知识点，真是令人惊叹不已。它特别适合偶尔做做相关开发，而不愿意啃大部头著作的程序员。”
─—亚马逊读者评论
“谢天谢地，本书帮我解决了在一个大型公司级网络编程项目中遇到的所有难题！它不仅教会了我使用各种网络编程工具，而且更重要的是让我以前那些模糊的认识都得到了澄清。好书，快看，马上学以致用吧！”
─—W. J. Vovil “Wayne”，程序员