原文链接:
卷一我不仅跳过了一小部份应用层合同之外。其他每一章我都仔细阅读过。我自己本身早已有tcp/ipsocket的编程经验,精读过且深入理解应用层面的网路框架,如完整的apachemina2.0的源码,对于复杂系统的分层设计的思想和目的也比较清晰。
但因为本人水平有限,难以达到热门评论中这些大鳄这么牛的开发能力和学习境界,读原版愈发没有这么多精力和时间。所以有中译版本的教程我通常不会去看英语的,尽管也可以读,但显然效率没有这么高,除非认为确实有歧义就会去对照一下。卷一我大约花了大半年,以每位周日一章的速率阅读和实践,我很难想像阅读法文原版的速率。不过因人而异吧,我只是结合自己的经验和能力而已。并且平常还有好多crud须要开发unix网络编程 卷2,其他书籍须要看,所以也不能投入太多时间精力在一个技术点上。并且你也别相信极客上这些大鳄说的哪些精通一个就行了,不哪些就会一点,笔试第一轮都过不了。
学习应用层的socket编程的过程中我也阅读过近几年出版的比较易懂的书籍,例如美国人写的《图解tcpip》,美国人写的《tcpip网路编程》,科普书《网络是如何联接的》,以及初期阅读过计算机科学译丛的《tcpip解读卷一》,《计算机网路自顶向上技巧》,以及应用编程类的《tcpip合同原理与应用》,《unix网路编程卷一,卷二》等参考书籍。现今的工程师则愈发幸福,可以选择的书籍更丰富,也更深入浅出。对于tcp解读来说很难有时间和精力看完后两卷,除非你的工作日常就是围绕这个。否则没有必要看前面两卷,我自己也不是非常关心啥底层,原理,核心的,通常都是用到再学,须要再学。并且每天都有好多crud要写,也没这么多时间研究计算机科学,rfc就愈加没有时间和精力了解,但是描述也比较冗长。
尽管储备了不少tcpip理论知识和应用层面的socket编程经验。但事实上对底层的基于c/c++的tcpip的实现原理和源码的了解也几乎为0,由于工作中并不涉及相关的开发。作为一个普普通通的工程师也没有这些天赋异禀的高手所说的一窍通百窍明,触类旁通的能力。对于小型网路及其设备的配置管理更是没有哪些清晰的概念。而我所在公司关系比较好的几个CCIE,对tcpip相关编程的概念也毫不清楚。可能对于我来说网路是透明的,对她们来说程序是透明的。
有趣的是当你具备了大量tcpip理论知识,这对你编撰和理解应用层网路框架如mina,netty也并没有哪些非常大的帮助。你仍然须要更多的应用层的socket编程知识,设计模式,多线程编程,分层设计思想。那为何还须要学习tcpip的一些常用理论呢,我的体会是当应用层的代码出现异常时,例如为何未能绑定端口,联接重置,是否须要设置nagle,输入输出缓冲区大小,地址重用,端口重用选项等问题时能得到合理的解释。就好比国外常常关注jvm的调优问题,你们对jvm的八股文也倒背如流,但事实上我看过绝大多数市面上jvm相关的书籍,文章,B站一个400多集的jvm视频(4倍速花了一周过了一遍,不过up主确实总结得挺不错),但没有任何教程能明晰地告诉你怎么配置就是优化。那学习jvm理论的意义何在,我的体会是当显存溢出时你能晓得是那里溢出了,为何会这样,须要调整那里。也就是说意义都在系统出错后能得到合理的解释和解决。不过国外好多人都是把时间花在考量原理和把原理转成笔试题和公众号的技术文章了。
不晓得粘包这种术语是不是中国特有的,之前在这种书上面印象中没有见过,但处理流数据边界的问题,tcpip合同本身的设计或则链路层的格式好多就是现成的案例,比如串行线路数据帧使用分隔符以及分隔符的通配符,tcpip的首部设计中的数据宽度,首部宽度。可能这个就是我这类普通工程师学习tcpip的意义。而不是特意去记协议的格式数组,通信交互的流程,而是能从这种设计中借鉴到一些经验用到其他创新的开发中去。不过可能遭到国外笔试八股文的影响,把学习三次握手和四次挥手当作是学习tcpip。在我的印象中卷一或维基百科tcpip相关的文章并没有指出为何一定要三次握手。甚至似乎还提及有些实现采用了2次,3次,这取决于具体实现和当时的开发者。或则因为被动断掉的接收端难以及时处理缓冲区中的数据,致使ack应答须要多次能够完成,然后发出自己的FIN,这样就不止四次挥手了。
言归正传,说一上卷一的学习心得。总的来说卷一就是一本tcpip的入门说明书,阅读困难的缘由在于本身确实不怎样深入浅出,没有生动的插图,好多技术概念难以在宏观上建立和理解。
卷一在我的大学期间,工作早期,工作后期都有尝试阅读。每一次的体会都不一样linux环境配置,学院时侯尝试这本书的时侯只有极少部份能明白,例如网路分层的意义,csma/cd,一些网路设备简单的作用。但卷一勉强看见数据链路层就早已难以理解了,由于完全不明白这个链路和链路层究竟指什么部份,它涉及好几个技术组件,软件,硬件,驱动。
首先,tcp/ip之所以对初学者十分困难,你以为学习的是合同,实际上学习的是例如软件设计,合同格式,传输机制unix网络编程 卷2,流量控制,操作系统内核与进程,设备驱动,传输媒介,网路设备,网路传输过程中的各类业务场景,以及节点管理,消息报告,差错通知,对不同硬件,网路类型的兼容性等等这种技术协同工作的方方面面,这样早已完全超出了普通开发者对软件设计的统筹规划。一开始就会被OSI的分层所欺骗,而事实上tcpip合同或相关技术的分层没有想像中隔离的这么泾渭分明虚拟主机 linux,好多层的功能或数据格式的解析过程即存在于tcpip内核的分层代码中,有些又在设备驱动中,有些又在路由器中。所以有时侯你根本分不清在说那里。虽然在同在ip层的icmp,igmp,但逻辑结构上又比ip合同高一些,arp和rarp即使在数据链路层,但又比设备驱动高一些。对于数据帧的格式也不仅仅是封装了mac地址的以太网帧格式,还有其他链路层可以接受的格式。等等这种就会让初学者困扰。
其一,计算机底层理论的学习你们都有过这样的感受,学习操作系统,计算机组成原理,编译原理的时侯常常都没有丰富的软件设计经验,而这种底层理论本身并不是仅仅是理论,本身就是各类软件编程,硬件设计实践的结晶,难以理解是正常的。tcpip通常指合同族,除此之外为何须要arp,rarp,icmp,igmp,不仅技术上的问题,好多还涉及业务场景的需求和设计。
第三,tcpip卷一这本书尽管你已然有了丰富的基于socket的编程经验,tcpip应用层的编程经验,以及一些模糊的tcpip概念和知识也难以挺好的,流畅地阅读这本书。书中有大量的术语特别混淆,通常来说有经验的开发者应当很容易理解插口在不同上下文中的意义。并且在这本书里你仍然会理解的特别困扰,它有时侯指socket的编程插口,有时侯指网路分层之间的插口,有时侯指主机的ip插口,有时侯指指网卡,有时侯又指路由器转发的插口等等。关于数据的描述,如数据,数据段,数据报,数据帧,数据包,数据分组,有时侯也须要仔细分辨等等。还有些术语的翻译可能因为历史太早,例如timeout现今通常被翻译成超时,但卷一上面叫时间溢出,但也无伤大雅。除此之外可能也有一些疏漏,但不影响阅读和学习。
假如是初学建议可以从tcpip图解开始学习理解。而tcpip卷一要想把每一句话都理解清楚,须要反复研读,并结合一些其他的网路书籍帮助理解。至于要不要读英语原版,我也说不好,假如英语能力接近母语者,应当可以直接读原文。否则英文的阅读肯定是效率更高一些。计算机科学译丛系列好多都是国外著名院校的老院长翻译的,我自己的水平肯定是不如那些院校老师的,写crud老师可能不如我,但那些底层理论老师还是有过人之处的。
初期我在知乎找一些塞琉古将军问题的相关知识,但没有非常满意的文章,基本没有能说明白的。后来YouTube看了李永乐老师的一个几分钟的视频,几个图表就清晰了,所以还是要相信老师的。其实英文仍然更便捷学习,假如遇见吃不准的地方,可以找英语确认一下。计算机科学译丛大部份我都是读的英文版本,阅读如此厚的中文原著,时间和效率上不实惠。按照我的经验目前tcpip相关的翻译书籍,基本不影响学习。
总得来说这本书并不好。但我并不是指翻译或则内容,而是知识的叙述并不太友好,插图也不够丰富。和初期20年前看thinkinginJava一样,尽管深受欢迎,但完全口语化的表述,知识点参杂在各类不经意的诗句中,须要反复阅读多遍能够从中提取出所有关键信息。但是好多精典计算机书籍都有这样的问题,对于作者来说可能上面的概念就是很自然的事情,因而不会特意打比方,加入大量插图,深入浅出。反倒这些职业的技术书画家可能并不是领域最top的技术专家,但写的书却比那些技术专家更易懂。就似乎在公司上面把软件用的十分熟练的不是开发这种软件的工程师,而是测试和使用这种软件的用户。