作为一个DBA,你有必要了解一下tcpdump
Posted 高效运维
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作为一个DBA,你有必要了解一下tcpdump相关的知识,希望对你有一定的参考价值。
一、简介
tcpdump 是一款强大的网络抓包工具,dump the traffice on anetwork,对网络上的数据包进行截获的包分析工具。熟练掌握 tcpdump 可以方便我们跟踪解决网络丢包,重传,数据库链路调用等问题。
二、使用 tcpdump
2.1 语法
tcpdump 的语法如下:
Usage: tcpdump [-aAdDefhIJKlLnNOpqRStuUvxX] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ]
[ -Q|-P in|out|inout ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ] [ -y datalinktype ] [ -z command ]
[ -Z user ] [ expression ]
1. Type(类型)选项包括 host,net 和 port,缺省为 host
host(缺省类型): 指明一台主机,如:host 10.215.20.13
net: 指定网络地址,net 10.215.20.0
port: 指明端口号,port 3306
2. Direction(方向)选项包括 src 和 dst 以及它们的组合
确定方向的关键字
dst or src(缺省值) 指定源或者目标地址是 10.215.20.13的流量包
src: src 10.9.51.13, 指定源地址是10.9.51.13
dst: dst net 172.0.0.0, 指定目标网络地址是172.0.0.0
dst and src 比如: src host 10.9.51.13 and dst host 10.215.20.13
3. Proto(协议)包括 tcp 、udp 、ICMP 和 ah 等
协议的关键字:缺省值是监听所有协议的信息包
ip
arp
tcp
udp
icmp
其他关键字 gateway broadcast less greater
常用表达式:多条件时可以用括号,但是要用转义
2.2 参数
以一个实际例子说明
tcpdump tcp -i bond0 -tttt -s 0 -c 100 and dst port ! 22 and src net 10.10.1.0/24 -w 20190131.tcpdump
解释
(1)tcp: 协议类型,用来过滤数据报的协议类型
(2)-i bond0: 只抓取经过接口bond0的包
(3)-tttt: 使用格式 2019-02-02 10:37:37.120297,便于分析
(4)-s 0: 抓取数据包时默认抓取长度为68字节。加上-s 0 后可以抓到完整的数据包
(5)-c 100: 只抓取100个数据包
(6)dst port ! 22: 不抓取目标端口是22的数据包
(7)src net 10.10.1.0/24: 数据包的源网络地址为10.10.1.0/24
(8)-w 20190131.tcpdump: 保存成tcpdump文件中,方便使用wireshark分析抓包结果。
还有其他常用的参数:
-D:列出所有可用的网络接口
-n:禁用域名解析,让tcpdump直接输出IP地址.
-X:以16进制格式输出数据包的内容,不加该参数,会只输出iptcp/udp头部信息。加上该选项会将整个数据包输出。-vvvv 该参数其实是-v与-vvv的组合。-v会输出稍微详细一点的信息包括校验和ttl之类的;-vvv会尝试解析应用层协议,输出详细信息。二者组合就能完整的详细信息。-A:以ASCII值显示抓到的包,比如和mysql的交互时,可以通过-A查看包的文本内容.
三、解析包
知道如何使用tcpdump命令,我们接下来分析抓到的报文。抓包命令:
tcpdump -i bond0 -n -s 0 port 3312 -c 10 -tttt
第一列是时间 2019-02-02 10:46:13.447563
第二列 IP是网络协议名称。
Flags [P.] 包的状态标志,
S=SYN 发起连接标志。P=PUSH 传送数据标志。F=FIN, 关闭连接标志。ack, 表示确认包。RST=RESET,异常关闭连接。., 表示没有任何标志。
seq 3771602051:3771602105 请求同步的序列号,注意3771602105-3771602051=54 表示数据包的大小和后面的length的大小一致。
ack 1872251807 确认已经同步的序列号+1
win 1857 当前可用的窗口大小,
注释:window size:窗口大小,16bits,窗口字段用来控制对方发送的数据量,单位为字节。TCP 连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。
length 54 tcp 包体的长度。
一图胜千言,tcp结构了解一下
图片来自 https://www.cnblogs.com/the-tops/p/6587498.html
四、案例分析
利用 tcpdump 和 wireshark 分析 MySQL 交互。利用如下命令收集数据包,
# tcpdump -i bond0 -n -s 0 port 3320 -tttt -A -w /tmp/20190202.tcpdump
tcpdump: listening on bond0, link-type EN10MB (Ethernet), capture size 65535 bytes
32 packets captured
36 packets received by filter
0 packets dropped by kernel
设置 MySQL 协议
执行查询的数据流,其实我们可以通过26 ,27两个包的时间差计算 sql 的执行时间,用于性能问题分析或者故障排查。
上面的举例只是利用 tcpdump 简单分析 MySQL 的交互,实际生产中可能更复杂,出现问题的场景不一定稳定复现,要抓很多包来分析定位。所以出现问题的时候抓包和分析包是个体力活。
五 推荐阅读
[1] https://www.tcpdump.org/
[2] https://zhuanlan.zhihu.com/p/33580437
[3]
[4]
GOPS 2019 · 上海站,11月1-2日,近70位AIOps、DevOps、自动化运维专家,全面深入为您介绍国内外名企落地案例,通信、金融、互联网运维明星导师等你来~
点击阅读原文,更多精彩
以上是关于作为一个DBA,你有必要了解一下tcpdump的主要内容,如果未能解决你的问题,请参考以下文章