ip_conntrack缓存neighbour
在我的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的更多相关文章
- Linux转发性能评估与优化-转发瓶颈分析与解决方式(补遗)
补遗 关于网络接收的软中断负载均衡,已经有了成熟的方案,可是该方案并不特别适合数据包转发,它对server的小包处理非常好.这就是RPS.我针对RPS做了一个patch.提升了其转发效率. 下面是我转 ...
- Linux转发性能评估与优化(转发瓶颈分析与解决方式)
线速问题 非常多人对这个线速概念存在误解. 觉得所谓线速能力就是路由器/交换机就像一根网线一样. 而这,是不可能的.应该考虑到的一个概念就是延迟. 数据包进入路由器或者交换机,存在一个核心延迟操作,这 ...
- Linux ARP缓存配置和状态查看命令
查看Linux ARP缓存老化时间 cat /proc/sys/net/ipv4/neigh/eth0/base_reachable_time同目录下还有一个文件gc_stale_time,官方解释如 ...
- 我和ip_conntrack不得不说的一些事
面对让人无语的ip_conntrack,我有一种说不出的感觉!自从接触它到现在,已经两年多了,其间我受到过它的恩惠,也被它蹂躏过,被它玩过,但是又不忍心舍弃它,因为我找不到更好的替代.工作中,学习中, ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- 哪种缓存效果高?开源一个简单的缓存组件j2cache
背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...
- ASP.NET Core 中间件之压缩、缓存
前言 今天给大家介绍一下在 ASP.NET Core 日常开发中用的比较多的两个中间件,它们都是出自于微软的 ASP.NET 团队,他们分别是 Microsoft.AspNetCore.Respons ...
- ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...
- [Java 缓存] Java Cache之 DCache的简单应用.
前言 上次总结了下本地缓存Guava Cache的简单应用, 这次来继续说下项目中使用的DCache的简单使用. 这里分为几部分进行总结, 1)DCache介绍; 2)DCache配置及使用; 3)使 ...
随机推荐
- iOS 8 定位失败问题
首先plist定义两个string: NSLocationWhenInUseUsageDescription NSLocationAlwaysUsageDescription 然后调用 [self. ...
- 练习-libev和pyev示例
事件循环,IO复用,还是理解深刻一点好. 比较LIBEV和PYEV,发现PYTHON库只是对LIBEV作了简单的语法转换. 到了这个层次,就一个字:DIAO!!! libev的C版: #include ...
- 汇编语言第二版 程序在dos中执行情况.P86-87
假设程序要被dos系统加载到sa:0000的内存中,在这个地址的内存开始会有256个字节的PSP程序,用于加载程序和dos系统的通信.ds中的地址为sa. 真正的程序会在这256个字节之后.所以真正程 ...
- HTTP Header 入门详解
什么是HTTP Headers HTTP是"Hypertext Transfer Protocol"的所写,整个www都在使用这种协定,几乎你在流览器里看到的大部分内容都是通过ht ...
- 学习kernel编程的建议
我把我学习kernel编程的过程介绍给大家,希望大家有个参考. 学习kernel编程需要阅读大量的kernel方面的书籍,在此我列举一下我读过的kernel书籍(按时间先后顺序),并给一些建议. 1. ...
- Android list刷新后仍然定位到原来的位置,解决。
问题: 有一个list,点击item时会做一些事情,然后重新加载数据,此时希望点击重新刷新后item还在原来的位置,而不是跳转到开头. 实现如下: 1.listview添加监听setOnScrollL ...
- 【HDOJ】1241 Oil Deposits
经典的BFS. #include <stdio.h> #include <string.h> #define MAXNUM 105 #define MAXROW 105 #de ...
- 【Python Network】分解DNS查询结果
针对DNS查询records,通过NS.PTR.CNAME和MX类别不同,返回数据将包含另外主机名.为了解最终的IP地址,通过将返回信息分解.继续使用PyDNS获取详细信息. #! /usr/bin/ ...
- 【HDOJ】1003 Max Sum
最开始使用递归DP解,stack overflow.化简了一些,复杂度为O(n)就过了. #include <stdio.h> int main() { int case_n, n; in ...
- UltraEdit (Ctrl + F) 查找、(Ctrl + R)替换功能失效
环境: Windows 7 Service Pack 1 X64 工具: UltraEdit Version 21 症状: UltraEdit (Ctrl + F) 查找.(Ctrl + R)替换功能 ...