在我的ip_conntrack版本中,它目前已经可以缓存路由,filter规则等,还可以平滑生效最新配置的NAT,它越来越像真正的SDN了,唯一有待完善的就是将5元组的tuple进化成N元组的tuple了,其余的更新及修正都是些不会引发质变的量变。
        现在看一下,ip_conntrack还能缓存什么?当然了,在我的"路由cache in conntrack"版本中,我只是将dst_entry简单的从skb中拷贝到了ip_conntrack中,类似IPMARK那样,可以在skb和conntrack之间save和restore。数据包进入协议栈被处理的流程依然没变,优化掉的仅仅是一个路由缓存和路由表的查找过程。虽然迈出了决定性的一步,但是在编程接口上确实没有什么吸引人的地方,因此你也就不想基于此去写一些代码了。比如说,数据包依然要经过ip_rcv函数的处理,依然要经过FORWARD这个HOOK链,一切都像往常一样,不同的只是在查找路由之前,路由已经被从conntrack结构体里面restore到skb了。

        如果想实现真正的流式转发,并且基于硬卡实现这种逻辑,那么就必然要对真正负责转发的链路层以及物理层动手术,比如在PREROUTING中直接将数据包注入硬卡,然后由硬卡实现以下policy:

由tuple查找conntrack;
取出route;
取出neighbour;
直接ASIC转发。
返回HOOK NF_STOLEN


对了,正是这个逻辑,它不但解放了BOX的CPU,而且还使得转发更加灵活。我们已经可以取出route,并且由于neighbour就保存在route中(Linux网络栈如此设计真的很妙!),只要将此neighbour hold on,它就能保持一直不被释放,脱离ARP的timer管理,类似static设置的ARP映射一样。

        这个neighbour的cache很关键,它直接cache了“需要最终落实的信息”,那就是下一跳的MAC地址,它甚至可以cache上一跳的MAC地址,如此一来网络上的数据转发就真正退化(也许是进化)成了“基于流头的路由,策略匹配,MAC地址的下一跳解析"了!属于同一流的后续包无需做任何协议栈里面的常规操作,所有信息都可以从conntrack中取得,这难道不就是SDN的核心吗?

        从最开始完成”完全桥接“版本的conntrack(即那个不需要配置返回包路由的那个版本,直接将上一跳的MAC进行cache,返回包直接封装其MAC地址的版本),到接触到SDN,然后陆续完成各种基于SDN核心思想的conntrack版本,其间两个月有余,然而代码很不规范,也没有提交到任何地方...

        看看所做的这一切,通过iptables,通过自己编写HOOK函数,来实现自动路由,自动封装MAC地址,一切都是基于conntrack,这是什么行为?这其实正是在逐渐架空传统协议栈的路由逻辑,ARP解析逻辑啊!一个转发BOX竟然没有路由逻辑,没有ARP逻辑,这是不可想象的,它成了什么?或者问什么东西没有这些复杂的逻辑?答案显而易见!switch!对了,就是switch,终于,BOX退化成了一个交换机!仅仅负责数据的转发,而控制逻辑从哪里来?或者问,一个傻瓜switch究竟是如何知道该如何转发数据的,我的版本是预配置,这当然只是我的一种方式而已!标准做法是通过一个通信协议,从另一台机器上获取,这个所谓的另一台机器是什么?我把它称为控制器。也就是说,路由逻辑等控制模块全部移到了这个控制器中了。

        这便是我的SDN版本!一个不同于OpenFlow的,但是完全体现SDN思想的非标准化的SDN实现。接下来要证实的是,IP路由并不是根本,根本是什么?根本是”可以落实的“东西,那就是有封装以太帧的目标MAC地址!!!(走火入魔了!!!)

ip_conntrack缓存neighbour的更多相关文章

  1. Linux转发性能评估与优化-转发瓶颈分析与解决方式(补遗)

    补遗 关于网络接收的软中断负载均衡,已经有了成熟的方案,可是该方案并不特别适合数据包转发,它对server的小包处理非常好.这就是RPS.我针对RPS做了一个patch.提升了其转发效率. 下面是我转 ...

  2. Linux转发性能评估与优化(转发瓶颈分析与解决方式)

    线速问题 非常多人对这个线速概念存在误解. 觉得所谓线速能力就是路由器/交换机就像一根网线一样. 而这,是不可能的.应该考虑到的一个概念就是延迟. 数据包进入路由器或者交换机,存在一个核心延迟操作,这 ...

  3. Linux ARP缓存配置和状态查看命令

    查看Linux ARP缓存老化时间 cat /proc/sys/net/ipv4/neigh/eth0/base_reachable_time同目录下还有一个文件gc_stale_time,官方解释如 ...

  4. 我和ip_conntrack不得不说的一些事

    面对让人无语的ip_conntrack,我有一种说不出的感觉!自从接触它到现在,已经两年多了,其间我受到过它的恩惠,也被它蹂躏过,被它玩过,但是又不忍心舍弃它,因为我找不到更好的替代.工作中,学习中, ...

  5. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  6. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  7. ASP.NET Core 中间件之压缩、缓存

    前言 今天给大家介绍一下在 ASP.NET Core 日常开发中用的比较多的两个中间件,它们都是出自于微软的 ASP.NET 团队,他们分别是 Microsoft.AspNetCore.Respons ...

  8. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  9. [Java 缓存] Java Cache之 DCache的简单应用.

    前言 上次总结了下本地缓存Guava Cache的简单应用, 这次来继续说下项目中使用的DCache的简单使用. 这里分为几部分进行总结, 1)DCache介绍; 2)DCache配置及使用; 3)使 ...

随机推荐

  1. ASP.NET Application,Session,Cookie和ViewState等对象用法和区别 (转)

    在ASP.NET中,有很多种保存信息的内置对象,如:Application,Session,Cookie,ViewState和Cache等.下面分别介绍它们的用法和区别. 方法 信息量大小 作用域和保 ...

  2. Codeforces Round #239 (Div. 2) C. Triangle

    time limit per test:1 secondmemory limit per test:256 megabytesinput:standard inputoutput:standard o ...

  3. HDU 2985 Another lottery(坑题)

    点我看题目 题意 : 有n个人,每个人可以玩m轮,每一轮中每个参与者都有cj张票,第 i 轮的奖金是2的i次方,问你每个人所能赢得最多的奖金的概率是多少. 思路 : 这个题比较坑啊,其实不用去算前几轮 ...

  4. LCA问题的ST,tarjan离线算法解法

    一  ST算法与LCA 介绍 第一次算法笔记这样的东西,以前学算法只是笔上画画写写,理解了下,刷几道题,其实都没深入理解,以后遇到新的算法要把自己的理解想法写下来,方便日后回顾嘛>=< R ...

  5. UVA 125 Numbering Paths

    题目大意:给定n条单向边,求图中任意两点的连通路径的数目.其中点是从0-输入中出现的最大的点. 可以用floyd-warshall算法或者dfs. for(int k = 0; k < n; k ...

  6. S3C2410 实验三——跑马灯实验

    http://www.evernote.com/shard/s307/sh/f2a748e7-34c4-4ce6-acac-82a756cc9e82/ad5813188d655e504857970db ...

  7. C#中的泛型详解

    泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性.泛型为.NET框架引入了类型参数(type parameters)的概念.类型参数使得设计类和方法时,不必确定一个或多个具 ...

  8. 【HDOJ】3275 Light

    这就是个简单线段树+延迟标记.因为对bool使用了~而不是!,wa了一下午找不到原因. /* 3275 */ #include <iostream> #include <sstrea ...

  9. MyBatis学习总结1

    MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用 ...

  10. Github是什么?看完你就了解一些了

    要了解Github,我们首先要知道Git,Git是管理代码的工具,写代码不是件轻松的事儿,一个人写的时候已经不轻松了,一群人写就更不轻松了,但这世界上很多事都是怎么不轻松怎么来的,大部分人都会和别人一 ...