随着Internet爆炸性的增长,无线通信以及网络技术的发展,编写网络应用程序的程序员和工程师也在相应增加。TCP/IP编程看起来非常简单。应用程序接口(Application Programming Interface,API)十分易懂,即使是刚刚入门的初学者也可以通过使用客户端或服务器的程序模板来编写应用程序。\r\n 然而,通常初学者在经历了最初的高效率之后,在细节面前开始停滞不前,并且发现他们的应用程序正遭受着性能或健壮性的考验。网络编程是一个充满着黑暗角落的领域,有些细节也可能会被错误地理解。本书通过对TCP/IP编程最精细部分的分析,让光明照亮那些角落并帮助你改正错误。\r\n 在读完本书之后,你对网络编程的许多难点会有一个透彻的理解。本书涉及了网络编程的所有细节。通过对这些小细节的理解,读者将获得相应知识,即网络协议的内部工作机制是如何跟应用程序交互的。拥有了这些知识,那些以前看起来令人困惑的程序行为就会变得很容易理解,问题的解决办法也会变得很清晰。\r\n\r\n
1 简介 \r\n\r\n一些约定 \r\n本书其余部分的路径图 \r\n客户端-服务器体系结构 \r\n基本的套接字API回顾 \r\n\r\n2 基本知识 \r\n\r\n技巧1 理解基于连接和无连接协议之间的差异 \r\n技巧2 理解子网和CIDR \r\n技巧3 理解私有地址和NAT \r\n技巧4 开发和使用应用程序“框架” \r\n技巧5 选择套接字接口而不是XTI/TLI \r\n技巧6 记住TCP是一个流协议 \r\n技巧7 不要低估TCP的性能 \r\n技巧8 不要彻底改造TCP \r\n技巧9 注意TCP是可靠的协议但并非是不会出错的协议 \r\n技巧10 记住TCP/IP不是轮询 \r\n技巧11 为来自对等方的不合要求的行为做准备 \r\n技巧12 不要认为成功的LAN策略一定可以移植到WAN上\r\n技巧13 学习协议是如何工作的 \r\n技巧14 不要把OSI七层参考模型看得太重要了 \r\n\r\n3 创建高效和健壮的网络程序 \r\n\r\n技巧15 理解TCP写操作 \r\n技巧16 理解TCP顺序释放操作 \r\n技巧17 考虑让inetd启动应用程序 \r\n技巧18 考虑让tcpmux“指定”服务器的已知端口 \r\n技巧19 考虑使用两个TCP连接 \r\n技巧20 考虑使应用程序事件驱动(1) \r\n技巧21 考虑使应用程序事件驱动(2) \r\n技巧22 不要使用TIME-WAIT ASSASSINATION关闭连接 \r\n技巧23 服务器应当设置SO_REUSEADDR选项 \r\n技巧24 尽量使用大型写操作代替多个小规模写操作 \r\n技巧25 理解如何使connect调用具有超时机制 \r\n技巧26 避免数据拷贝 \r\n技巧27 在使用之前置sockaddr_in为零 \r\n技巧28 不要忘记字节的性别 \r\n技巧29 不要在应用程序中对IP地址和端口号硬编码 \r\n技巧30 理解已连接UDP套接字 \r\n技巧31 记住这个世界并不全是C语言 \r\n技巧32 理解缓冲区大小的影响 \r\n\r\n4 工具和资源 \r\n\r\n技巧33 熟悉ping实用程序 \r\n技巧34 学会使用tcpdump或一个类似的工具 \r\n技巧35 学会如何使用traceroute \r\n技巧36 学会使用ttcp \r\n技巧37 学会使用lsof \r\n技巧38 学会使用netstat \r\n技巧39 学会使用系统调用跟踪工具 \r\n技巧40 创建和使用捕获ICMP消息的工具 \r\n技巧41 读Stevnes的书 \r\n技巧42 阅读代码 \r\n技巧43 访问RFC Editor主页 \r\n技巧44 经常访问新闻组 \r\n\r\n附录A 各种UNIX代码 \r\netcp.h头文件 \r\ndacmon函数 \r\nsignal函数 \r\n\r\n附录B 各种W indows代码 \r\n\r\nWindow兼容性函数 \r\n\r\n \r\n
随着Internet爆炸性的增长,无线通信以及网络技术的发展,编写网络应用程序的程序员和工程师也在相应增加。TCP/IP编程看起来非常简单。应用程序接口(Application Programming Interface,API)十分易懂,即使是刚刚入门的初学者也可以通过使用客户端或服务器的程序模板来编写应用程序。
然而,通常初学者在经历了最初的高效率之后,在细节面前开始停滞不前,并且发现他们的应用程序正遭受着性能或健壮性的考验。网络编程是一个充满着黑暗角落的领域,有些细节也可能会被错误地理解。本书通过对TCP/IP编程最精细部分的分析,让光明照亮那些角落并帮助你改正错误。
在读完本书之后,你对网络编程的许多难点会有一个透彻的理解。本书涉及了网络编程的所有细节。通过对这些小细节的理解,读者将获得相应知识,即网络协议的内部工作机制是如何跟应用程序交互的。拥有了这些知识,那些以前看起来令人困惑的程序行为就会变得很容易理解,问题的解决办法也会变得很清晰。
本书的组织方式有点与众不同,我们在一系列的技巧中每次只探讨一个问题。在学习一个特定的难点的过程中,我们会比较深入地去探索TCP/IP编程的某一个方面。这样,读完本书之后,读者不仅可以确认和处理一般的问题,而且对TCP/IP协议如何与应用程序一起工作和交互会有一个相对全面的认识。
本书的组织方式也许会导致某些地方的脱节。为了方便读者阅读,第一章包含了一个路径图,它解释每章的内容与基本结构、目录中列出了所有的技巧,这也会加强你对文字组织方式的理解。因为每个技巧的标题是以祈使句的形式表达的,所以你也可以考虑使用目录作为一系列的网络编程规则。
另一方面,技巧的组织方式使本书更适合作为一本手册。当在日常工作中遇到问题,可以很容易地去重读相应的技巧,重新认识特定的问题。你将会发现许多主题在多个技巧中涉及到,这种重复可以帮助你巩固概念并使它们看起来更简单自然。
读者对象
本书主要是为有一定基础的初学者和中级网络程序员编写的,但是对有经验的读者也有一定的参考价值。虽然我们假定读者对网络和基本的套接字API有一定的熟悉程度,但在第一章里还是包含了对基本的套接字调用的回顾,并使用它们建立了一个原始的客户端和服务器。技巧4(开发和使用程序框架)更详细地讲解了不同的客户端和服务器模型,所以即使读者只有很少的网络编程知识,也能够理解本书并从中受益。
几乎所有的例子都是用C语言编写的,所以读者必须对基本的C语言有一个很好的理解,这样你就会从本书中的程序中获益匪浅。在技巧31(记住世界并不全是C语言的)里,我们展示了用Perl语言编写的例子,但是我们假定你没有Perl语言的知识。同样,本书中有一些小的shell程序的例子,但是理解它们也无需有shell编程经验。
例子和文字试图做到与平台无关。除了少数例子外,其他的都可以在UNIX或Win32系统下编译并运行。即使那些不在UNIX或Win32系统下工作的程序员,也会很轻松地把那些例子移植到他们工作的平台上。