入门:tcpdump tcpflow

调试硬件和后台的socket通信,需要检测数据包是否发送正确。为了查看packet,使用了tcpdump和tcpflow(后台系统是CentOS),这里做个记录。

tcpdump

首先安装,需要sudo权限:

sudo yum install tcpdump

tcpdump 可以dump网络的连接状况,可以监听网卡,某个主机/端口的连接等等,还可以设置过滤器。常用的操作如下(注意tcpdump需要sudo权限):

tcpdump -D // 列出网卡
tcpdump -i eth0 // 打印经eth0的数据
tcpdump -i eth0 -A 'port 6969' //打印经eth0目的端口为6969的数据数据以二进制格式
tcpdump -i eth0 -nA 'port 6969' and 'tcp[tcpflags] & tcp-push != 0' //打印显示经eth0目的端口为6969类型为tcp中的push的数据数据以二进制格式

其中,预先定义的tcp包类型有: tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg 其他有用的参数:

-X:以十六进制和二进制打印数据包信息,不包括链路层报头
-XX:以十六进制和二进制打印数据包信息
-t:不打印时间戳
-tt:打印时间戳,以秒为单位计算至1970-1-1 00:00:00的时间差
-ttt:打印和上一条报文的时间差
-c: 设置抓取报文的数量
-w: 存储到指定文件,类型`application/vnd.tcpdump.pcap`,后缀 `pcap`

tcpflow

tcpdump已经足够强大,这里使用tcpflow是因为它可以将数据包内容的内容打印出来--因为实际使用tcp连接的时候,关注的是数据格式和内容。tcpflow也需要sudo权限通过yum安装,安装后:

tcpflow -i eth0 //保存eth0的数据流,并存储到本地文件,文件命名以客户端ip为名
tcpdump -ic eth0 -nnA 'port 6969' //打印经eth0,端口为的数据到终端

此外,还能读取tcpdump存储的pcap文件 :

tcpflow -cr sock.pcap

更多命令,可以man之。