Tcpdump一次抓包记录(Postgresql通信)
1 背景 最近在调试一个gsql灌数据时的卡死问题,问题的跟因还没有分析清楚,和社区上的一个问题十分类似:
为了分析清楚这类问题,这里记录一下使用tcpdump的方式去分析pg的通信过程。 2 Tcpdump安装下载网址:http://www.tcpdump.org/#latest-release - 下载tcpdump-4.6.2.tar.gz libpcap-1.6.2.tar.gz - 编译安装libpcap - 编译安装tcpdump
或 sudo yum search tcpdump
sudo yum install tcpdump.xxx
ps. tcpdump提供了c接口:http://www.tcpdump.org/pcap.html 3 Tcpdump 参数NAME
tcpdump - dump traffic on a network
SYNOPSIS
tcpdump [ -AbdDefhHIJKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ] [ -C file_size ] [ -G rotate_seconds ] [ -F file ] [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ] [ -P in|out|inout ] [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ] [ -E spi@ipaddr algo:secret,... ] [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ]
4 使用Tcpdump调试PostgreSQL
1、psql发送drop table TEST。
23:44:08.563717 IP 127.0.0.1.53757 > 127.0.0.1.8473
2、数据库后端返回结果。
23:44:08.570911 IP 127.0.0.1.8473 > 127.0.0.1.53757
3、psql向后端发包。
23:44:08.570942 IP 127.0.0.1.53757 > 127.0.0.1.8473
(20160714以上) 5 分析数据(非连接池)5.1 执行SQLselect * from test;
5.2 抓包情况抓到了三个包,这里只引出分析方法,不同的SQL有不同的通信策略。、
5.2.1 第一个包[PSH,ACK][Q]51开头的高亮部分是数据库填充的数据,前四行和第五行的60 94是IP和TCP报文。(TCP/IP报头分析的一篇博客) 数据库填充的数据为: |5100这里开始为数据库填充的数据
0x0030: 0002 6094 5100 0000 1873 656c 6563 7420 ..`.Q....select.
0x0040: 2a20 6672 6f6d 2074 6573 743b 00 *.from.test;.
消息的第一个字节标识消息类型,然后后面跟着的四个字节声明消息剩下部分的长度(这个长度包括长度域自身,但是不包括消息类型字节)。请根据消息类型去手册中查询对应的包,这里第一个字节为Q决定了消息的格式: Query (F)
Byte1(’Q’)
标识消息是一个简单查询。
Int32
以字节计的消息内容长度,包括长度本身。
String
查询字符串自身
5.2.1 第二个包[PSH,ACK][T]SQL执行结果: postgres=# select * from test;
i ---
1
(1 row)
Byte1(’T’)
标识消息是一个行描述
Int32
以字节计的消息内容长度,包括长度本身。
Int16
声明在一个行里面的字段数目(可以为零)
然后对于每个字段,有下面的东西:
String
字段名字
Int32
如果字段可以标识为一个特定表的字段,那么就是表的对象ID;否则就是零。
Int16
如果该字段可以标识为一个特定表的字段,那么就是该表字段的属性号;否则就是零。
Int32
字段数据类型的对象ID
Int16
数据类型尺寸(参阅pg_type.typlen)。请注意负数表示变宽类型。
Int32
类型修饰词(参阅pg_attribute.atttypmod)。修饰词的含义是类型相关的。
Int16
用于该字段的格式码。目前会是0(文本)或者1(二进制)。
从语句的Describe 返回的RowDescription里,格式码还是未知的,因此总是零。
5.2.1 第三个包[ACK]ps. 抓包分析过程 1、sudo tcpdump -i lo -s0 -X port 8473 -w select.cap 生成select.cap 2、使用wireshark打开select.cap (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |