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

2021-05-29 17:38:20   最后更新: 2021-05-29 17:38:20   访问数量:321




 

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

 

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

 

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

 

 

 

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

 

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

 

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

 

 

tcpdump 的参数可以分三大类:

 

  1. 行为控制参数 -- 控制 tcpdump 的各种行为
  2. 显示控制参数 -- 控制数据要怎样显示
  3. 过滤命令参数 -- 过滤器筛选数据指令

 

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

 

 

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 选项指定只截取来自或发往主机,多播数据,以及广播数据。

 

 

显示控制参数标识了让 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 acb1

0x0010:  0a37 15fd 0016 1978 d582 44e1 c270 6b1d

0x0020:  5018 002e d7c8 0000 28a4 918b f601 c213

0x0030:  573f f46e 830f 8604 d164 7d0b 4cc4 3148

0x0040:  35e5 bba1 724f d80d a18c 4b93 7c6c eb4f

0x0050:  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

 

 

TCP/IP 详解






network      计算机网络      技术贴      tcpdump     


京ICP备2021035038号