在我的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. mysql之——存储过程 + 游标 + 事务

    下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考. 其中,涉及到了存储过程.游标(双层循环).事务. [说明]:代码中的注释只针对当时业务而言,无须理会. 代码如下: ...

  2. 找不到mysql服务或mysql服务名无效

    问题原因:mysql服务没有安装. 解决办法: 在 mysql bin目录下 以管理员的权限 执行 mysqld -install命令 出现:Service successfully installe ...

  3. 弱安全协议探测工具-sslciphercheck

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为 网络通信提供安全及数据完整性的一种安全协议.TLS ...

  4. Android java.lang.ClassCastException

    lassCastException,从字面上看,是类型转换错误,通常是进行强制类型转换时候出的错误.下面对产生ClassCastException异常的原因进行分析,然后给出这种异常的解决方法. 这种 ...

  5. int指令理解

    以下是王爽老师的<汇编语言>中第十五章中的一段程序代码,其功能是增加9号中断的功能,当按下Esc键时屏幕中显示的字母改变颜色 assume cs:codesg,ss:stack,ds:da ...

  6. 《深入理解linux内核》第二章 内存寻址

    三种不同的内存地址 逻辑地址(logical address)包含在linux实际指令中的地址,即分段式地址,是对应的硬件平台段式管理转换前地址由16位的段选择符(segment selector)和 ...

  7. 【HDOJ】3509 Buge's Fibonacci Number Problem

    快速矩阵幂,系数矩阵由多个二项分布组成.第1列是(0,(a+b)^k)第2列是(0,(a+b)^(k-1),0)第3列是(0,(a+b)^(k-2),0,0)以此类推. /* 3509 */ #inc ...

  8. JAVA web选型

    Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的We ...

  9. JDK/bin目录下的不同exe文件的用途(转)

    新安装完JDk 大家是否发现安装目录的bin文件夹有很多exe文件 下面就为大家讲解不同exe文件的用途 javac:Java编译器,将Java源代码换成字节代 java:Java解释器,直接从类文件 ...

  10. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]Contents

    I find it may cost me so much time in doing such solutions to exercises and problems....I am sorry t ...