网络通信 频道

攻城略地 大神手把手教你K掉网络难题

  【IT168 评论】所谓“三百六十行,行行出状元”,不论是核桃雕船亦或是鸡蛋扎花,也须“日省月试,必待精深,然后官之”。从事互联网工作的大神们,即使通其道,精其髓,也必有绕不过去的坎儿。那些年,曾掉过的深坑,淌过的眼泪,还有堪比为了6s切肾的切肤之痛,惟外人不可道也。

攻城略地 大神手把手教你K掉网络难题

  近期,ChinaUnix论坛上进行了一期《那些年,hack过的网络问题》的话题讨论。话题还没开始,《精通Linux内核网络》这样一本书竟抢足了风头,以迅雷不及掩耳之势席卷了贴子大江南北,迅速抢占话题榜头。

  那就顺应其势吧,从这本书开始也未尝不可。《精通Linux内核网络》讨论的是Linux内核网络栈的实现及其原理,并详尽分析了其网络子系统及其架构,非常适合从事网络相关项目的专业人员进行借鉴学习。

  网友GFree_Wind表示,关于内核方面感觉还凑合的书籍,一本也不会放过,《精通Linux内核网络》也早是囊中之物。阅读了此书的1/3后,他觉得有必要为欲购买此书进行Linux内核学习的人敲一下警钟:

  “这本书与题目太不相符了,一点也不深入,每个方向都是浅尝辄止。一遇到比较麻烦的,复杂的内容,就干脆不讲了。对于比较熟悉内核的人来说,书中讲的,大部分大家都知道;反过来,对于初学者来说,同样感觉不适合,因为该书缺乏框架性质的讲解,而初学者对于网络模块的框架并不十分熟悉。总的来说,这本是远不如《Linux Networks Internal》这本书经典——尽管这个内核版本太老了。”

  对于Linux内核网络的学习过程,许多网友都生出一些感概:当初怎么啃都啃不透,摸打滚爬多年后,回顾一下以前学习过的资料内容,竟有豁然开朗之意。

  网友shenlanyouyu:“在学校时看Linux内核源代码情景分析和深入理解Linux内核,怎么也不得要领,工作后周末看的时候竟觉得非常带劲,非常有感觉。”网友nswcfd说:“在实践中遇到了问题,四处查找资料,不经意间,重新翻翻以前看过的书,才发现这些问题在书上都讨论过,这样就能理解得更深入了。”

  网友Godbach:“很多书,经过一段时间,当然,也是有一段相关的工作经历之后,再去看,往往会有豁然开朗的感觉。”

  那么问题来了:Linux内核网络中的难题是最令人头疼的吗?

  网友pywj777有一些经验之谈,都是当初一头扎进代码里挣扎不出的血泪史。他提到:“学习Linux网络协议栈代码,一是要深入了解网络协议,推荐书《TCP/IP详解》卷一,至少看3遍;二是看整个协议栈流程代码之前,先搞懂SKB的整体架构和接口;三是看协议栈流程时,不要过多关注代码细节,先将整个框架流程了解清楚;四是根据自己的需要了解相应协议或业务的实现细节;五是在了解协议栈实现细节时,推荐看一下《深入理解Linux网络内幕》。”

  pywj777可谓在内核网络开发方面浸淫多年,所享经验字字珠玑啊。

  而网友Shenlanyouyu在进行深入研究网络功能或者工具时,甚至从应用层代码直接杀到内核态:“只有一次,就是自己在研究Linux Netlink机制时。Linux 抛弃到以前使用的devfs,引入udev系统,这样在/dev目录下就不会存在很多没有设备文件。而udev的实现就是基于Linux Netlink机制,Netlink是Linux内核中一种内核和用户层之间通信的方式,实现在网络协议栈中。Udev的好处是,driver不需要手动在/dev目录创建设备文件。当时为了弄清楚是怎样实现的,下了udev的源代码,从应用层一步步追到内核代码,还分析Linux驱动子系统,kobject系统。”

  看来即使很多人都在Linux内核网络的坑里挣扎过,但也终于守得云开见月明,把这块硬骨头给拿了下来。其实,互联网渗透到各行各业,层出不穷的网络问题铺天盖地而来,除了Linux内核网络,还有许多网络难题也使许多大神失足深陷,却又在一次又一次沙石泥流中涅槃重生,练出庖丁解牛之技艺。

  网友bbzsxjj解决过内网丢包问题。

  “之前用rsync做备份,由于数据量大,又没考虑带宽问题,结果发现,每天都会有些业务经常性卡顿,写个脚本测试,发现卡顿时候内网丢包,检查网络设备没有发现异常,查看监控发现流量很大,基本把内网口跑满,最后检查发现是备份导致的,最后使用rsync自带的限速功能备份,解决问题,此问题折腾了1个星期,主要是问题不明显,发现不及时,另外开始都是在网络设备层找问题,最后发现和网络设备一点关系都没有。”

  网友shenlanyouyu遇到过许多兼容性方面的问题。

  “做无线网络开发时,遇到很多兼容性的网络问题,这些问题一部分通过读协议的SPEC,加上对比air log来解决。例如在和一个路由器做连线测试时,client没法获取到IP地址。抓取log分析发现,client发送DHCP request包给AP,AP没有响应DHCP offer包,多次尝试后client放弃连线,连线失败,但是没有办法知道AP不响应的原因。因为此时使用其他的client连接是可以成功,根据现象只能大胆猜测是测试client有什么操作将AP状态机弄乱了,从这方面入手找到原因。”

  写在最后:不难看出,技术分享实属不易,都是在失败中总结出的宝贵经验。在攻克网络难题的道路上,学习没有捷径,经典书籍+代码+操作永远是不二法宝。但是,防坑慧眼也要常备,实际网络环境与测试、开发环境不能一并而论,凡事三思而后行必能事半功倍。

  更多讨论详情:http://bbs.chinaunix.net/thread-4184165-1-1.html

0
相关文章