计算机网络问题排查(一) — tcpdump 原理与基础参数

1. 引言

如果你是一个初学者,了解了那么多网络传输协议以后,一定非常好奇,如何才能真实的看到网络传输过程中发送了什么样的数据呢?

抑或你是一个有一定经验的开发者,你一定会非常关心服务究竟耗时在哪里,网络传输过程中实际做了什么,怎么去有针对性的优化等等。

那么,我们怎么才能知道网络传输的细节,让一切尽在掌握呢?你一定马上想到了抓包分析,unix 环境下就提供了一个十分好用的抓包工具 — tcpdump,本文我们就来详细介绍一下 tcpdump 的实现原理与使用,让你面对复杂的网络环境做到成竹在胸,无往不利!

2. tcpdump 抓包的原理

linux 内核是如何处理网络请求的呢?当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,例如以太网协议、x25 协议处理模块来尝试进行报文的解析处理,如果哪一个协议可以识别出请求报文,那么内核就会交由他来处理。

linux 内核提供了一个专门为抓包程序使用的协议族:PF_PACKET,一旦一个程序注册并监听了 PF_PACKET 类型的 socket,他就可以接收到所有链路层收发的数据帧,这样就实现了抓包的效果。

libpcap 包中包含了上述抓包过程实现的 api,tcpdump 就是在 libpcap 的基础上实现的,理论上,我们自己也可以利用这些 API,实现一套自己的抓包工具。

3. tcpdump 的参数

tcpdump 的参数可以分三大类:

  1. 行为控制参数 — 控制 tcpdump 的各种行为

  2. 显示控制参数 — 控制数据要怎样显示

  3. 过滤命令参数 — 过滤器筛选数据指令

本文我们就来详细介绍前两大类的控制参数,下一篇文章详细来介绍如何使用过滤指令,以及展示实际场景下的使用实例,敬请期待。

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