Linux网络抓包工具tcpdump是如何实现抓包的,在哪个位置抓包的?

news2024/12/27 11:53:23

Linux网络抓包工具tcpdump是如何实现抓包的,在哪个位置抓包的?

  • 1. tcpdump抓包架构
  • 2. BPF介绍
  • 3. 从内核层面看tcpdump抓包流程
    • 3.1. 创建socket套接字
    • 3.2. 挂载BPF程序
  • 4. 网络收包抓取
  • 5. 网络发包抓取
  • 6. 疑问和思考
    • 6.1 tcpdump抓包跟网卡、内核之间的顺序是怎么样的?
    • 6.2 tcpdump抓包分析到服务端响应ping延迟,怎么判断是是客户端到服务端的传输过程慢还是服务端的内核处理慢?
  • 7. 参考文档

随着G行架构从集中式体系向分布式式体系转型,行内系统服务快速增多,不同的服务短期内需要在集中式体系、分布式体系之间互相调用,调用链复杂,网络通讯相关问题时有发生。系统管理员在排查网络问题时就用到一款网络抓包工具tcpdump,该工具可以将网络中传送的数据包完全截获下来进行分析,能有效的排查复杂环境的网络问题。本文将从原理的角度分析tcpdump在Linux系统的实现。

主要是希望能够分析实现原理,以协助判断tcpdump抓的是网卡的包,还是经过内核处理后的包?对于分析服务器处理网络包过程有很大帮助。


1. tcpdump抓包架构

tcpdump由C语言开发,主要功能通过libpcap库实现,而libpcap是linux平台下的一个网络数据包捕获功能包, 通过内核BPF技术实现数据过滤功能。tcpdump使用BPF虚拟机的指令集定义过滤器表达式,然后传递给内核,并由解释器执行,这使得包过滤可以在内核中进行,避免了向用户态进程复制全部数据包,从而提升数据包的过滤性能。tcpdump将包过滤指令注入到内核,返回按条件过滤的数据包,提供多种输出功能将抓取的报文格式化处理能力。

在这里插入图片描述

tcpdump的包过滤指令由BPF代码实现,通过对libpcap库的调用可以把一个输入输出的逻辑表达式变为BPF代码,实现在用户输入的命令行和BPF代码之间的转换。tcpdump 程序支持使用 -d参数来 dump 出过滤规则转化后的BPF指令字节码。

2. BPF介绍

BPF(Berkeley Packet Filter ),中文翻译为伯克利包过滤器,是类 Unix 系统上数据链路层的一种原始接口,提供一种网络数据包过滤方法。随着技术的发展,人们在BPF的基础上又提出了eBPF(extended BPF)。经过重新设计,eBPF 演进为一个通用执行引擎,在不更改内核代码的前提下,实时获取和修改操作系统的行为,可基于此开发性能分析工具、软件定义网络等诸多场景,而原来的BPF则称为cBPF(classic BPF)。

现在,Linux 内核只运行eBPF,内核会将加载的cBPF字节码透明地转换成 eBPF再执行。eBPF新的设计针对现代硬件进行了优化,eBPF 生成的指令集比旧的 BPF 解释器生成的机器码执行得更快。扩展版本也增加了虚拟机中的寄存器数量,将原有的2个32位寄存器增加到10个64位寄存器。

eBPF 程序需要挂载到某个内核路径(挂载点)才能被执行,常见的挂载点有:系统调用,内核函数进入/退出,内核跟踪点,网络数据包等等,根据挂载点功能的不同,可以分为以下四类,tcpdump挂载点即为第二类:

  1. 性能跟踪(kprobes/uprobes/tracepoints)
  2. 网络(socket/xdp)
  3. 容器(cgroup)
  4. 安全(seccomp)

在这里插入图片描述
cpdump使用的包过滤指令即为cBPF,内核将提交来的cBPF字节码转化成eBPF代码加载进BPF虚拟机中,使用系统调用函数setsockopt()将BPF 程序挂载在 socket套接字上,进而过滤数据包,而BPF代码是则由内核调用BPF运行函数__bpf_prog_run()来执行。

3. 从内核层面看tcpdump抓包流程

众所周知,应用在接收报文的时候,硬件的硬中断首先触发内核的 软中断 ,通过 内核驱动程序 进入 网络设备层 进行数据包的处理,然后数据包进入 协议栈 的网络层和传输层,最后被用户进程接收。

而应用在发送报文时,首先经过内核的 协议层 ,由邻居子系统实现L3层ip地址转化为L2层mac地址,然后进入 网络设备层 ,数据包处理完成后,经 驱动程序 流转,最后由 硬件 将报文发出。

tcpdump为了能抓取数据包,首先需要创建socket套接字,用于在应用系统接收和发送报文时获取抓取的数据包,然后将过滤条件也就是对应的BPF程序注入到内核网络设备层,获取过滤后的数据包后再进行格式化处理。


在这里插入图片描述

说明
在生产中常见的,如果单个cpu核心被持续打满,会影响内核将网络包从队列中取出,并存放到协议栈,从而导致机器响应包延迟

在硬件接收到网络包,触发硬中断后,将相关网络包存放到内部队列,队列满后出发软中断通知内核接受相关的流量包,内核接收流量包后,对应的队列清空以继续接收后续的流量包,这个过程占用的cpu很少。

内核接收到软中断信号后,会调用cpu资源以接收相关的流量包,放到协议栈并进行后续的处理。如果软中断很频繁,内核就需要频繁的调用cpu响应,会很需要消耗cpu资源。特别是如果内核响应软中断的cpu绑定到固定某个cpu核时,表现更为明显

3.1. 创建socket套接字

tcpdump首先通过libpcap库,调用socket()函数创建PF_PACKET套接字,该套接字提供L2层抓包分析能力,所有的底层L2包都会给到PF_PACKET 模块的回调处理函数即下文的网络收包和发包都用到的内核函数packet_rcv()函数,通过该函数将数据包写入到缓存队列,libpcap库使用系统调用函数recvfrom ()复制一份数据给tcpdump。

在这里插入图片描述

3.2. 挂载BPF程序

tcpdump使用libpcap库的pcap_compile()函数将用户制定的过滤策略转换为BPF代码,然后使用pcap_setfilter()函数调用install_bpf_program()函数装载BPF程序,install_bpf_program()函数调用系统调用函数setsockopt(),设置SO_ATTACH_FILTER参数将BPF程序下发给内核底层,将规则注入到内核,设置过滤器,从而让规则生效。

在这里插入图片描述

4. 网络收包抓取

应用接收报文时,在网络设备层,驱动程序首先调用内核函数netif_receive_skb(),通过deliver_skb()调用回调函数packet_rcv(),并使用BPF运行函数__bpf_prog_run(),来执行BPF程序过滤数据包,然后将数据包存入队列,最终复制数据包给tcpdump。而应用接收数据包则根据包的协议,选择udp或者tcp将报文送到用户进程。

在这里插入图片描述

5. 网络发包抓取

应用在发送报文时,首先通过邻居子系统进入网络设备层,然后调用内核函数dev_hard_start_xmit(),该函数同样使用网络收包流程中使用的deliver_skb()函数调用回调函数packet_rcv(),并通过调用BPF运行函数__bpf_prog_run(),来执行BPF程序过滤数据包,然后将数据包存入队列,最终复制数据包给tcpdump。而应用发送数据包则通过驱动程序发送出去。

在这里插入图片描述

6. 疑问和思考

6.1 tcpdump抓包跟网卡、内核之间的顺序是怎么样的?

TCPDump实际上是通过libpcap库来实现的,它可以在网卡和内核之间获取数据包。
当你运行tcpdump时,它会使用libpcap库来打开一个网络接口,这样就可以捕获该接口上的数据包。libpcap库通过操作系统提供的类似于BPF(Berkeley Packet Filter)的机制来实现这一点。这种机制允许libpcap指定一组过滤规则,以便仅捕获符合这些规则的数据包。一旦数据包被捕获,libpcap会将其传递给TCPDump进行进一步处理,最终以用户友好的方式呈现给用户。
所以,tcpdump获取的数据包实际上是在 网卡和内核之间 获取的,它通过libpcap库利用操作系统提供的网络抓包机制来实现。

6.2 tcpdump抓包分析到服务端响应ping延迟,怎么判断是是客户端到服务端的传输过程慢还是服务端的内核处理慢?

通过6.1的问题知道了tcpdump是在网卡和内核之间的,通过tcpudump抓包

  • 收包还没有经过内核处理
  • 发包需要内核协议栈处理后,经过tcpdump到达网卡

因此只需要在服务端和客户端抓包

  1. 对比相同一个包,在客户端发出后和服务端接收到的时间查,这个是客户端和服务端网卡之间的流量传输过程
  2. 在对比,服务端抓到的包中,收发2个包之间的时间差,这个时间差就是服务端收到包后的响应时间差
  3. 对比这两个时间差,就能知道时间主要消耗在哪个层面

如下图可以获知,客户端到服务端之间传输耗时1s,但是服务端处理很快
在这里插入图片描述

如下图可以获知,服务端接收到网络包后处理时间耗时1s,由于只是做简单的ping命令,因此主要的耗时消耗在内核上,还需要配合排查处理内核中断的cpu使用率是否很高,才能进一步分析问题原因。

在这里插入图片描述

7. 参考文档

暂无

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1634146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ffmpeg音视频裁剪

音视频裁剪,通常会依据时间轴为基准,从某个起始点到终止点的音视频截取出来,当然音视频文件中存在多路流,所对每一组流进行裁剪 基础概念: 编码帧的分类: I帧(Intra coded frames): 关键帧,…

linux(ubuntu18.04.2) Qt编译 MySQL(8.0以上版本)链接库 Qt版本 5.12.12及以上 包含Mysql动态库缺失问题

整理这篇文档的意义在于:自己走了很多弯路,淋过雨所以想为别人撑伞,也方便回顾,仅供参考 一、搭建开发环境: 虚拟机(ubuntu-20.04.6-desktop-amd64):Mysql数据库 8.0.36Workbench …

pytorch库 01 安装Anaconda、Jupyter,Anaconda虚拟环境连接pycharm

文章目录 一、安装Anaconda1、卸载Anaconda(可选)2、下载并安装Anaconda3、配置环境变量4、桌面快捷方式 二、安装 PyTorch(GPU 版)库1、创建虚拟环境,并安装一些常用包2、GPU 基础3、检查驱动4、安装CUDA(…

数字化转型新篇章:企业通往智能化的新范式

早在十多年前,一些具有前瞻视野的企业以实现“数字化”为目标启动转型实践。但时至今日,可以说尚无几家企业能够在真正意义上实现“数字化”。 在实现“数字化”的征途上,人们发现,努力愈进,仿佛终点愈远。究其原因&a…

Springboot+Vue项目-基于Java+MySQL的校园外卖服务系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

企业营销战略新思考:营销5.0与开源AI智能名片S2B2C商城小程序引领私域流量经营新纪元

随着互联网的深入发展,企业营销战略已经不再是单一、静态的规划,而是一个持续进化、与市场紧密相连的动态过程。在这个过程中,营销5.0和开源AI智能名片S2B2C商城小程序的结合,为企业营销战略注入了新的活力,也为私域流…

EasyRecovery数据恢复软件2025永久免费电脑版下载

EasyRecovery数据恢复软件是一款业界知名的数据恢复工具,它凭借强大的恢复能力和广泛的数据兼容性,帮助用户从各种存储设备中恢复丢失或删除的数据。以下是关于EasyRecovery数据恢复软件的详细介绍。 EasyRecovery绿色破解下载网盘链接: https://pan.ba…

《QT实用小工具·四十七》可交互的创意动态按钮

1、概述 源码放在文章末尾 该项目实现了可交互的创意动态按钮,包含如下功能: 所有颜色自定义 鼠标悬浮渐变 两种点击效果:鼠标点击渐变 / 水波纹动画(可多层波纹叠加) 额外鼠标移入/移出/按下/弹起的实时/延迟共8种事…

2024最新版JavaScript逆向爬虫教程-------基础篇之常用的编码与加密介绍(python和js实现)

目录 一、编码与加密原理1.1 ASCII 编码1.2 详解 Base641.2.1 Base64 的编码过程和计算方法1.2.2 基于编码的反爬虫设计1.2.3 Python自带base64模块实现base64编码解码类封装 1.3 MD5消息摘要算法1.3.1 MD5 介绍1.3.2 Python实现md5以及其他常用消息摘要算法封装 1.4 对称加密与…

在kuboard中添加k8s集群

1.登录kuboard后,点击添加集群面板 系统会跳转到k8s集群添加页面,按照页面提示输入自身的集群信息即可,此处没有什么难点。 添加成功后,点击集群面板,然后点击集群概要信息,就可以查看集群节点信息。 集群节…

mac配置maven

在 macOS 上配置 Maven 也相对简单。以下是一种常用的方法: 1. 安装maven **下载 Maven:**首先,你需要从 Maven 官网(https://maven.apache.org/download.cgi)下载最新版本的 Maven。你可以选择二进制压缩包&#xf…

ctfshow web78 获取flag(用老版的火狐浏览器)

题&#xff1a; 第一种&#xff1a;利用input伪协议 ,获取到flag ?filephp://input POST data <?php system(tac ls) ?> 第二种&#xff1a;利用flter协议,获取到flag https://21d9e58a-c0fd-47ea-a9c4-d875100f2fdb.challenge.ctf.show/?filephp://filter/readcon…

Java网址url工具类

功能描述 无需引入三方依赖文本匹配网址&#xff08;支持多个&#xff09;网址解析&#xff08;包括协议、主机、路径、参数等&#xff09; package com.qiangesoft.image.utils;import org.springframework.util.Assert; import org.springframework.util.CollectionUtils;i…

使用 Wireshark 实现 ARP 嗅探监听网络

前言 Wireshark是一个开源的网络协议分析工具&#xff0c;用于捕获和分析网络数据包。它可以在多个操作系统上运行&#xff0c;并提供了强大的功能和用户友好的界面。 通过Wireshark&#xff0c;用户可以捕获网络流量&#xff0c;并对其进行深入的分析。它支持多种协议的解析…

Unity 合并子物体获得简化Mesh

合并子物体获得简化Mesh &#x1f959;环境&#x1f96a;Demo &#x1f959;环境 PackageManager安装Editor Coroutines 导入插件&#x1f448; &#x1f96a;Demo 生成参数微调&#xff1a;Assets/EasyColliderEditor/Scripts/VHACDSettings/VHACDSettings.asset

大数据开发工作中的数仓设计(Hadoop,hive ,mysql )

1.HUE工具介绍使用 HUE是CDH提供一个hive和hdfs的操作工具&#xff0c;在hue中编写了hiveSQl也可以操作hdfs的文件 http://主机名字:端口号 hdfs的web访问端口 http://主机名字:端口号 hdfs的程序访问端口 进入后确保hdfs hive yarn 开启 在点击hue开启 在这里面也可以进行h…

android studio拍照功能问题解决

1.点击拍照功能直接闪退 2.拍照后不能选择确认键&#xff0c;无法保存 上述是在android studio做项目中经常会使用到模拟器或真机的拍照功能时主要遇到的两个问题。 解决方法&#xff1a; 1.直接闪退问题&#xff1a; if(Build.VERSION.SDK_INT>Build.VERSION_CODES.N)…

【HTML植物大战僵尸源码】

HTML植物大战僵尸源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 index.html <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <meta name"KeyWords" content"lonelys…

Vue3 + TS 项目实战 - 后台管理系统 - 按钮权限

前期回顾 网站的打赏 —— 新一代的思路-CSDN博客https://blog.csdn.net/m0_57904695/article/details/136704914?spm1001.2014.3001.5501 目录 &#x1f6a9; XX银行_系统管理_按钮权限控制_前端_提测单 项目信息 提测版本信息 功能列表 测试范围 测试环境 ✅ 步…

05-MessageConverter和ControllerAdvice

准备对象 Data static class User {private String name;private int age;JsonCreator // 默认jackson会使用无参构造器反序列化 这里强制使用当前带参构造器public User(JsonProperty("name") String name, JsonProperty("age") int age) {this.name …