arp_annouce=0的时候

手册上说的是到底是是说当我这个包出去的时候询问arp地址,

当arp_announce=0的时候,是说使用数据包中的地址去进行arp的请求,

当arp_announce=2的时候,是根据端口号决定如何进行arp的请求;

于是我就做了这样一个试验: 还是三大件,树莓派+虚机+宿主机,

虚机:ethA1 192.168.0.110

宿主机 ethA2 192.168.0.1  ethB2 192.168.1.1

树莓派 ethB 192.168.1.110

增加路由信息

虚机上:route add default gw 192.168.0.1

树莓派上:route add default gw 192.168.1.1

这个样子三者的网算是通了,

然后我想测试的是arp_annouce=0的时候,echB2到echB的arp请求都是由由数据包中的地址发起,但是万万没想到呢,于是我从虚拟机中ping树莓派,然后通过wireshark抓包工具,希望看到arp请求是有192.168.0.110发起,但是发现并不是,竟然是由192.168.1.1发起,这并不符合arp_announce的行为呀,百思不得其解,只能看代码了,于是我就开始抓在arp源地址设置的代码,stap脚本在:net/arp/arp_send_dst.stp中,然后我发现了一件事情。。。那就是在进行函数inet_addr_type_dev_table判断会返回的不是RTN_LOCAL,而是RTN_UNICAST,也就是说我ping的数据包中的源地址啊并不是本机地址,这不在arp_annouce数据包的职责范围了。这就是ip地址不是用本端口的根因,于是我自己写了一个sender不断向树莓派中发数据包,不同的是,这次的源地值是我主机上的另一套地址了,按理说这次arp请求的地址就会换掉了:sedner的代码见net/arp/sender.c

现在问题是在socket中设置源地址呢,这个可以通过raw socket来解决。

这次就对了,随便从网上copy下来了一个sende使用raw socket来完成该功能的程序,然后设置源地址发送,发现是可以的呢。

好了,证明结束,我们就来看一下相关的代码: arp_solicit,这个函数里面有所有对arp_announce的约束,都约束啥东西呢?

所以总结一下:

对于本地产生的数据包:

arp_announce=0:使用数据包的地址去访问,这个数据包一定是来源于本地的数据包;(LVS)

arp_announce=1:  数据包中的地址必须与目的地址位于同一个网段;【可以自行做下试验】

arp_announce=2:使用接口地址去访问;

如果如果上述的结果都不满足,那么就使用端口地址去访问了

对于本地转发的数据包:

使用接口地址去访问;

arp_annouce=2详解的更多相关文章

  1. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  2. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  3. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

随机推荐

  1. 006---Linux用户、群组和权限

    用户.组.权限管理 用户管理 增 语法:useradd -c '添加用户1' user1 选项和参数: -c:用户的备注信息 -d:用户的家目录 -g:指定用户所属的用户组(gid) -s:指定用户登 ...

  2. Go语言中的运算符

    ## 1 概述Go语言提供了,算术,关系,逻辑,位,指针,赋值运算符.本篇整体说明一下. ## 2 算术运算 * \+ 相加* \- 相减* \* 相乘* / 相除* % 求余* ++ 自增* \-\ ...

  3. python--模块之random随机数模块

    作用是产生随机数 import random random.random:用于生成一个0--1的随机浮点数. print(random.random())>>0.3355102133472 ...

  4. python通过mongoengine中connect函数连接多个数据库

    mongoengine支持程序同时连接多个数据库,这些数据库可以位于一个或多个mongo之中,通过alias名称区分不同的连接即可. 可以通过switch_db切换到不同的数据库,进行读写操作,swi ...

  5. 设置cell高度的两种方法(label高度的可变引起cell高度可变的情况)

    第一种:(iOS8以后可用) 在Xib或stroyboard中(代码也可以) 利用AutoLayout设置好label的约束(比如可以设置四个边都距离屏幕50等方式,必须四个边都要固定好). 在代码部 ...

  6. day 6 老王开枪打人

    1.图示 2 程序 1)版本1:框架的搭建 def main(): '''用来控制这个程序的流程''' pass #1.创建alex对象 #2.创建1个枪对象 #3.创建1个弹夹对象 #4.创建子弹对 ...

  7. 只需两步,rails支持CSV格式导出

    一.Controller最上方添加 require 'csv' 二.方法里面添加 format.csv do csv_string = CSV.generate do |csv| csv <&l ...

  8. linux下免安装版本mysql5.5 配置

    进入/usr/local #cd /usr/local 下载 #wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.39-linux ...

  9. PS 放大眼睛

    1.打开图片,Ctrl+J 复制一个 2.选择工具栏的滤镜--液化 然后选择膨胀工具--设置画笔属性

  10. TW实习日记:第31-32天

    不知不觉的,实习的净工作天数,已经都超过一个月了.因为对工作内容不是很满意,所以打算月底离职,也不知道是公司太缺人还是我真的能干活,领导竟然三番两次找我让我再考虑...明天又要找我了,哎...随机应变 ...