再论关于如何学习网络编程
Posted ksiwnhiwhs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了再论关于如何学习网络编程相关的知识,希望对你有一定的参考价值。
前些天在一个论坛上和一位朋友争论了学习网络编程的方法,而后发表了《TCP协议疑难杂症全景解析》,不算猛文,但也得到了一些回应,大家都是对Richard Stevens的两本书情有独钟:《TCP/IP详解(前两卷)》/《Unix网络编程》。我提出了自己的不同的声音,首先我不同意这两本书很重要,其次我觉得这两本书根本就不重要!
首先声明,本人并不是什么高手或者顶级黑客,也没有能力通过TCP/IP网络将电话免费盗打到梵蒂冈教皇那里,...只是稍微了解一些任何人本应该都了解的东西,只是大部分人在学校没有完成这个目标而已,不过没有关系,自学就可以了,一般而言,学校也是不怎么教深层次的网络知识的。那么现在就设计到了一个问题,那就是怎么学的问题。
要想精通网络编程,那么首先要明白,网络编程实际上是两个概念,一个是网络,一个是编程。很多人只是学会了所谓了socket接口,知道了什么recv的参数,知道了XYsockopt,就说自己精通网络编程,实际上他只是知道了编程,而可能对网络一窍不通。他知道交叉线和直连线为何这样区分吗(更进一步,为何交叉线连交换机而不能连主机[声明在非自协商情况下,以防编程的人钻牛角尖]);她可能知道慢启动这个词,然而她知道如何调优TCP吗?他可能知道路由怎么配置,然而遇到路由混乱能解决吗?这些问题往往都是很多科班出身人所忽略的,他们只在乎编程,而忽略了网络,自以为学会了编程就学会了一切,殊不知自己可能连什么是默认网关都不知道。
我不知道为何大四毕业不久的科班生有时候反而不如网吧的网管,是单纯的经验问题吗?有点原因,然而还有更深层次的原因,我不想用纸上谈兵这类贬义词,只是想说大家对C太热衷了,以至于忽略了其它,难道能用bash完成同样的事不更好吗?为何单纯只有C能体现技术含量呢?因为依恋C,因此扑在了socket,因此认为接网线,配路由,写脚本之类的事都是网管干的,结果自己就是一个代码民工。当然,这个现象也许和大学的课程安排有关,所幸我没有接受过那样的安排,我们当时只是简单的培训了网络协议和上机教程,随后我们还拿着网线钳做网线,好像是民工一样,然而正是那个时候,歪打正着的打下了日后需要的功底。
因此,学习网络编程的要点中,网络是更重要的,如果你把协议都了解了,都精通了,你的接下来的选择有很多,你可以写bash,也可以写java...但是如果你只会socket,那么可要当心夹生饭的危险,你的既有理念会阻止你去学习做网线之类的事(你认为只有写C的才是研发)(当然并不是说精通网络一定要做什么网线,只是随便举个例子而已)。学习曲线一定要确定。
Richard Stevens的两本书,从某种意义上讲,比较适合对网络协议已经很了解的人,他的《Unix网络编程》针对的就是编程,而他的《TCP/IP详解》系列我感觉还缺一本,那就是第0卷:TCP/IP协议概述,如果根本不懂什么是TCP/IP,直接通过抓包结果学习,那绝对是一头雾水或者喜欢就是论事,他的这本书比较类似国人毛德操的Linux内核情景分析两卷本,当然Richard Stevens在也不会再版了...因此也不便多说什么了。我主要想说的就是,在看Richard Stevens的书之前,你要确认自己已经很理解TCP/IP了。
另外,有位朋友提到要看TCP/IP的实现,当然这是必要,看Linux的实现是最方便的。然而对于自己来说,要看有没有必要,如果你只是一个实施人员或者售前支持,那么就没有必要十分精通它的实现,因为精通其实现最主要的目的是调优,而调优是研发的事。但是最为一条总的学习路线,看实现总是没有坏处的。
虽然我好像一直都在降低编程的重要性,但是事实上,正好相反,编程的地位应该是最高的,它正好像蒸煮好的米饭一样,是一切的最终实现,但是切莫产生夹生饭。任何的TCP实现都是通过编程语言实现的,因此我对学习网络编程的建议是:
1.写代码,了解API,但是不要在此阶段停留太久;
2.阅读RFC,了解原理,这个步骤一定要细致;
3.写代码,侧重原理的确认,确认你所在RFC中看到的事情是真的,这个阶段要花费些时间;
4.闲暇时可以看看《TCP/IP详解》,《Unix网络编程》之类的书,没时间就算了;
4.1.如果你就是想完成工作,养家糊口,那么到这一步就为止了,否则接着往下看。
5.看Linux的TCP/IP协议栈实现,必要时候Hack之,如果你真的想理解TCP/IP并且搞点大动作,这个阶段花点时间是值得的;
6.找一个网卡驱动看看,看看网卡为何这么设计,主要的是看看文档的说明,并且hack驱动,反证文档的正确性;
7.写代码,利用学到的知识不断提升性能,这个阶段就是完全自主的阶段了,你应该抛开一切的文档资料,自己实现一个优化的协议;
8.写代码,还是写代码,这个阶段,可能你要和国际大牛接触了,主要通过Maillist...
首先声明,本人并不是什么高手或者顶级黑客,也没有能力通过TCP/IP网络将电话免费盗打到梵蒂冈教皇那里,...只是稍微了解一些任何人本应该都了解的东西,只是大部分人在学校没有完成这个目标而已,不过没有关系,自学就可以了,一般而言,学校也是不怎么教深层次的网络知识的。那么现在就设计到了一个问题,那就是怎么学的问题。
要想精通网络编程,那么首先要明白,网络编程实际上是两个概念,一个是网络,一个是编程。很多人只是学会了所谓了socket接口,知道了什么recv的参数,知道了XYsockopt,就说自己精通网络编程,实际上他只是知道了编程,而可能对网络一窍不通。他知道交叉线和直连线为何这样区分吗(更进一步,为何交叉线连交换机而不能连主机[声明在非自协商情况下,以防编程的人钻牛角尖]);她可能知道慢启动这个词,然而她知道如何调优TCP吗?他可能知道路由怎么配置,然而遇到路由混乱能解决吗?这些问题往往都是很多科班出身人所忽略的,他们只在乎编程,而忽略了网络,自以为学会了编程就学会了一切,殊不知自己可能连什么是默认网关都不知道。
我不知道为何大四毕业不久的科班生有时候反而不如网吧的网管,是单纯的经验问题吗?有点原因,然而还有更深层次的原因,我不想用纸上谈兵这类贬义词,只是想说大家对C太热衷了,以至于忽略了其它,难道能用bash完成同样的事不更好吗?为何单纯只有C能体现技术含量呢?因为依恋C,因此扑在了socket,因此认为接网线,配路由,写脚本之类的事都是网管干的,结果自己就是一个代码民工。当然,这个现象也许和大学的课程安排有关,所幸我没有接受过那样的安排,我们当时只是简单的培训了网络协议和上机教程,随后我们还拿着网线钳做网线,好像是民工一样,然而正是那个时候,歪打正着的打下了日后需要的功底。
因此,学习网络编程的要点中,网络是更重要的,如果你把协议都了解了,都精通了,你的接下来的选择有很多,你可以写bash,也可以写java...但是如果你只会socket,那么可要当心夹生饭的危险,你的既有理念会阻止你去学习做网线之类的事(你认为只有写C的才是研发)(当然并不是说精通网络一定要做什么网线,只是随便举个例子而已)。学习曲线一定要确定。
Richard Stevens的两本书,从某种意义上讲,比较适合对网络协议已经很了解的人,他的《Unix网络编程》针对的就是编程,而他的《TCP/IP详解》系列我感觉还缺一本,那就是第0卷:TCP/IP协议概述,如果根本不懂什么是TCP/IP,直接通过抓包结果学习,那绝对是一头雾水或者喜欢就是论事,他的这本书比较类似国人毛德操的Linux内核情景分析两卷本,当然Richard Stevens在也不会再版了...因此也不便多说什么了。我主要想说的就是,在看Richard Stevens的书之前,你要确认自己已经很理解TCP/IP了。
另外,有位朋友提到要看TCP/IP的实现,当然这是必要,看Linux的实现是最方便的。然而对于自己来说,要看有没有必要,如果你只是一个实施人员或者售前支持,那么就没有必要十分精通它的实现,因为精通其实现最主要的目的是调优,而调优是研发的事。但是最为一条总的学习路线,看实现总是没有坏处的。
虽然我好像一直都在降低编程的重要性,但是事实上,正好相反,编程的地位应该是最高的,它正好像蒸煮好的米饭一样,是一切的最终实现,但是切莫产生夹生饭。任何的TCP实现都是通过编程语言实现的,因此我对学习网络编程的建议是:
1.写代码,了解API,但是不要在此阶段停留太久;
2.阅读RFC,了解原理,这个步骤一定要细致;
3.写代码,侧重原理的确认,确认你所在RFC中看到的事情是真的,这个阶段要花费些时间;
4.闲暇时可以看看《TCP/IP详解》,《Unix网络编程》之类的书,没时间就算了;
4.1.如果你就是想完成工作,养家糊口,那么到这一步就为止了,否则接着往下看。
5.看Linux的TCP/IP协议栈实现,必要时候Hack之,如果你真的想理解TCP/IP并且搞点大动作,这个阶段花点时间是值得的;
6.找一个网卡驱动看看,看看网卡为何这么设计,主要的是看看文档的说明,并且hack驱动,反证文档的正确性;
7.写代码,利用学到的知识不断提升性能,这个阶段就是完全自主的阶段了,你应该抛开一切的文档资料,自己实现一个优化的协议;
8.写代码,还是写代码,这个阶段,可能你要和国际大牛接触了,主要通过Maillist...
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
以上是关于再论关于如何学习网络编程的主要内容,如果未能解决你的问题,请参考以下文章