计算机网络问题排查(一) — tcpdump 原理与基础参数
1. 引言
如果你是一个初学者,了解了那么多网络传输协议以后,一定非常好奇,如何才能真实的看到网络传输过程中发送了什么样的数据呢?
抑或你是一个有一定经验的开发者,你一定会非常关心服务究竟耗时在哪里,网络传输过程中实际做了什么,怎么去有针对性的优化等等。
那么,我们怎么才能知道网络传输的细节,让一切尽在掌握呢?你一定马上想到了抓包分析,unix 环境下就提供了一个十分好用的抓包工具 — tcpdump,本文我们就来详细介绍一下 tcpdump 的实现原理与使用,让你面对复杂的网络环境做到成竹在胸,无往不利!
2. tcpdump 抓包的原理
linux 内核是如何处理网络请求的呢?当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,例如以太网协议、x25 协议处理模块来尝试进行报文的解析处理,如果哪一个协议可以识别出请求报文,那么内核就会交由他来处理。
linux 内核提供了一个专门为抓包程序使用的协议族:PF_PACKET,一旦一个程序注册并监听了 PF_PACKET 类型的 socket,他就可以接收到所有链路层收发的数据帧,这样就实现了抓包的效果。
libpcap 包中包含了上述抓包过程实现的 api,tcpdump 就是在 libpcap 的基础上实现的,理论上,我们自己也可以利用这些 API,实现一套自己的抓包工具。
3. tcpdump 的参数
tcpdump 的参数可以分三大类:
-
行为控制参数 — 控制 tcpdump 的各种行为
-
显示控制参数 — 控制数据要怎样显示
-
过滤命令参数 — 过滤器筛选数据指令
本文我们就来详细介绍前两大类的控制参数,下一篇文章详细来介绍如何使用过滤指令,以及展示实际场景下的使用实例,敬请期待。
4. 行为控制参数
4.1 数据输出
-
-l 行缓冲方式
默认情况下,tcpdump 是直接输出到控制台界面的,添加 -l
参数,可以将 tcpdump 的输出变为“行缓冲”方式,这样可以确保 tcpdump 遇到的内容一旦是换行符即将缓冲的内容输出到标准输出,以便于后续利用管道或重定向的方式做后续处理
-
-w & -r 文件转储
除了上述通过重定向的方式存储 tcpdump 的输出到文件外,更加推荐的方式是通过 -w
参数将原始数据包写入到磁盘的 pcap 文件中:
tcpdump -w rawfile.pcap
这样产生的 rawfile.pcap 是包含了原始包信息的数据文件,可以直接用 wireshark 等工具载入并处理,但我们没有办法直接阅读文件内容,通过 -r
参数可以将原始包文件转换成我们能够查看的输出文件:
tcpdump -r warfile.pcap > tcpdump.log
4.2 输出长度限制
-
-c 输出报文数限制
默认情况下,tcpdump 会无限输出,直到你中止进程为止。
通过 -c
参数,可以让 tcpdump 在指定报文数之后自动终止,例如收集到 100 个报文之后终止:
tcpdump -c 100
-
-s 指定每个报文最大字节数
除了指定报文数,也可以限制每个报文的最长字节数,例如只截取每个报文的前 200 字节:
tcpdump -s 200
4.3 监听网卡限制
-
-i 指定监听的网卡
默认情况下,tcpdump 会监听最低编号的网络接口,你可以通过 ifconfig 命令查看你的机器上有哪几个网卡,并且用 -i 指定监听对应的网卡:
tcpdump -i lo
-
-p 开启非混杂模式
默认情况下,tcpdump 会抓取所有报文,通过 -p
选项指定只截取来自或发往主机,多播数据,以及广播数据。
5. 显示控制参数
显示控制参数标识了让 tcpdump 如何去显示结果
5.1 域名解析
tcpdump 提供了选项来控制究竟要在输出结果中显示域名还是 ip,主要有以下四个:
-
-a — 强制将网络地址显示为名称(默认)
-
-n — 阻止将地址显示为名字
-
-N — 阻止将域名转换
-
-f — 阻止远端名称解析
下面就是不同选项下 tcpdump 的显示效果:
-
tcpdump -c 1 host 192.31.7.130
tcpdump: listening on xl0
14:16:35.897342 sloan.lander.edu > cio-sys.cisco.com: icmp: echo request
-
tcpdump -c 1 -a host 192.31.7.130
tcpdump: listening on xl0
14:16:14.567917 sloan.lander.edu > cio-sys.cisco.com: icmp: echo request
-
tcpdump -c 1 -n host 192.31.7.130
tcpdump: listening on xl0
14:17:09.737597 205.153.63.30 > 192.31.7.130: icmp: echo request
-
tcpdump -c 1 -N host 192.31.7.130
tcpdump: listening on xl0
14:17:28.891045 sloan > cio-sys: icmp: echo request
-
tcpdump -c 1 -f host 192.31.7.130
tcpdump: listening on xl0
14:17:49.274907 sloan.lander.edu > 192.31.7.130: icmp: echo request
5.2 时间打印
默认情况下,tcpdump 以标准时间字符串来打印报文截获的时间,你也可以通过选项来改变他:
-
默认
12:36:54.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
-
-t 不显示时间信息
sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
-
-tt 显示时间戳
934303014.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
5.3 TTL 信息打印
-
默认
12:36:54.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
-
-q 静默模式,打印更少信息
12:36:54.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: tcp 0 (DF)
-
-v & -vv 打印 TTL 信息
12:36:54.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF) (ttl 128, id 45836)
5.4 链路层头信息
添加 -e
选项,可以显示链路层头信息,包括源 mac 和目的 mac,以及网络层的协议:
12:36:54.772066 0:10:5a:a1:e9:8 0:10:5a:e3:37:c ip 60:sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
5.5 显示格式
tcpdump 支持以 16 进制格式或 Ascii 格式显示报文:
-
默认不显示报文内容
12:36:54.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
-
-A 以 Ascii 格式打印报文
12:36:54.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
E..(.u..:…I.d..”…X…..,P.9………..
-
-x 以 16 进制格式打印报文
12:36:54.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
0x0000: 4510 00e4 6861 0000 4006 3ab1 0a0d acb10x0010: 0a37 15fd 0016 1978 d582 44e1 c270 6b1d0x0020: 5018 002e d7c8 0000 28a4 918b f601 c2130x0030: 573f f46e 830f 8604 d164 7d0b 4cc4 31480x0040: 35e5 bba1 724f d80d a18c 4b93 7c6c eb4f0x0050: 5a22 dc77 2647 f5ed 25c8 8ac6 9ff2 40a3
-
-X 以 16 进制 + Ascii 格式打印报文
12:36:54.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
0x0000: 4510 00e4 6852 0000 4006 3ac0 0a0d acb1 E…hR..@.:….. 0x0010: 0a37 15fd 0016 1978 d582 3cc5 c270 6a85 .7…..x..<..pj. 0x0020: 5018 002e d7c8 0000 524d d5c4 9da5 e3b7 P…….RM…… 0x0030: 9d26 2467 0cde 1ed8 7c37 95b7 595b 0497 .&$g….|7..Y[.. 0x0040: 0119 4001 3947 be1e f0e1 1cdd b913 6c44 ..@.9G……..lD
参考资料
https://www.tecmint.com/12-tcpdump-commands-a-network-sniffer-tool/
https://www.bookstack.cn/read/network-basic/17.md
微信公众号
欢迎关注微信公众号,以技术为主,涉及历史、人文等多领域的学习与感悟,每周都有精彩推文,只有全部原创,只有干货没有鸡汤
《计算机网络问题排查(一) — tcpdump 原理与基础参数》来自互联网,仅为收藏学习,如侵权请联系删除。本文URL:http://www.bookhoes.com/145.html