内核版本:2.6.34
杂谈一:重复地址检测
  Linux协议栈中处理重复地址检测报文的是arp_process()中的一段代码,RFC2131是DHCP的草案,相应的sip==0是DHCP服务器用来检测它所分发的地址是否重复的。

[cpp] view plaincopy
  1. /* Special case: IPv4 duplicate address detection packet (RFC2131) */
  2. if (sip == 0) {
  3. if (arp->ar_op == htons(ARPOP_REQUEST) &&
  4. inet_addr_type(net, tip) == RTN_LOCAL &&
  5. !arp_ignore(in_dev, sip, tip))
  6. arp_send(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip, sha,
  7. dev->dev_addr, sha);
  8. goto out;
  9. }

  而根据RFC826中描述,正常的重复地址检测报文特征是sip==tip
  The gratuitous ARP packet is an ARP request with both sender's and the target's IP address fields containing the configured IP address.
  A gratuitous ARP packet on an Ethernet is defined as
   48.bit Destination Address     = 0xffffffffffff (broadcast)
   48.bit Source Address           = Hardware adderss of interface
   16.bit Frame type              = 0x806 (ARP)
   ----------------------
   16.bit Hardware type           = 0x1 (Ethernet)
   16.bit Protocol Type           = 0x800 (IP)
    8.bit Hardware Address size   = 6
    8.bit Protocol Address size   = 4
   16.bit Opcode                 = 1 (Request)
   48.bit Sender Ethernet Address = Hardware address of interface
   32.bit Sender IP Address       = Configured IP address
   48.bit Target Ethernet Address = Don't care
   32.bit Target IP Address       = Configured IP Address

问题:
  linux协议栈除了对RFC2131规定的DHCP服务器使用的地址检测格式进行响应,对RFC826中规定的gratuitous arp报文不作处理,该报文会被协议栈直接丢弃掉。
  实际情况是,在启动linux网络或配置新的IP时,Linux Host不会进行重复地址检测,并且,对于其它主机发来的重复地址检测报文也不会处理。
  测试环境如下:

  Linux Host的IP为192.168.1.1,然后配置Windows Host的IP为192.168.1.1,Windows Host会发送gratuitous arp,但Linux Host并不会回应,默许了两个重复地址的存在。[谁能帮忙解释下,感激]
 
杂谈2:NUD状态转移的实际理解
  根据NUD的状态转移,实际测试两种情况:NUD_INCOMPLETE和NUD_PROBE。
NUD_INCOMPLETE
  Linux Host随便telnet一个没有使用的IP1,协议栈会为会IP1创建一个邻居表项,状态由NUD_NONE迁移到NUD_INCOMPLETE,具体的协议栈流程在上篇ARP[http://blog.csdn.net/qy532846454/article/details/6806197]中分析的。
在Linux Host上telnet XX.XX.86.198,捕获到的发包状况如下:

  这三个报文是在进入NUD_INCOMPLETE状态后,尝试了3次ARP广播(因为还未收到对方报文),对应arp_tbl中的参数mcast_probe=3次数,每次尝试间的时间间隔近似1s,对应arp_tbl中的参数retrans_time = 1HZ。

NUD_PROBE
  NUD_PROBE测试复杂一点,先由一台Host1(IP2)向Linux Host发送arp request请求,协议栈会为IP2创建一个邻居表项,状态由NUD_NONE -> NUD_STALE,然后Linux Host会响应request,状态由NUD_STALE -> NUD_DELAY -> NUD_PROBE,具体的协议栈流程在上篇ARP[http://blog.csdn.net/qy532846454/article/details/6806197]中分析的。
  由Host1构造假arp request(sip=未被使用IP, tip=Linux Host IP)给Linux Host,捕获到的发包状况如下:

  每一个包是Host1发出的request,每二个包是Linux Host的回复,后三个包是3次ARP单播尝试,此时处于NUD_PROBE状态要尝试对方是否存活,由于sip使用的是虚假址,因此没有响应,在尝试了最大次数3次,对应arp_tbl中的参数ucast_probe=3次数,每次尝试的间隔时间近似1s,对应arp_tbl中的参数retrans_time=1HZ。

  对比下windows这方面的处理可以发现,两者在这方面的行为相差很大:比如windows的网络协议栈会处理RFC826所规定的gratuitous arp报文;windows的arp尝试只会进行一次。

Linux内核分析 - 网络[十]:ARP杂谈相关推荐

  1. Linux内核分析 - 网络[十六]:TCP三次握手

    内核:2.6.34       TCP是应用最广泛的传输层协议,其提供了面向连接的.可靠的字节流服务,但也正是因为这些特性,使得TCP较之UDP异常复杂,还是分两部分[创建与使用]来进行分析.这篇主要 ...

  2. Linux内核分析 - 网络[十二]:UDP模块 - socket

    内核版本:2.6.34 这部分内容在于说明socket创建后如何被内核协议栈访问到,只关注两个问题:sock何时插入内核表的,sock如何被内核访问的.对于核心的sock的插入.查找函数都给出了流程图 ...

  3. Linux内核分析 - 网络[十五]:陆由表[再议]

    内核版本:2.6.34 陆由表作为三层协议的核心数据结构,理解它是至关重要的.前面已经分析过路由表,有兴趣的可以参考:       第一篇:路由表 http://blog.csdn.net/qy532 ...

  4. Linux内核分析 - 网络[十四]:IP选项

    内核版本:2.6.34       在发送报文时,可以调用函数setsockopt()来设置相应的选项,本文主要分析IP选项的生成,发送以及接收所执行的流程,选取了LSRR为例子进行说明,主要分为选项 ...

  5. Linux内核分析 - 网络[十二]:UDP模块 - 收发

    内核版本:2.6.34 UDP报文接收        UDP报文的接收可以分为两个部分:协议栈收到udp报文,插入相应队列中:用户调用recvfrom()或recv()系统调用从队列中取出报文,这里的 ...

  6. linux内核分析 网络九,“Linux内核分析”实验报告(九)

    一 Linux内核分析博客简介及其索引 本次实验简单的分析了计算机如何进行工作,并通过简单的汇编实例进行解释分析 在本次实验中 通过听老师的视频分析,和自己的学习,初步了解了进程切换的原理.操作系统通 ...

  7. Linux内核分析 - 网络[四]:路由表

    路由表 在内核中存在路由表fib_table_hash和路由缓存表rt_hash_table.路由缓存表主要是为了加速路由的查找,每次路由查询都会先查找路由缓存,再查找路由表.这和cache是一个道理 ...

  8. Linux内核分析 - 网络[八补]:IP协议补充

    内核版本:2.6.34 在前一篇"IP协议"中对报文接收时IP层的处理进行了分析,本篇分析将针对报文发送时IP层的处理.       传输层处理完后,会调用ip_push_pend ...

  9. Linux内核分析 - 网络[九]:邻居表

    内核版本:2.6.34 这部分的重点是三个核心的数据结构-邻居表.邻居缓存.代理邻居表,以及NUD状态转移图. 总的来说,要成功添加一条邻居表项,需要满足两个条件:1. 本机使用该表项:2. 对方主机 ...

最新文章

  1. python字符串的定义、切片、格式化、函数
  2. Android抓包方法(一)之Fiddler代理
  3. 复制文件时怎么保留权限
  4. 软件工程---2.软件过程
  5. 手把手教你用ECharts画折线图
  6. 《如何搭建小微企业风控模型》第十节 单变量分析(下)节选
  7. 本地修改服务器上的内容,本地修改指向服务器
  8. android实现nfc支付宝,支付宝首次支持NFC与LBS 实现快速手机支付
  9. Single-Shot Calibration:基于全景基础设施的多相机和多激光雷达之间的外参标定(ICRA2021)...
  10. Android edittext 属性inputtype
  11. SequoiaDB分布式数据库2021.12月刊
  12. 贝塞尔曲线 PH曲线 C曲线 B样条 NURBS样条曲线 三次Cardinal样条曲线对比 也涉及到不同曲线加速度的一些东西,不过有待细化
  13. 免费个人商城系统源码推荐
  14. 蛮力法的相关问题总结
  15. Cpp环境【CQYZOJ3145】【CQOI2916】学生宿舍依法集会权遭受侵害案例
  16. 威伦触摸屏绘制XY曲线
  17. 如何连接到远程windows服务器(纯学习笔记,不作为教程)
  18. vivado DocNav软件打不开PDF文档的解决办法
  19. 数控机床的c语言编程,数控机床的编程方法和典型实例分析
  20. kali ap pojie

热门文章

  1. dxf转nc代码软件_Window绝赞的6款软件,效率加班党必备,快到惊人!
  2. Java 算法 麦森数
  3. python 拆分list,按照对应位置重组
  4. python计算while循环次数_python-----运算符及while循环
  5. mysql basedao_JDBC之BaseDao类
  6. 电商面试经验(mybatis)
  7. c++--类的作用域
  8. 【JZOJ3885】【长郡NOIP2014模拟10.22】搞笑的代码
  9. 部署LNMP架构及其应用
  10. LintCode刷题笔记-- BackpackIII