网络程序测试

少于 1 分钟读完

这里将记录一下我进行网络程序调试的一些经验。主要包括进程状态的查看,网络状况查看,日志查看,调试程序。

确定程序启动顺序

需要确定网络程序之间的启动顺序,最简单的例子就是服务端要早于客户端启动。对于复杂的网络程序,如分布式系统,服务器端往往有很多机器组成,不同的机器有不同的角色,如认证,网管,代理,配置,元数据,数据库,日志等等。他们之间有不同的启动顺序,如认证服务一般要先启动,数据库如果存储关键信息也需要先启动等。理清服务器之间的启动顺序,这是进行测试的第一步。

观察进程情况

主要是观察各个进程是否已经启动,常用的命令是ps -ef | grep 进程名,可以看到进程是否真的已经启动。没有启动的话可能原因有很多,如权限不够,端口被占用,缺少启动相关的参数等等,还有一种情况需要注意,就是之间的启动进程还未被杀死,导致新的启动失败,这种时候要注意一下启动时间。最好程序能够有启动日志,说明启动失败的原因。

观察网络情况

最常用的就是检查端口是否监听,连接是否建立,最常用的工具就是netstat命令。

netstat -apnt | grep 端口号
//输出信息
Proto Recv-Q Send-Q Local Address  Foreign Address   State  PID/Program name
tcpdump host 168.1.1.10 and port 9999 -i eth1 -Xns 500

输出的信息含义为:协议,接受队列大小,发送队列大小,本地地址,远程地址,TCP状态,进程号/进程名。仔细观察输出信息,确定是否成功,是否符合预期。此处用到了netstat命令。除了netstat命令以外,有时候还需要使用tcpdump进行网络抓包,使用nc和telnet命令来模拟客户端,使用ping命令检测网络是否相通等等。

netstat命令

作用:打印网络连接,路由表,连接的数据统计,伪装连接和广播域成员。 选项

  • -a:打印所有的连接。
  • -t:打印tcp连接。
  • -u:打印udp连接。
  • -p:查看进程号和进程名信息。
  • -n:禁止将ip地址转换成域名,加快查询速度。
  • -l:列出监听到的连接。
  • -e:显示扩展信息,例如uid等。-ne为用户ID,没有-n为用户名。
  • -s:打印统计信息。
  • -r:显示内核路由信息。
  • -i:打印网络接口,如果和-e一起使用,和ifconfig效果相同。
  • -c:持续输出信息。
  • -g:输出IPv4和IPv6的多播组信息。
  • –verbose:显示不支持的地址族。

tcpdump命令

作用:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。 实例:

  • 默认启动: tcpdump
  • 监听指定网络接口的数据包: tcpdump -i eth0(如果不指定网卡,默认只监听第一个网络接口)
  • 监听指定主机的数据包: tcpdump host hostname(打印所有进入或者离开hostname的数据包),也可以指定IP地址。
  • 打印A与B或者与C之间通信的数据包:tcpdump host Aand ( Bor C)
  • 打印A与任何其他主机之间通信的IP 数据包, 但不包括与B之间的数据包:tcpdump host Aand not B
  • 截获主机hostname发送的所有数据:tcpdump src host hostname
  • 见识所有送到hostname的数据:tcpdump dst host hostname

nc和telnet命令

这两个程序用来模拟客户端行为,看看是否能够连接上指定端口的服务器,nc还可以用来发送简单的数据,同时nc也可以作为服务器使用。

#nc作为服务器启动
nc -l port
#nc作为客户端启动
nc IP port
#telnet作为客户端启动
telnet IP port

日志查看

日志和网络程序息息相关,也是分析网络程序的利器,日志由应用程序生成,记录的程序的流程和出错情况。所以一定要重视日志的规范和设置。说到日志就想到一个和文件有关的命令lsof,是的这也是一个非常有用的命令,可以查看指定进程打开的文件,相关端口监听等等。

lsof命令

作用:是一个查看当前系统文件的工具。无论管道,套接字,目录等等,在linux系统中都是文件。 选项

  • -a 列出打开文件存在的进程
  • -c<进程名> 列出指定进程所打开的文件
  • -i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
  • -p<进程号> 列出指定进程号所打开的文件
  • -u 列出UID号进程详情
  • -h 显示帮助信息
  • -v 显示版本信息

调试程序

此时调试程序其实是非常困难的,主要用来查看当前堆栈情况和线程情况。相关命令如下:

gdb attach PID
thread apply all bt
info thread

结束

进行网络程序调试是一件非常困难的事情,主要是自己要理清思路,查看系统情况,剩下的就是不断尝试,解决问题了。

分类:

更新时间: