您现在的位置是:首页 >学无止境 >gmac和tcpdump的抓包位置,tcpdump的抓包原理网站首页学无止境
gmac和tcpdump的抓包位置,tcpdump的抓包原理
用户态 tcpdump 如何实现抓到内核网络包的?_tcpdump抓包属于用户态还是内核态-CSDN博客
tcpdump所在层次
套接字 | udp/tcp/arp | |
协议栈 | tcpdump所在层次,抓的是协议层的包 | |
gmac | 信令层 | |
光网口 | 物理层 |
tcpdump是Linux里的字符界面的数据抓包分析软件。tcpdump是一个用于截取网络分组,并输出分组内容的工具。
tcpdump:其中tcp:传输控制协议,位于传输层transmission control protocol。dump:导出。
-i | interface指定抓哪个接口的数据包。 |
-vv | 显示更加详细的信息。 |
-e | 显示mac地址。 |
-w | write 写入保存到文件中。导入的文件可以使用wireshark打开。 |
-r | read 读取文件中的数据。 |
-c | 在收到指定包数目之后,tcpdump就会停止。 |
抓固定端口的包 port xxx
抓固定目标ip的包 dst host 192.254.2.16
Tcpdump的命令格式
tcpdump采用命令行方式,它的命令格式为:
tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]
[ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]
[ -T 类型 ] [ -w 文件名 ] [表达式 ]
1. tcpdump的选项介绍
-a 将网络地址和广播地址转变成名字;
-d 将匹配信息包的代码以人们能够理解的汇编格式给出;
-dd 将匹配信息包的代码以c语言程序段的格式给出;
-ddd 将匹配信息包的代码以十进制的形式给出;
-e 在输出行打印出数据链路层的头部信息;
-f 将外部的Internet地址以数字的形式打印出来;
-l 使标准输出变为缓冲行形式;
-n 不把网络地址转换成名字;
-t 在输出的每一行不打印时间戳;
-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
-vv 输出详细的报文信息;
-c 在收到指定的包的数目后,tcpdump就会停止;
-F 从指定的文件中读取表达式,忽略其它的表达式;
-i 指定监听的网络接口;
-r 从指定的文件中读取包(这些包一般通过-w选项产生);
-w 直接将包写入文件中,并不分析和打印出来;
-T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程 调用)和snmp(简单 网络管理协议;)
1. tcpdump抓包架构
2. 从内核层面看tcpdump抓包流程
众所周知,应用在接收报文的时候,硬件的硬中断首先触发内核的 软中断 ,通过 内核驱动程序 进入 网络设备层 进行数据包的处理,然后数据包进入 协议栈 的网络层和传输层,最后被用户进程接收。
而应用在发送报文时,首先经过内核的 协议层 ,由邻居子系统实现L3层ip地址转化为L2层mac地址,然后进入 网络设备层 ,数据包处理完成后,经 驱动程序 流转,最后由 硬件 将报文发出。
tcpdump为了能抓取数据包,首先需要创建socket套接字,用于在应用系统接收和发送报文时获取抓取的数据包,然后将过滤条件也就是对应的BPF程序注入到内核网络设备层,获取过滤后的数据包后再进行格式化处理。
说明
在生产中常见的,如果单个cpu核心被持续打满,会影响内核将网络包从队列中取出,并存放到协议栈,从而导致机器响应包延迟
在硬件接收到网络包,触发硬中断后,将相关网络包存放到内部队列,队列满后出发软中断通知内核接受相关的流量包,内核接收流量包后,对应的队列清空以继续接收后续的流量包,这个过程占用的cpu很少。
内核接收到软中断信号后,会调用cpu资源以接收相关的流量包,放到协议栈并进行后续的处理。如果软中断很频繁,内核就需要频繁的调用cpu响应,会很需要消耗cpu资源。特别是如果内核响应软中断的cpu绑定到固定某个cpu核时,表现更为明显
原文链接:https://blog.csdn.net/weixin_43845924/article/details/138294080
二、tcpdump 表达式
主要有 3 种类型的表达式:
- Type(类型)选项包括 host 、net和 port
- Direction(方向)选项包括 src 和 dst 以及它们的组合
- Proto(协议)包括 tcp 、udp 、ICMP 和 ah 等
tcpdump抓包原理
Linux网络抓包工具tcpdump是如何实现抓包的,在哪个位置抓包的?_tcpdump抓包位置-CSDN博客tcpdump获取的数据包实际上是在 网卡和内核之间 获取的,它通过libpcap库利用操作系统提供的网络抓包机制来实现。