网络分析工具

来源:互联网 发布:mac numbers 公式 编辑:程序博客网 时间:2024/04/28 03:54

在后台开发中网络通信这一块非常重要,在处理定位问题或者多方联调时,需要用到网络分析工具。这里学习一下ping、tcpdump、netstat和lsof这4个网络分析工具的使用。

  • 1 ping
  • 2 tcpdump
  • 3netstat
  • 4 lsof

1、 ping

介绍:ping(Packet Internet Groper,因特网包探索器)是Windows、UNIX和Linux系统下的一个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。

原理:ping发送一个ICMP(Internet Control Messages Protocol,因特网信报控制协议),请求消息给目的地并报告是否收到所希望的ICMP echo(ICMP回声应答),它是用来检查网络是否畅通或者网络连接速度的命令。利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相同以及时延是多少。

作用:利用ping命令可以检查网络是否连通,可以很好地帮助分析和判定网络故障。

应用格式:ping IP 地址
例如:ping一下百度首页

# ping www.baidu.comPING www.a.shifen.com (220.181.112.244): 56 data bytes64 bytes from 220.181.112.244: icmp_seq=0 ttl=52 time=2.502 ms64 bytes from 220.181.112.244: icmp_seq=1 ttl=52 time=2.648 ms64 bytes from 220.181.112.244: icmp_seq=2 ttl=52 time=5.930 ms64 bytes from 220.181.112.244: icmp_seq=3 ttl=52 time=5.908 ms64 bytes from 220.181.112.244: icmp_seq=4 ttl=52 time=5.079 ms64 bytes from 220.181.112.244: icmp_seq=5 ttl=52 time=2.793 ms64 bytes from 220.181.112.244: icmp_seq=6 ttl=52 time=2.765 ms64 bytes from 220.181.112.244: icmp_seq=7 ttl=52 time=3.375 ms

这里发现Linux下和Windows下的ping有一点点细微的差别:
(1)Linux的ping数据包是64Byte,而Windows的是32Byte
(2)Windows下默认发送4次数据包后结束,Linux下的ping程序默认不停发送数据包,直到用户手动停止(停止命令是ctrl+c)。

ping的使用
网络连接问题是由许多原因引起的,如本地配置错误、远程主机协议失效等,当然还包括设备等造成的故障。使用ping检查连通性有以下6个步骤:
(1)使用ipconfig/all观察本地网络设置是否正确。(Linux下使用ifconfig)
(2)ping 127.0.0.1,来检查本地的TCP/IP协议有没有设置好。
(3)ping本机IP地址,这样是为了检查本机的IP地址是否设置有误。
(4)ping本网网关或本网IP地址,这样是为了检查硬件设备是否有问题,也可以检查本机与本地网络连接是否正常。(在非局域网中这一步骤可以忽略)
(5)ping本地DNS地址,这样做是为了检查本地DNS服务器是否工作正常
(6)ping远程IP地址,这主要是检查本网或本机与外部的连接是否正常。ping远程IP地址可以用来测试网络延时。

这里写图片描述

从上图可以看到,向百度域名发了10个包,对方10个都收到了,没有丢包,共耗时9013ms,RTT(一个连接的往返时间)的最小、平均、最大和算术平均差分别是1.000ms、1.066ms、1.189ms、0.074

time=1.01ms是响应时间,这个时间越小,说明连接的这个地址速度越快。

从图中还可以看出,用ping命令可以寻找固定网站网址的IP地址,其中61.135.169.121就是www.baidu.com其中一台机器的IP地址,在浏览器输入这个IP,会跳转到百度首页。

这里写图片描述

2、 tcpdump

介绍
tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助去掉无用的信息。

命令格式
tcpdump [ -adeflnNOpqStvx ] [ -c数量 ] [ -F 文件名 ]
[ -i 网络接口 ] [ -r 文件名 ] [ -s snaplen ]
[ -T 类型 ] [ -w 文件名 ] [ 表达式 ]
表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。

在表达式中一般包含如下几种类型的关键字:
(1)关于类型的关键字,主要包括host、net、port等,例如host 210.27.48.2即指明210.27.48.2是一台主机,net 202.0.0.0指明202.0.0.0是一个网络地址,port 23指明端口号是23。如果没有指定类型,默认的类型是host。
(2)确定传输方向的关键字,主要包括src、dst、dst or src等,这些关键字指明了传输的方向。举个例子:src 210.27.48.2,指明IP包中源地址是210.27.48.2,dst net 202.0.0.0指明目的网络地址是202.0.0.0。如果没有指明方向关键字,则默认是src or dst关键字。
(3)协议的关键字,主要包括fddi、ip、arp、rarp、tcp、udp等类型。fddi指明是在FDDI(分布式光纤数据接口网络)上的指定的网络协议,实际上它是ether的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当做ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。

几个实例
1、截取某主机相关的包
a、想要截获所有210.27.48.1的主机收到的和发出的所有的数据包,使用如下命令

tcpdump host 210.27.48.1

b、想要截获主机210.27.48.1和主机210.27.48.2或210.27.48.3的通信,使用如下命令(在命令行中使用括号时,一定要添加“\”)

tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

c、如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用如下命令

tcpdump ip host 210.27.48.1 and ! 210.27.48.2

d、如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令

tcpdump tcp port 23 host 210.27.48.1

2、截取某端口相关的包
获取在端口6666上通过的包,使用如下命令
tcpdump port 6666

3、截取某网卡的包
获取在网卡eth1上通过的包,使用如下命令
tcpdump -ieth1

3、netstat

作用:用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接、对TCP和UDP的监听及获取进程内存管理的相关报告。

命令格式:netstat [-acCeFghilMnNoprstuvVwx] [ -A<网络类型>][–ip]

执行netstat命令后,输出结果如下图所示

这里写图片描述

从整体上看,netstat的输出结果可以分为两部分:
(1)Active Internet connections(激活Internet连接),称为有源TCP连接,其中Recv-q和Send-Q指的是接收队列和发送队列,这些数字一般都应该是0,如果不是则表示请求包和回包正在队列中堆积。
(2)Active UNIX domain sockets(活跃的UNIX域套接字),称为有源UNIX域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)

Proto显示连接使用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其他进程使用的路径名。

常见参数如下
-a (all) 显示所有选项,默认不显示LISTEN相关
-t (tcp) 仅显示tcp相关选项
-u (udp) 仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化为数字
-l 仅列出有在Listen(监听)的服务状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令
注意:LISTEN和LISTENING的状态只有用-a 或者 -l 才能看到

各参数的使用实例如下所示:
(1)列出所有端口(包括监听和未监听的):netstat -a
(2)列出所有TCP端口: netstat -at
(3)列出所有UDP端口:netstat -au
(4)列出所有处于监听状态的socket:netstat -l
(5)列出所有监听TCP端口的socket:netstat -lt
(6)列出所有监听UDP端口的socket:netstat -lu
(7)列出所有监听UNIX端口的socket:netstat -lx
(8)在netstat输出中显示PID的进程名称:netstat -p
(9)当你不想让主机,端口和用户名显示,使用netstat -n,将会使用数字代替那些名称。
(10)持续输出netstat信息:netstat -c
(11)找出程序运行的端口:netstat -ap | grep ssh
(12)找出运行在指定端口的进程,如netstat -an | grep ‘:80’
(13)显示网络接口列表:netstat -i
(14)IP和TCP的分析,如查看链接某服务端口最多的IP地址命令是:
netstat -nat | grep “192.168.1.15:22” | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq -c | sort -nr | head -20
(15)TCP各自状态列表:netstat -nat | awk ‘{print $6}’
(16)先把各种TCP状态全部取出来,然后使用uniq -c统计,之后再进行排序:
netstat -nat | awk ‘{print $6}’ | sort | uniq -c

4、 lsof

作用:是一个列出当前系统打开文件的工具

语法格式: lsof [ options ] filename

常用的参数列表
lsof filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username 显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof -d FD 显示指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况

这里写图片描述

在命令行中输入lsof,输出结果如上图所示:
(1)每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。输出各列信息含义如下:
COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称

常用命令
(1)查看6666端口现在运行情况,命令:lsof -i:6666

(2)查看所属root用户进程所打开的文件,文件类型为txt,命令:lsof -a -u root -d txt

(3)监控打开的文件和设备。查看设备 /dev/tty1被哪些进程占用的命令是:lsof /dev/tty1

(4)监控程序,查看指定程序server打开的文件:lsof -c server

(5)监控用户,查看指定用户sharexu打开的文件:lsof -u sharexu