Tcpdump和Wireshark

用过tcpdump来抓包的人,再使用Wireshark,估计都会说好。
很遗憾,我对tcpdump这个命令的使用,只是皮毛。拿一个曾经用过的命令,现在让我再解释每个参数的意义,还真无法一一说得上来:

tcpdump -i eth1 port 60777 and '(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -s 0 -A -n -S -q -c 1024

每个参数的解释大概如下:

  1. -i eth1: 抓取eth1这个设备的包
  2. port 60777: 只抓取端口60777的包
  3. ‘(((ip[2:2] - ((ip[0]&0xf)<<2)) -="" ((tcp[12]&0xf0)="">>2)) != 0)’: 参考自man手册,只抓有数据的包,不包括SYN, FIN和只有ACK的包
  4. -s 0: 从每个包中抓取多少字节的数据,设置为0,表示抓取65535字节,我期望抓取整个包
  5. -A: 把包的内容按ASCII打印
  6. -n: ip地址保持为数值
  7. -S: 绝对序列号,而不是相对序列号
  8. -q: quiet, 显示少量的协议信息
  9. -c 1024: 抓取多少个包,抓到1024个包后就停止

即使把这个命令放到explainshell.com去解释,它也无法完全解释。
explainshell

tcpdump的参数和过滤规则要玩得好,还是不简单的,还要求熟悉tcp协议和数据格式。而且抓下来的包,要进行分析也不是很直观。对于上面的命令,我抓取1024个包,然后按字段过滤包的内容(一个包一行记录),来判断我期望的数据能否正确传输。

总之,tcpdump我用起来很慢。

有同学向我推荐了wireshark这个图形界面的软件。抓包、分析包,一套搞定,跨平台,还可以分析tcpdump抓下来的包。用过几次,过滤规则跟tcpdump类似,在wireshark中设置过滤规则很简单;而对于包的分析,由于有图形界面,能自动分析出每个包中各个协议、数据,看起来非常直观。

比如我wifi连接路由器,想抓取端口49713的数据,点几下就可以设置这么一个过滤规则:
设置规则



抓了几个包,停止抓取,设置每个包的时间显示格式,方便查看:
显示的时间格式



可以查看到:

  1. 本地在哪个时间点发起tcp连接,哪个时间结束连接
  2. 若有数据包,数据的内容,可以直接查看到
  3. 由于我按端口来过滤,通过端口的指向方向,可以清楚看到本地和服务端的交互情况
  4. 通过TCP的状态SYN, ACK, FIN, PSH可以清楚看到每个包是做什么的
    分析的几个点

在上图简单抓取的包中,如第1行的数据,在2013-10-23 22:49:58这个时间点,我本地以端口50726向服务端的49713端口发送一个SYN包,请求建立连接。

第2行的数据,服务端回复一个「SYN, ACK」给予确认,第3个包,我本地回复一个「ACK」给到服务端,连接建立。

连接建立后,第4个包,包含了「PSH, ACK」,我本地向服务端传输一个数据包,第5个包,服务端回复一个「ACK」,表示已接收数据。

第6个包,服务端发送一个「PSH, ACK」包,对上面的数据进行相应,在这个包中带有回复的数据。

第7个包,我本地收到回复的数据,发送一个「ACK」表示已接收。

然后本地发送第8个包, 即「FIN, ACK」给到服务端,表示我本地要关闭连接啦,请做好准备。

第9个包中,服务端表示当前也没有数据要给客户端了,要关闭就关闭,回复一个确认关闭的包「FIN, ACK」,给到我本地,这次socket至此关闭。

第10个包,以及后续的包,跟上面类似,只不过是多了很多数据交互的包。

通过上面的抓包,看到双方交互的情况,tcp的连接和数据交互都跟预期一致,说明:

  1. 当前网络状况良好,没有发生tcp包重传的情况
  2. 在某个时间点,服务端收到了数据,收到哪些数据,数据是否正常,到服务端查一下日志,看看服务端的处理逻辑和答复结果,是否跟预期一致,这都有助定位问题。比如出了某个故障,根据现场一些表象,猜测在某个时间点socket已经关闭,但根据抓到的包,在对应这个时间socket还在数据交互,于是就可以推翻这个猜测,有图有真相
  3. 客户端类似,核对某个时间的交互情况,都是有助定位和分析问题

查看时,也可以按规则来过滤出我们想要的包,比如「只」查看第一个tcp连接的情况,可以设置过滤:
设置规则

更方便的是,可以查看某个tcp连接「完整」传输过程中所有的数据,只须在过滤出某个tcp连接之后,随便选择一行,右键,选择「follow tcp stream」,是的,我们想要的数据都出来了,这时我们会明显感觉到,https加密传输的重要性了。



目前也只是简单用到这了。对于wireshark的常用抓包规则,推荐Wireshark - 简明教程 - 过滤器

最后,祝自己今天生日快乐, :)



– EOF –

Categories: in_mac
Tags: mac,network