APP下载

利用Wireshark查找进程间网络通信问题

2015-06-28隽,李

铁路计算机应用 2015年9期
关键词:网卡网络通信线程

刘 隽,李 博

(1.中国铁道科学研究院 通信信号研究所, 北京 100081;2.中国铁路总公司 科技管理部, 北京 100844)

方法与应用

利用Wireshark查找进程间网络通信问题

刘 隽1,李 博2

(1.中国铁道科学研究院 通信信号研究所, 北京 100081;2.中国铁路总公司 科技管理部, 北京 100844)

本文描述一个在实际应用中遇到的进程间网络通信问题,介绍利用Wireshark对网络通信数据进行捕获、分析,并定位出问题产生原因的过程。

Wireshark;进程间通信;UDP;网络协议分析

进程间通信有多种机制,其中利用套接字(Socket)实现进程间数据交换是比较通用的一种。由于通信的进程之间隔着多层网络协议以及设备,如果出现数据发送与接收方面的问题,就需要对网络数据进行捕获与分析,弄清楚数据出处。

1 问题描述

在一台主机上同时运行A、B两个软件,A属于3层架构中的数据访问层,B属于业务逻辑层。B将业务逻辑信息发送给A,再由A通过局域网转发给其它展现层终端软件。A同时还要对B的运行状态进行实时监控,在一段时间内,例如5 s,如果无法收到B的任何信息,A将终止B的运行并重新启动B。A与B的开发及运行环境如表1所示。

在实际运行过程中,A会不定期终止B进程,而且频率远超出了设计所允许的范围。查看A的运行日志,终止B的原因是A的信息接收计时器超时,而B的运行日志则显示已经按时向A发送心跳信息。在排除了A、B信息发送与接收计时出错的可能性之后,问题聚焦在A与B两进程之间的数据通信上。

UDP是一种无连接的传输层协议,重效率轻可靠性,不提供数据包分组、组装,不能对数据包进行排序,因此当报文发送之后,是无法得知其是否安全完整到达的。如此一来,就难以断定到底是B进程的发送出了问题,还是A进程的接收出了问题,因而需要通过其它方法来获得A、B之间实际的数据发送与接收情况,也就是要对网络通信数据包进行截获与分析。

表1 开发及运行环境

2 Wireshark

Wireshark是一个遵循GNU GPL许可证的开源网络协议分析软件。Wireshark利用网卡的混杂模式,通过WinPcap接口直接获取网络数据包,不影响正常通信,并以易于理解的方式展现给用户。

Wireshark能够在多种UNIX、Linux以及Windows操作系统上运行,它的特点如下。

(1)多协议支持:既支持TCP、UDP、HTTP等通用协议,也支持AppleTalk高级协议。(2)实时网络数据分析:能够获取网络上的实时数据流,并快速生成与数据相关的协议、传输介质、通信通道等信息。(3)友好的用户界面:具有交互式图形界面,便于对获取的数据包进行分析。同时提供数据包过滤、导出、名称解析等高级选项。(4)开源项目:全球近1 000位程序员参与软件的开发,每个用户都可以依据各自的需求编写代码并将其加入到项目中。

Wireshark拥有的强大而可靠的功能,利用它来分析A、B进程间的实际通信情况是一个不错的选择。

3 本机IP通信问题

在Windows中发送网络数据时,如果目的地址就是本机的IP地址,数据包经过本机TCP/IP协议栈的传输层、互联网层交给网络访问层内的网卡驱动程序处理,随后通过环回接口再返回到互联网层,因此数据不会出现在相应的网络上。本文中A、B进程之间的通信正是通过主机的实际IP地址192.168.1.16进行的,因而正常情况下B发送的数据包不会被Wireshark所获得。为了确保Wireshark能够正常发挥作用,需要修改主机的路由表,增加一条从本机IP到默认网关的路由。遵从这条路径,B进程发送的数据包就会由本机物理网卡发送给网关,经网关中转回本机后再发给A进程。数据包一经过本机网卡,就能够被Wireshark轻松获取。

增加路由的命令格式如下:

route add <本机IP> mask 255.255.255.255 <默认网关IP> metric 1

4 使用Wireshark捕获数据

4.1 选择目标接口

Wireshark具备同时对一台主机上的多个不同类型网络接口进行数据捕获的能力,为了避免有用的信息被淹没在海量的数据中,需要将目标接口限定在网卡上,也就是具有192.168.1.16地址的那个网卡。

4.2 设置捕获过滤器(Capture Filter)

通过捕获过滤器可以让Wireshark只捕获满足条件的数据包。

本文使用的捕获过滤器表达式为:udp && host 192.168.1.16。其含义是:只捕获UDP数据包,并且数据包的地址是192.168.1.16。

4.3 设置显示过滤器(Display Filter)

通过显示过滤器可以让Wireshark对已捕获的数据进一步筛选,并显示在用户界面上。

本文使用的显示过滤器表达式为:eth.dst == 40:f2:e9:9d:b9:d4 && udp.dstport eq 1024。其含义是:显示目标网卡的MAC地址是“40:f2:e9:9d:b9:d4”(也就是192.168.1.16对应的MAC地址),并且UDP目标端口是1024的数据包。

4.4 捕获数据包

Wireshark在执行实时数据捕获时,会将有效数据显示在界面的数据包列表、数据包详情、数据包字节3个区域中。数据包列表区中列出了所有符合过滤条件的数据包,内容为序号、时间、源地址、目标地址、协议类型等;数据包详情区会将用户在数据包列表区选中的某数据包的详细信息展示出来,包括各层协议的字段内容;数据包字节区以16进制形式显示出选中数据包的全部字节内容。

4.5 创建图表

本文中关心的是数据发送与时间的关系,数据统计图能更加直观的反映通信变化的趋势。Wireshark提供了IO Graph来绘制这样的统计图。IO Graph的参数是可以定制的,例如:将X轴定义为实际时间轴,1 s/刻度,刻度间隔10像素;Y轴定义为数据包数量轴,1包/刻度,最大刻度为10;数据过滤器表达式与显示过滤器表达式一致。

4.6 完成捕获

如果捕获到了足够多的数据包,可以停止捕获,并将全部的捕获数据或者仅数据包列表区的数据保存成捕获文件,以便于进行后续的离线数据分析。

5 数据分析

通过查看A进程的运行日志,得知B进程在19:06:35出现信息发送超时现象。利用Wireshark绘制的相应时段IO Graph如图1所示。

图1 B进程数据发送IO Graph

图1 中先出现尖峰,随后进入波谷并探底,最后又恢复正常。再查看对应时间段数据包列表区和数据包详情区显示的信息,B进程在19:06:27~19:06:30发送大量的业务信息,1 s后停止发送信息,在大约4 s后的19:06:35恢复正常,继续发送心跳信息。上述情况在后续长时间的捕获与分析中也多次反复出现,初步结论是业务信息的发送影响了心跳信息的按时发送。

随后通过复查B的源代码印证结论。B采用两个独立的线程分别负责发送业务信息和心跳信息,线程间共用一个UdpClient通信对象。虽然在两个线程间设置了同步锁,但业务信息发送线程在完成发送任务后没有及时释放通信对象和同步锁,进而造成心跳发送线程等待时间过长,后续心跳发送超时。

问题的根源找到了,解决方法就是在业务信息发送线程完成信息发送后迅速释放通信对象,解除同步锁。

6 结束语

Wireshark可以查找网络通信的问题,本文捕获、分析同主机进程间网络数据的过程就是Wireshark的基本应用方法,这套方法同样可以用来追踪主机间,基于各种协议的网络通信问题。

[1]林沛满. Wireshark网络分析就这么简单[M]. 北京:人民邮电出版社,2014.

[2] Singh, Abhinav. Instant Wireshark Starter[M]. Birmingham: Packt Publishing, 2013.

[3] Stevens, W.R. TCP/IP Illustrated, Volume 1: The Protocols[M]. Reading, Mass: Addison-Wesley, 1994.

责任编辑 陈 蓉

Solving inter-process network communication problem via Wireshark

LIU Jun1, LI Bo2
( 1. Signal & Communication Research Institute, China Academy of Railway Sciences, Beijing 100081, China; 2. Department of Science and Technology, China Railway, Beijing 100844, China )

This paper described an inter-process communication problem encountered in practical application scenario, and introduced in detail the trouble-shooting procedure, which included the capture and analysis of network communication data via Wireshark.

Wireshark; inter-process communication; UDP; network protocol analysis

U285.4∶TP39

A

1005-8451(2015)09-0030-03

2015-01-06

刘 隽,副研究员;李 博,工程师。

猜你喜欢

网卡网络通信线程
基于C#线程实验探究
部署Linux虚拟机出现的网络故障
基于国产化环境的线程池模型研究与实现
线程池调度对服务器性能影响的研究*
基于网络通信的智能照明系统设计
Server 2016网卡组合模式
网络通信中信息隐藏技术的应用
基于网络通信的校园智能音箱设计
谈计算机网络通信常见问题及技术发展
挑战Killer网卡Realtek网游专用Dragon网卡