局域网越来越大,于是有人提出了vlan,vlan越来越依赖多而快的端口,于是有人做出了三层交换机,实际上三层交换机仅仅对直接下挂的主机性能有较大的提升,对远端的主机效果要么不大,要么根本没有,说白了三层交换机就是在学以太网交换机的样子,本质上就是加了一个cahce功能,使得ip地址直接与端口保持映射,这样就不必再解包,路由,封包了,因此三层交换机是基于流的,并且只要是基于流的都会有老化机制。在cache的作用下,三层交换机轻松实现快速转发,就像二层交换机一样,拥有学习功能,所谓的学习功能其实就是一个cache功能。
     有必要提一下老化机制,该机制丰富了cache,增加了公平性,但是有的时候行为却不是很严格,比如nat实现中,nat在linux中是基于netfilter的conntrack的,conntrack模块会侦测过来的每一个数据包,如果它已经属于一个流,那么就放过,如果不属于任何流,那么就建立一个新的流,将之放入一个哈希,这里就有了两个问题。
     第一个问题是由于tcp和udp的行为有很大的不同,那么连接管理模块有必要将之分开管理,那么就需要在prerouting的时候知道该数据包是tcp的还是udp的,但是我们知道ip会分片的,所以当时到来的数据包可能仅仅是一个ip片段,我们无法从一个片断看得出该片断是udp还是tcp的,除非该片断是第一个,于是conntrack要做的一件事就是重组分片,然后在forward的时候再将之分片。
     第二个问题就是流的老化时间问题,为了使得内核不频繁的对流cache进行修改和替换,每个连接的每个状态都有个老化时间,这些时间根据协议和协议的状态有所不同,比如tcp的ESTABLISHED的状态的流的老化时间就会特别长,而udp的未回答状态的老化时间会特别短,于是问题出来了,如果我配置错了一个nat,那么当我尝试连接的时候肯定是失败的,因为nat将会把目的地址转为一个错误的地址,此时流已经建立了,虽然可能不通,但是路由存在,访问允许,流建立了,并且在确认路由存在访问允许之后查nat表找到了错误的rule,由于对端还没有回答,所以这个状态的流的老化时间很短,虽然时间老化很短,可毕竟建立了,然后我随即将nat配置正确,可是在刚才那个已经建立的流为老化之前,我还是无法连接,这说明一旦流匹配了,在下面经过nat表的时候就会将nat信息复制进这个流,于是后面的数据包一旦命中这个流,将会一直使用这个nat信息,直到该流老化或者被挤出哈希表;另外一个反面的例子是如果nat是配置正确的,那么在改错了的一会时间内还是可以通信的,原因就是流还没有老化,并且新的nat信息没有被刷新。
     另外,nat依赖conntrack的设计本身也许很脆弱,在出现大量连接的情况下,conntrack的哈希表很快就会满,接下来的连接就无法加入哈希表了,于是nat就会失败。脆弱的本质就是nat几乎完全依赖了一个用于效率优先容量有限的哈希表,而不是公平优先绝对精确的容器,我们在受到cache的恩惠的同时也要主要它会引起的问题,正如cpu的cache有cache一致性一样,任何用到cache的地方都要注意这个一致性,除此之外还必须实现公平性。

转载于:https://blog.51cto.com/dog250/1271918

cache老化时间的思考--以nat为例相关推荐

  1. webshell免杀的一些学习和思考——以PHP为例

    目录 前言 一.关于webshell 1.数据传递 (1)HTTP请求中获取数据 (2)从远程URL中获取数据 (3)从磁盘文件中获取数据 (4)从数据库中读取 (5)从图片头部中获取 2.代码执行 ...

  2. 生成式语言大模型压缩技术思考——以ChatGPT为例

    ChatGPT引领了生成式语言大模型的应用与技术热潮,首先简单回顾ChatGPT应用范式:将其应用于指定的下游任务时(如知识问答.翻译.编码),ChatGPT需要经历三个阶段的训练(增强人类语境的猜想 ...

  3. Cache Memory技术示例

    Cache Memory技术示例 为什么需要cache?如何判断一个数据在cache中是否命中?cache的种类有哪些,区别是什么? 为什么需要cache memory 先思考第一个问题:程序是如何运 ...

  4. iOS开发——cache自动清理方案探索

    有效的本地 cache 机制,可以避免不必要的重复网络加载,不仅能提高相关应用场景的资源加载速度,也可以避免不必要的流量浪费造成用户损失.但是,由于缓存一般做法是通过 url 经过 md5 变换的值作 ...

  5. arm cache ace chi

    转自:ARMv8/ARMv9的Exclusive机制深度解读_代码改变世界ctw的博客-CSDN博客 1. cache的基本概念介绍 1.1.为什么要用cache? ARM 架构刚开始开发时,处理器的 ...

  6. 【zz】 现代CPU Cache结构 和 陈首席对CPU Cache的讲解

    http://www.tektalk.org/2011/04/14/%e7%8e%b0%e4%bb%a3-cpu-%e4%b8%ad%e7%9a%84-cache-%e7%bb%93%e6%9e%84 ...

  7. 软件测试 单元测试用例设计,单元测试的用例设计

    首先,我们先来思考一个问题:单元测试中,哪一个环节更重要? 要回答这个问题,我们先需要了解单元测试到底有哪些环节,读到这里,请暂停一分钟,回忆一下我们平时的单元测试实践(请最小化浏览器). 对于单元测 ...

  8. 00-深入学习cache

    序言 带着问题去学习,关于cache的一些思考: 1.L1/L2/L3 cache到底在哪里?L1/L2/L3 cache分别都是多大? 2.L1/L2/L3 cache的组织形式都是怎样的?n路组相 ...

  9. FPGA(2)--例化语句--1位全加器

    文章目录 一.实验目的 二.实验内容 三.实验设计 四.实验结果及仿真 一.实验目的 熟悉元件封装方法,掌握层次化电路设计方法:掌握VHDL例化语句的设计方法. 二.实验内容 1.用VHDL语言设计1 ...

最新文章

  1. 冠状病毒如何杀灭最高效?这里有一份几十年的实验汇总
  2. HTML5+CSS学习心得
  3. UPS 异常停机案例分析
  4. c# async/await编程
  5. 【转】setsocketopt getsocketopt比较全的参数说明
  6. blob数据类型_MySQL的数据类型
  7. zabbix 3.0 监控windows 部署
  8. MySQL优化常见Extra分析——慢查询优化
  9. volatile与多线程
  10. 老板为什么越来越难熬?
  11. 【数据库原理实验(openGauss)】视图
  12. LTE:下行峰值速率计算
  13. ISE中FIFO IP核的Standard FIFO和First-word-Fall-Through模式的仿真比较
  14. axios的一封装和二次封装
  15. 腾讯云mysql服务cpu毛刺问题
  16. PR curve, AP, mAP, AUC, f1-score ??
  17. python-测试框架nose(nosetests)简介
  18. 转: GSM信令流程
  19. 脂多糖(LPS) 来源于肠炎沙门氏菌, S-型解决方案
  20. oracle数据库19c驱动包,Oracle Database 19c 19.3 Windows x64 64-bit 下载 安装

热门文章

  1. RocEDU.课程设计2018 第二周进展 博客补交
  2. Ajax在火狐下提示跨域问题的解决方案
  3. jquery 插件 任意位置浮动固定层
  4. iText in Action 2nd4.2节(Changing the properties of a cell)读书笔记
  5. 基于开源Flash Server:Red5构建RTMP流媒体播放平台
  6. opencv_imread出错(release/debug、X86/X64)
  7. 单域名多php,php多域名单站点路由
  8. 1流式细胞术荧光比值计算_流式细胞术的简介
  9. 电子科技大学计算机网络实验,计算机网络实验电子科技大学.doc
  10. 荣耀6 原生Android,荣耀6 (移动4G) 官方原生简约实用 流畅省电 杜比音效 网速显示-刷机之家...