开始新对话

未解决

此帖子已超过 5 年

4651

2014年1月12日 21:00

工欲善其事,必先利其器 – 网络抓包

​ ​
​ ​

​工欲善其事,必先利其器 ​​– ​​网络抓包​

​ ​
​ ​

​ ​

​转载请在文首保留原文出处:​​EMC​​中文支持论坛​​https://community.emc.com/go/chinese​

​ ​


​ ​
​ ​

​介绍​

​ ​
​ ​

​ ​

​ 其实抓包不是难事,很多人都会,下个​​Protocol Analyzer​​,比如​​Network Monitor​​、​​Wireshark​​,打开点记下就可以抓了。我主要有三个问题:​

​ ​

​(1)​​ ​​你为什么想都要抓包?你的问题是否能通过抓包获取答案?​

​ ​

​(2)​​ ​​在什么情况下抓包可以帮助你发现答案?​

​ ​

​(3)​​ ​​如潮水般涌入的网络包瞬间就能淹没​​Protocol Analyzer​​的​​Packet List​​,你要从何下手?​

​ ​


​ ​

​今天就简单来谈一下这几个问题​

​ ​


​ ​
​ ​

​更多信息​

​ ​
​ ​

​ ​

​ 抓包可使用的场景很多,排错、验证、测试、核对等等,我就举几个例子来说明吧。​

​ ​


​ ​

​Case I​​:​​客户在一台存储上启用了​​SNMP​​服务,随后想通过验证​​UDP161/162​​的侦听状态来确认服务是否确实启动了。​

​ ​

​详情​​I​​:​​最简单的方式就是用进入存储的​​OS​​运行类似​​netstat –anop​​查看​​UDP​​端口状态,还有些同学会条件反射的说​​telnet​​一下呗。客户玩得比较高级,用一个叫做n​​map​​的工具做端口扫描,发现扫描结果是​​Open | Filtered​​,这又算哪门子意思?除非找到这些工具的使用说明,否则无法明白其输出的意思。但有的时候就是没有太多参考文档,比如​​netstat​​显示的​​UDP​​端口状态列都是空的,没有任何状态,这代表什么呢?其实网络抓包可以帮助我们。你可以在​​telnet​​的同时抓包,结果会发现​​telnet​​发起了​​TCP SYN​​包,立刻就被对端给​​Reset​​掉了,所以用​​telnet​​的提议是错误的,用​​TCP​​去验证一个​​UDP​​端口是否在侦听,显然是南辕北辙了。同样,做​​nmap​​扫描的同时抓包,你会发现原来​​UDP​​使用​​ICMP返回消息​​来判断端口状态。如果端口关闭,那么对端会返回​​port unreachable​​,如果没有任何​​ICMP​​返回呢?那就说明中间存在包过滤逻辑,这也是为什么客户的​​nmap​​扫描显示​​open | filtered​​,​​nmap​​也无法确认端口状态,因为没有任何​​ICMP​​消息返回。所以,客户的扫描结果不能判断端口状态,必须采取其它手段。不过这不是这个case的重点,我们的重点是可以通过抓包看到应用程序的行为。​

​ ​

​总结:​​判断端口状态的方式很多,但你是否采用了正确的方式,完全可以通过抓包来判断,它会告诉你一个应用程序的行为,帮助你发现原因。​

​ ​

​ ​

​Case II​​:​​客户发现应用程序与服务器之间的通信很慢。​

​ ​

​详情​​II​​:​​为什么拿这个​​case​​来说,因为抓包和对​​TCP​​的分析在这个​​case​​里几乎就直接问题原因所在了。通过分析​​TCP​​分段,我们发现了​​traffic pattern​​的变化,延迟由正常的几个​​ms​​逐渐转变为了十几个​​ms​​,并在之后的流量中看到了​​Window Full​​以及最终的​​ZeroWindow​​消息。对​​TCP​​熟悉的同学立马能够判断出接收端存在处理能力的问题,导致无法及时清理​​TCP​​接收缓存,使得队列长度越来越长,根据​​Little Law​​和​​Utilization Law​​,响应时间会呈指数上升,这也为什么我们会观察到响应时间的变化。还有同学提问中间的交换机​​/​​路由器是否有可能发生这样的过载?当然是肯定的,但我们这个​​case​​里不是这个问题,为什么?因为我们抓包没有看到任何重传。​

​ ​

​总结:​​抓包在这个​​case​​帮你排除了看起来最有可能是网络问题的问题,​​TCP​​的行为非常清晰的指出了问题所在。​

​ ​

​ ​

​Case III​​:​​Http​​下载失败​

​ ​

​详情​​III​​:​​抓包下载过程,发现下载失败是因为​​TCP reset​​,但又是什么导致​​TCP reset​​呢?客户是一家​​web hosting​​网站,提供文件下载,他说这不是个案,有很多他们的客户抱怨说下载失败。因此我们初步会怀疑是服务器端的问题。在抓包后,我们发现数据传输开始是正常的,数据包长度都为​​1460bytes​​,而且客户端也在不时的​​Ack​​数据。直到某个数据没有被​​Ack​​,随后变发现了​​tcp reset​​。仔细观察后发现,没有被​​Ack​​的那个包的长度并非​​1460bytes​​,而其它所有数据包都是​​1460bytes​​。至此,虽然不能​​100%​​确认问题所在,但是你有理由让服务器端的应用开发人员做​​Application debugging​​,为什么服务器端应用程序会改变发包大小,当然对​​TCP​​来讲,这不是问题,比如TCP sender buffer就是只有这么点数据。但突然之间的大小变化,以及Ack的奇怪行为让我们有理由怀疑,服务器端程序的逻辑或许存在问题。​

​ ​

​总结:​​在海量数据下,如何做到火眼晶晶找出数据包的不同是需要练习的。​

​ ​

​ ​

​Case IV​​:​​这并非是一个问题,还是要教会我们如何怀疑任何存在疑点的延迟。理论上,你应该很清楚自己网络内所有的​​delay component​​,因为它们都是可以通过计算获得的。但有的时候,无法解释的延迟,就需要你理解协议和看包的能力。在这个​​case中​​,我们遇到的是​​TCP Nagle​​和​​Delayed-Ack​​算法之间的临时通信死锁问题。​​Nagle​​只允许一次发送一个小包(​​ ),除非收到 ​​Ack​​;而 ​​Delayed Ack​​要求至少收到两个包,否则不 ​​Ack​​;如此一来,两种就会较劲,直至 ​​Delayed-Ack timer​​超时,通常会有 ​​200ms​​的延迟。因此,在这种情况下,对延迟非常敏感的应用很容易超时报错,甚至 ​​crash​​。你完全可以抓包,而理解 ​​TCP​​行为和解释不正当的 ​​200ms​​延迟就是你的任务了。通常来说,在如今的一个健康的 ​​LAN​​内,不可能会有 ​​200ms​​网络延迟,一定是协议或应用本身的行为,而抓包给你机会去证明这一切。 ​​ ​

​ ​

​ ​

​Case V​​:​​NFS mount​​失败​

​ ​

​详情V:​​这是我自己的一个​​case​​,我并不熟悉​​NFS​​,只是在测试​​VNX​​时,​​NFS mount​​失败。抓包后发现整个​​MOUNT​​过程涉及了​​RPC​​、​​port-mapper​​、​​NFS​​、​​MOUNT​​四种上层协议。于是我就下载了所有​​RFC扫了​​一遍,发现协议消息本身的数据结构和消息编号在​​RFC​​文档内都能找到。对于我见到的错误消息,找到对应的报错协议​​RFC并搜索该错误​​,立马就能找到对应的解释,原来是权限问题。到​​VNX​​上调了一下,问题就解决了。​

​ ​

​总结:​​抓包可以帮住你揭示一些隐藏在上层协议下面的东西,你以为自己只是在做​​nfs mount​​,但其实涉及了不同的协议,任何一个出现问题,都会发生失败。抓包显示的错误消息,帮助你知道应该搜索哪个文档,哪个关键字,直指问题所在。这也有助于你学习新的协议。​

​ ​

​ ​

​ 最后,给到大家一些建议:​

​ ​


​ ​
    ​ ​
  • ​网络包在大部分时候能够告诉你真相,所以用好它很有价值。​
  • ​ ​
  • ​网络包告诉你发生了什么,但不会告诉你为什么发生,理解协议行为和分析是你的任务。​
  • ​ ​
  • ​不要只看文档,尝试抓一下包,因为真相可能和文档是不同的。​
  • ​ ​
  • ​面对海量数据包,需要训练你的眼睛和大脑来过滤消息​
  • ​ ​
  • ​TCP​​其实是老好人,不要总是责怪它。理解它,分析它,你会发现错误大部分时候是在别的地方。​
  • ​ ​
  • ​新一代数据中心网络十分复杂,用好工具,会帮你解决很多难题。​
  • ​ ​
​ ​


​ ​
​ ​

​参考​

​ ​
​ ​

​ ​

​ ​

​ ​


​ ​
​ ​

​应用于​

​ ​
​ ​

​ ​

​网络抓包分析​

​ ​
没有回复!
找不到事件!

Top