前些天在一个论坛上和一位朋友争论了学习网络编程的方法,而后发表了《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...

再论关于如何学习网络编程相关推荐

  1. 手把手教你学习网络编程(1)

    手把手教你学习网络编程(1) 目录: 1) 什么是套接字? 2) Internet 套接字的两种类型 3) 网络理论 4) 结构体 5) 本机转换 6) IP 地址和如何处理它们 7) socket( ...

  2. Python30 网络编程通讯协议,1.学习网络编程的目的 2.什么是互联网 3.c/s结构 4.通讯基本要素 5.OSI模型...

    今日内容: 网络通讯协议 1.学习网络编程的目的 2.什么是互联网 3.c/s结构 4.通讯基本要素 5.OSI模型 思维路线 目的是要链接互联网中的其他计算机 物理层 用物理介质链接其他计算机 数据 ...

  3. 0x011.Python学习-网络编程、PortScan

    Python3 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

  4. 将继续深入学习网络编程

    一段时间了,已经可以熟练在Java使用Socket和nio编写服务器应用程序,对一些流行的nio应用框架也有了较深的了解,也自己做了一些实现,并且应用到实践中去. 我想,我需要从三个方面继续深入学习网 ...

  5. java学习-网络编程

    一.前期配置:安装tomcat服务器 现代的应用程序都离不开网络,网络编程是非常重要的技术.Java SE提供java.net包,其中包含了网络 编程所需要的最基础一些类和接口.这些类和接口面向两个不 ...

  6. Linux学习——网络编程基础及TCP服务器

    目录 一.网络采用分层的思想: 二.各层典型的协议: 三.网络的封包和拆包: 四.网络编程的预备知识 4.1.SOCKET 4.2 IP地址 4.3 端口号 4.4 字节序 五.TCP编程API TC ...

  7. 系统的学习网络编程,这篇就够了!(来收藏夹里吃灰)

    主机字节序和网络字节序: 在32位机器上,累加器一次能装载4个字节,这四个字节在内存中排列顺序将影响它被累加器装载成的整数的值 大端字节序(网络字节序):一个整数的高位字节存储在内存的低地址处 小端字 ...

  8. (转到C区)[献给想深入学习网络编程的朋友] C,C++网络编程学习简明指南

    链接地址https://bbs.csdn.net/topics/320058717

  9. python网络编程学什么_python网络编程学习《一》

    最近,刚实习完,很喜欢实验楼,但是自己的方向仍然不能确定,自己觉得可选择的空间很大,尽管已经是大四的人了,想到别人都在忙着买职业装,买高跟鞋面试,学习化妆什么的,看看自己,反而开始慢慢关注运动,食疗以 ...

最新文章

  1. 指针运算(自己做个笔记)
  2. docker run后台启动命令_Docker命令详解之run
  3. z = x++ - --y * b/a;
  4. 【pmcaff】pm怎么跟妈妈解释自己是做什么的
  5. python简单词频统计_python简单词频统计
  6. memcached mysql缓存_memcached做数据库缓存
  7. 画王八java代码参数_java画乌龟源代码-郭遥航.doc
  8. JAVA shell export_Java 远程调用Shell
  9. android115 自定义控件
  10. 教你如何修改运行中的docker容器的端口映射
  11. 浅谈几种常见 RAID 的异同
  12. dis的前缀单词有哪些_学好单词得靠词根词缀来帮忙
  13. python提取全部个股数据_Python 股票历史数据的获取
  14. [Python]学生成绩分析, 可视化以及建模--在线教育行业分析案例连载3
  15. 使用easypoi导入导出excel,SSM和SpringBoot通用代码
  16. 业务监控 开源_将您的开源项目转变为业务的钥匙
  17. iOS真机调试步骤(Xcode8.0以上版本)(2015年)
  18. 【Leetcode】leetcode 发布题解后无法编辑(已解决)
  19. CAD/SolidWorks/UG/ProE/Creo/Catia/3dsMAX/2D/3D绘图软件远程安装协助
  20. 获取微信、新浪微博等apk签名的方法

热门文章

  1. 读书笔记:《图说区块链》
  2. ESP-Hosted 入门介绍 使用指南
  3. numpy中stack的用法直观理解
  4. 夜神模拟器抓取数据包
  5. 炫 音乐可视化 html5 在线,HTML5打造的炫酷本地音乐播放器-喵喵Player
  6. 深圳python 培训班价格
  7. android JavaMail报错:SendFailedException: No recipient addresses
  8. 影视后期制作课题报告
  9. 决策树(python)
  10. [bzoj4816][Sdoi2017]数字表格 (反演+逆元)