首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

arp源码 linux内核

ARP(Address Resolution Protocol)即地址解析协议,在Linux内核中,ARP用于将网络层的IP地址解析为数据链路层的MAC地址。

一、基础概念

  1. 工作原理
    • 当主机要向本网络发送数据时,它先查看自己的ARP缓存,看目标IP地址是否有对应的MAC地址记录。如果有,则直接使用该MAC地址发送数据帧;如果没有,就广播一个ARP请求包,询问目标IP地址对应的MAC地址。网络中的其他主机收到这个ARP请求后,如果自己的IP地址与目标IP地址匹配,就回复一个包含自己MAC地址的ARP响应包。
  • 数据结构
    • 在Linux内核中,有专门的结构体来表示ARP相关的数据,例如arp_hdr结构体用于表示ARP协议头,包含了硬件类型(如以太网的值为1)、协议类型(如IPv4的值为0x0800)、硬件地址长度、协议地址长度、操作码(如ARP请求为1,ARP响应为2)、发送方硬件地址、发送方协议地址、目标硬件地址、目标协议地址等字段。

二、优势

  1. 高效的数据传输
    • 使得IP数据报能够在局域网内准确地找到目标主机的MAC地址,从而实现快速的数据传输。如果没有ARP,直接根据IP地址进行数据传输是不可行的,因为网络设备需要基于MAC地址来转发数据帧。
  • 减少网络开销
    • 通过缓存ARP表项,可以避免频繁地发送ARP请求。一旦主机获取到了某个IP地址对应的MAC地址并缓存起来,在一定时间内就可以直接使用,不需要再次进行ARP查询。

三、类型(从不同角度看)

  1. 主动查询类型
    • 如上述正常情况下主机主动发送ARP请求来获取目标IP对应的MAC地址。
  • 被动响应类型
    • 当主机收到其他主机的ARP请求时,如果自己是目标主机则进行响应。

四、应用场景

  1. 局域网通信
    • 在以太网等局域网环境中,几乎所有的IP数据传输都需要先经过ARP协议来确定目标MAC地址。例如,在一个企业内部的办公网络中,当一台计算机要与另一台计算机进行文件共享或者发送邮件时,首先要通过ARP确定对方的MAC地址才能进行数据帧的发送。

五、常见问题及解决

  1. ARP缓存中毒(ARP spoofing)
    • 原因
      • 攻击者发送虚假的ARP响应包,使得被攻击主机将攻击者的MAC地址与合法主机的IP地址进行绑定。例如,在一个共享网络环境中,攻击者可以伪造自己为网关的MAC地址,从而截获被攻击主机发往网关的数据。
    • 解决方法
      • 可以使用静态ARP绑定,在Linux系统中,可以使用arp -s命令将特定的IP地址和MAC地址进行静态绑定。例如:arp -s 192.168.1.1 00:11:22:33:44:55。还可以使用一些网络安全工具来检测和防范ARP欺骗,如arpwatch等。
  • ARP请求风暴(ARP request storm)
    • 原因
      • 当网络中存在环路时,可能会导致大量的ARP请求在网络中不断循环转发。例如,在交换机网络中,如果配置错误形成了环路,ARP请求会在环路中的设备之间不断传播。
    • 解决方法
      • 检查网络拓扑结构,消除环路。在交换机中,可以使用生成树协议(STP)来防止环路的形成。

关于Linux内核中的ARP源码研究:

  1. 查找位置
    • 在Linux内核源码中,与ARP相关的代码主要分布在net/ipv4目录下。例如,arp.c文件包含了ARP协议的主要实现逻辑,包括ARP请求的发送、响应的处理以及ARP缓存的维护等功能。
  • 示例分析(简单)
    • 以下是一个非常简化的查看ARP缓存表的Linux内核代码片段(仅供参考理解原理,实际内核代码复杂得多):
代码语言:txt
复制
#include <linux/netdevice.h>
#include <linux/arp.h>
#include <linux/skbuff.h>

// 简单查看ARP缓存表(仅为示意)
void view_arp_cache(struct net_device *dev) {
    struct arptable *tbl = &arp_tbl;
    struct arp_entry *entry;

    list_for_each_entry(entry, &tbl->entries, hash) {
        if (entry->ipaddr == inet_addr("192.168.1.1")) {
            printk(KERN_INFO "IP: 192.168.1.1, MAC: %pM
", entry->mac);
        }
    }
}

请注意,直接修改内核中的ARP源码是非常危险的操作,除非是在深入研究内核或者定制特殊网络功能的情况下,并且需要经过严格的测试。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux内核配置-ARP系列

这个Linux服务器X将发送ARP请求来获取目标(或网关)的mac地址。在这种情况下,ARP请求包的源IP地址是什么呢?...在Linux服务器中通过Linux的内核数据arp_announce,ARP请求中源地址的选择是完全可配置。...其实arp_announce是为了解决Linux服务器作为路由器时的arp问题,因为路由器一般是动态学习ARP包的(一般动态配置DHCP的话)。...当内网的Linux机器要发送一个到外部的ip包,那么它就会请求路由器的Mac地址,发送一个arp请求,这个arp请求里面包括了自己的ip地址和Mac地址。...而linux默认是使用ip数据包的源ip地址作为arp里面的源ip地址,而不是使用发送设备上面网络接口卡的ip地址 (默认arp_announce的值为0)。

6K20

【Linux 内核】Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址...VSCode 阅读 Linux 内核源码 ---- 参考 【开发环境】安装 Visual Studio Code 开发环境 ( 下载 Visual Studio Code 安装器 | Visual Studio...Code ) 博客 , 安装 VSCode 软件 ; 打开 VSCode , 选择 ” 菜单栏 / 文件 / 打开文件夹 ” 选项 , 选择 Linux 内核源码目录 , 点击 ” 选择文件夹 ”...按钮 , 此时就可以在 VSCode 中阅读 Linux 内核源码 ; 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163620.html原文链接:https

23.6K32
  • 【Linux 内核】Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

    文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址...VSCode 阅读 Linux 内核源码 ---- 参考 【开发环境】安装 Visual Studio Code 开发环境 ( 下载 Visual Studio Code 安装器 | Visual Studio...Code ) 博客 , 安装 VSCode 软件 ; 打开 VSCode , 选择 " 菜单栏 / 文件 / 打开文件夹 " 选项 , 选择 Linux 内核源码目录 , 点击 " 选择文件夹 "...按钮 , 此时就可以在 VSCode 中阅读 Linux 内核源码 ;

    21.4K30

    【Linux 内核】编译 Linux 内核 ② ( 解压内核源码 | 查询当前 Linux 内核版本号 | 进入并查看 linux 内核源码目录 )

    文章目录 一、解压内核源码 二、查询当前 Linux 内核版本号 三、进入并查看 linux 内核源码目录 一、解压内核源码 ---- 将 下载的 Linux 内核源码 linux-5.6.14.tar.gz...拷贝到 Ubuntu 虚拟机中 , 执行 tar xvf linux-5.6.14.tar.gz 命令 , 解压 Linux 内核源码 ; 解压完毕后 , linux-5.6.14 目录中就是解压后的...Linux 内核源码 ; 二、查询当前 Linux 内核版本号 ---- 执行 uname -a 命令 , 查询当前 Ubuntu 系统的 Linux 内核版本号 , 执行过程如下 : root@ubuntu...x86_64 x86_64 x86_64 GNU/Linux root@ubuntu:~/kernel# root@ubuntu:~/kernel# 当前的内核版本号是 4.13.0 ; 三...、进入并查看 linux 内核源码目录 ---- 进入之前解压的 linux-5.6.14 内核源码目录 ; root@ubuntu:~/kernel# ls linux-5.6.14 linux-5.6.14

    87.1K60

    Linux内核学习(一)之Linux内核源码目录

    这里我们拿linux-2.6.35这个版本来学习入门,那么我们该如何获取它的源码呢,这是大家所关心的,在这个官网里面,暂时没有找到以前的版本下载(有知道的朋友可以告诉一声,这里先谢啦),于是乎,在博客里面找到了一个比较全的...2010 virt 这里看的可能不是很直观,我在windows里面也下载了一份: 那么接下来我们就开始来分析了,首先我先从单个文件来分析,下面有些文件我截图了,有些没用截图,详细大家可以下载源码来看哦...: .gitignore: 这个文件主要是说用git工具来管理linux内核版本 .mailmap: 这个文件主要是记录了一些大神维护内核的名字和mail COPYING: 主要是介绍Linux内核版权问题...这个文件就是linux内核特有的内核编译体系需要用到的文件 MAINTAINERS:这个文件主要是介绍了维护人员列表以及如何提交内核更改 Makefile:这个是linux内核的总makefile,整个内核工程用这个...scripts:脚本,这个目录下全部是脚本文件,这些脚本文件不是linux内核工作时使用的,而是用来辅助对linux内核进行配置编译生产的。

    10.9K51

    为什么要阅读Linux内核源码以及如何阅读Linux内核源码

    获取内核源码: https://www.kernel.org/ 阅读linux内核,常用下面两种方法: bochs+linux0.11+书(linux内核完全注释、linux内核完全剖析、linux内核设计的艺术...阅读源码分为纵向阅读和横向阅读。纵向就是跟着内核的执行流程来读,横向就是按照内核的各大功能模块来读。 第一种方法纵向或者横向来读都可以,因为代码量不是很大。...(在Linux下搭建了quem虚拟机,然后用GDB调试内核也可以)总之阅读源码的方法也就上面两种,贵在坚持,但是别闭门N久学内核,没有意义。而且长时间只读代码,不敲代码是不行的。...如果想在简历中写上关于Linux内核的经验,先不要花大量时间看源码,先把《linux内核设计与实现》读了,在找工作中更有用。 Linux5.8.14 ?...在线阅读Linux内核源码网站: https://elixir.bootlin.com/linux/latest/source 初学者建议书籍(实拍): 个人建议内核和驱动一起学。 ?

    4.7K30

    Linux内核源码规范解析

    15 内联弊病 16 函数返回值及命名 17 不要重新发明内核宏 18 编辑器模式行和其他需要罗嗦的事情 19 内联汇编 20 条件编译 从编码风格错误开始 曾经在开发Linux内核驱动的时候,创建了一个补丁文件...总而言之,应该顾全大局,在进行内核开发和驱动开发的时候,严格遵守Linux的编码规范,避免由于编码不规范带来的种种问题,可以参考内核路径下Documentation/CodingStyle文档,以下转自...Linux内核文档,最权威的文档路径,很全很强大,原来在这个网站上已经有中文版了,感谢万分,具体的更新可以跳转到你懂的网址。...「来自 Documentation/process/coding-style.rst 的中文翻译」 Linux 内核代码风格 这是一个简短的文档,描述了 linux 内核的首选代码风格。...10 Kconfig 配置文件 对于遍布源码树的所有 Kconfig* 配置文件来说,它们缩进方式有所不同。

    2.8K20

    Linux内核源码分析方法

    Linux内核源码分析方法 一、内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次。...我也是通过一个项目接触了Linux内核源码的分析,从源码的分析工作中,我受益颇多。除了获取相关的内核知识外,也改变了我对内核代码的过往认知: 1.内核源码的分析并非“高不可攀”。...因此本文更期望于引导更多徘徊在Linux内核大门之外的人进入Linux的世界,去亲自体会内核的神奇与伟大。...一本是《Linux内核的设计与实现》,该书为读者快速精简的介绍了Linux内核的主要功能和实现。...但不会把读者带入Linux内核代码的深渊中,是了解内核架构和入门Linux内核代码的非常好的参考书,同时该书会提高读者对内核代码的兴趣。另一本是《深入理解Linux内核》,该书的经典我不必多说。

    5.4K70

    Linux内核及源码简介

    Linux内核及源码学习使用陈莉君老师的书《深入分析Linux内核源代码》,内核源码版本为2.4.16。 1....Linux 内核在整个操作系统中的位置 Linux 的内核不是孤立的,必须把它放在整个系统中去研究,如图 1.1 所示,显示了 Linux内核在整个操作系统的位置。...Linux 内核的抽象结构 Linux 内核由 5 个主要的子系统组成,如图 1.2 所示。 image.png (1)进程调度(SCHED)控制着进程对 CPU 的访问。...Linux 内核源代码的结构 Linux 内核源代码位于/usr/src/linux 目录下,其结构分布如图 1.3 所示,每一个目录或子目录可以看作一个模块,其目录之间的连线表示“子目录或子模块”的关系...在 Linux 内核中包含了 drivers、fs、arch 及 net 模块,这就使得 Linux 内核既不是一个层次式结构,也不是一个微内核结构,而是一个“整体式”结构。

    2.3K31

    Linux 源码介绍&内核升级

    # Linux 源码介绍&内核升级 # 为什么要阅读Linux内核s 爱好,就是喜欢linux(黑客精神) 想深入理解linux底层运行机制,对操作系统有深入理解 阅读Linux 内核,你会对整个计算机体系有一个更深刻的认识...# Linux0.01内核源码 # 基本介绍 Linux 的内核源代码可以从网上下载,解压缩后文件一般也都位于linux目录下。...建议可以从linux0.01 入手。 # Linux 内核源码目录&阅读 提示阅读源码技巧 linux0.01 的阅读需要懂c语言 阅读源码前,应知道Linux 内核源码的整体分布情况。...Linux内核源码的各个目录大致与此相对应. 在阅读方法或顺序上,有纵向与横向之分。所谓纵向就是顺着程序的执行顺序逐步进行;所谓横向,就是按模块进行。它们经常结合在一起进行。...实际上这是一个反复的过程,不可能读一遍就理解 linux内核源码阅读&目录介绍&main.c说明 # Linux内核最新版和内核升级 # 内核地址 (opens new window) 查看 #

    2.5K30

    使用 Source Insight 阅读 Linux 内核源码

    在后面开发驱动程序时,驱动程序中用到的函数都是来自内核,所以可以先在 Windows 下创建内核的Source Insight 工程。 如果你不想学习驱动开发,那么可以不创建内核的工程。...www.sourceinsight.com/trial/ 用户使用教程https://www.sourceinsight.com/doc/v4/userguide/index.html 7.4.2 在 Windows 上解压内核源码...前面《7.2 使用 repo 下载内核及工具链等》里下载到内核后,在 Ubuntu 下压缩了内核,把压缩文件通过 FileZilla 传回 Windows,并解压。...这是因为 Linux 下的文件区分大小写,a.c 和 A.c 以不同的文件,但是 Windows 下不区分大小写,这 2 个文件是同一个。这些错误不会影响我们阅读源码。...7.4.3 建立工程示例 本节新建一个 linux kernel 的 source Insight 工程,你也可以为其他 APP 建立工程,方法是一样的。

    5.1K20

    linux内核进程创建fork源码解析

    平时写过多进程多线程程序,比如使用linux的系统调用fork创建子进程和glibc中的nptl包里的pthread_create创建线程,甚至在java里使用Thread类创建线程等,虽然使用问题不大...这次在自己写操作系统的时候,看了一遍linux内核的进程创建过程。算是有了比较深入的理解。     进程概念:进程是对正在运行程序的一个抽象。...在linux下线程属于轻量级进程,拥有完全一样的数据结构,是系统调度的最小单位。并且线程和cpu是1:1模型,也就是说当前cpu在一个时间片周期内只运行一个线程,这样可以充分利用硬件。    ...再看其中三个比较重要的结构: struct thread_info 字面意思是线程信息,其实主要是内核栈的信息,每个进程都有自己的内核栈和用户栈,还可以设置中断栈,其中和进程上下文切换相关的主要是内核栈...下面看重要的函数dup_mmap复制vma和页表,先介绍下linux的页表结构,linux支持四级页表,但是有的cpu mmu只支持两级页表或者三级页表,比如x86_32如果不开启PAE则只支持2级页表

    8.8K22
    领券