《UNIX网络编程》(Richard Stevens著)之短评

本文将为大家介绍笔者关于Richard Stevens的《UNIX网络编程》这本书的观点。 UNP(UNIX Network Programming)是全世界最经典的关于网络编程的书籍。

在这个领域还有以下经典书目:

  1. David L. Comer - Internetworking with TCP/IP
  2. Richard Stevens - TCP/IP Illustrated

不骗你们,经典网络编程书目包括两本Richard Stevens的书,占到了2/3的比例。 这是怎么一回事呢?

事实上,Stevens就是真正的领袖,本领域的创始人之一。 UNP也可以说是显然经受住了时间的考验,被重印了三次。

我想借这篇文章概述这本书给我的影响。

1. 背景

1.1. 我的需求

为什么我要开始学网络编程? 与很多事情不同,我是由于工作需要才开始学这项技能。 我从来没有要仔细理解socket和TCP-IP的细节。 我很早之前学过CURL,我以为那就足够了,因为我以为互联网会一年比一年更好更稳定。

实际上,互联网一年比一年更差。 我年轻的时候的态度“只要用默认设置,就可以了”已经完全不适合今天的情况了。 所以即使我是其他专业的,但是应该知晓互联网原理和调整方法。

首先,我希望避免去学习过于底层的逻辑。但是,在调试使中,会使用到很多高层工具, 我经常发现——它们要么在假设上出错,要么还是需要用户理解网的络底层逻辑。

有一次,简单地说,我发现,为了debug自己的网络连接不良问题, 我就必须详细理解网络、协议、数据包结构和用户面加密等知识。

1.2. 为什么是UNIX,而不是LINUX

Stevens的书是关于UNIX套接字(socket)编程接口讲解。 UNIX本来是最早支持网路的操作系统之一。 实际上,甚至连Windows也使用BSD的套接字接口。

从这方面来说,Linux把它的网络接口完全从老UNIX接过来了。 虽然今天基本上没有任何人还在使用UNIX,但大部分操作系统对其API不敢做任何改动。

所以学会理解SocketAPI对我们来说应该是最广泛适用的技能了。

除了SocketAPI以外,Linux还有自己的国产API,叫做Netlink,但是我尚未使用过它。

1.3. TCP/IP范围很大,陈旧了?

TCP/IP诞生的时候还是80年代,那时的网络和现在很不一样。 所以TCP/IP包括很多那时工程预计会很好用的功能,现在已经不那么适应时代了。 比如说,完整的互联网协议套件包含15以上的第二层协议,但是只要4个涵盖99%的用例。

时代进步不会停止。悲观者会说:“如果从协议套件里只使用两个协议,这等于失败,因此是差得设计”。 但是我反而会说,“如果你的协议能持续被使用40多年, 尤其是40年前制造的设备仍然可以继续操作,那么你的设计其实很好。”

2. 内容

大纲 这本书涉及的内容非常详细。除了基本的TCP和UDP以外, 还包括原始(RAW)套接字,虚拟专用网络(VPN),路由和其它类型套接字。

其实,本书原来的版本包括两个册。第一册远程操作,第二册包括本地操作,比如 UNIX-domain套接字和SUNRPC。

本书还包括域名识别系统(DNS)相关的内容。

阅读这本书之后…不能说你会成为本领域最好的专家, 但是你肯定会超过比80%的程序员。

多层次设计 作为本领域最好的教材之一,本书追求内容上多层次设计。 我可以至少将它分为数3个层次。

  1. 在第一个层次Stevens给读者作了简单介绍,让初学者从零开始尝试传输一段数据,理解基本的想法。
  2. 在第二个层次Stevens介绍了基本的socket函数,描述如何实现简单的网络服务。

第二层次中有关于TCP,UDP和SCTP的几章,给阅读者介绍了几个交流协议的区别,操作依据和常见的用法。 对大部分开发者来说第二层次应该能满足做大部分工作的要求…如果开发者写纯C的话。

  1. 第三层次反映了第二层结构,但是增加了更多细节和深度。

在这阶段,书中的内容更为为复杂。其实第三层次不包含太多复杂的功能,但是它还是继续使用纯C。 纯C语言很贴近硬件,但是并不对用户十分友好。 其实第三层次对开发者来说应该会更好用,但是由于TCP/IP的设计者必须把比较复杂的结构放在比较底层的C语言中, 因此第三层的内容确实比较难理解和实践。

在阅读第三层次的几个章节时,我不禁开始思考C++相对于纯C的优势。 其实,套接字API从我的角度来说,比较适合用C++绑定包装。

不过,本书中涉及更复杂内容的几个章节写得的比较准确,如果严格跟着本书的指引做的话, 可以写出较为可靠的代码。

个三个层次之外,Stevens的书里还有几个辅助性的章节。 其中一章详细介绍了域名系统,其它章节则描述了原始套接字(RAW SOCKET),VPN,其它话题。

我没有阅读所有的辅助性章节,但是如果我有需要,我能够知道在哪里找到相关内容。

UNIX 这本书的第二册(???!!)没有那么多版本。比如最新的版本就不包括第二册(???!!!)。 第二册大多内容涉及虑本地性,以及操作系统级别进程间的通信,比如UNIX套节字。 关于这个话题,教材中有很多内容。 甚至Stevens本人写了“Advanced Programming in UNIX Environment”. 如果我的粉丝们好奇的话,我可以推荐“Mark J Rockind”的"Advanced Unix Programming"给你.

但是,有一个主题我感觉在UNP这本书里是讲得最好的: 这个是SUNRPC。SUN公司遥控执行步骤,或者称为"远端程序呼叫"。 (Remote Procedure Call).

SUNRPC 虽然UNIX中多处使用了SUNRPC,尤其是在NFS(网络文件系统)等,但是官方的资料比较薄弱。 Stevens在书中对此的介绍也比较短,但是很容易理解,逻辑描述得很清楚。

安全 我觉得TCP/IP最大的缺点是IPsec的协议套件。 确实,如今我们已经有了一定的经验,明白IPsec并不是最适合实际情况的加密方法。 Stevens在书中用(化??!!)一章了描述IPsec的密钥交换方案, 尽管(?)还有若干更方便的密钥加交换流方案。

练习题 :本书附上大量练习题,每一章都有若干,但是我没有完成这些题, 因为我开始阅读的时候已经有了自己的问题和计划。

3. 结论

大部分我需要掌握的知识,都能从UNP学到(除了加密以外)。

把这本书读完之后,我成功地写了一个内核修补,一个网络程序, 然后计划了如何改善3个其它的(非紧急)项目。

总体来说,Stevens的书,虽然有点干货,有点过时,但是可以给阅读者它们所需要的基础知识。

4. 联系方式

如果您在此博客或其他页面中发现任何对您有用的内容,请订阅并打赏。 请您转发、分享和讨论,您的反馈可以帮助我变得更好。

Telegram
http://t.me/unobvious
GitLab
http://gitlab.com/lockywolf
PayPal
https://paypal.me/independentresearch