cache老化时间的思考--以nat为例

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介:
局域网越来越大,于是有人提出了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的地方都要注意这个一致性,除此之外还必须实现公平性。


 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1271918

相关文章
|
运维 小程序 应用服务中间件
记录Ngnix增加对IP封禁及自动封禁IP的方案思考
发现某个应用的服务器一些IP地址或是一些IP段请求量巨大,初步确定为非法请求,经过增加IP封禁策略,使其不可访问。
904 0
记录Ngnix增加对IP封禁及自动封禁IP的方案思考
|
29天前
|
网络协议 Serverless
阿里云DNS常见问题之函数计算里dns 的 ttl 设置太长了如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
5月前
|
API 索引
主机磁盘使用率超过85%导致es索引变为只读模式
主机磁盘使用率超过85%导致es索引变为只读模式
171 0
|
9月前
|
SQL 缓存 关系型数据库
PG空闲连接对性能的影响
PG空闲连接对性能的影响
220 0
|
10月前
|
Shell 网络安全 Perl
并发从数台机器中获取 hostname,并记录返回信息花费的时长,重定向到一个文件 hostname.txt 中,在全部完成后输出花费时长最短的那台机器的 CPU 信息。
并发从数台机器中获取 hostname,并记录返回信息花费的时长,重定向到一个文件 hostname.txt 中,在全部完成后输出花费时长最短的那台机器的 CPU 信息。
57 0
|
人工智能 Linux
VOS 媒体转发开启后,如何计算各种编码所占用的带宽,以及如何修改服务器的时区
计算方法如下: 带宽 = 包长度 × 每秒包数 = 包长度 × (1 / 打包周期) =(Ethernet 头 + IP 头 + UDP 头 + RTP 头 + 有效载荷)× 每秒包数 =(112bit + 160bit + 64bit + 96bit + 有效载荷)× 每秒包数 =(112bit + 320bit + 有效载荷)× 每秒包数 =(432bit + 有效载荷)× 每秒包数 =(432bit × 每秒包数) + (有效载荷 × 每秒包数) =(432bit × 1000 / 打包周期) + 编码速率 =(432bit / 打包周期)Kbps + 编码速率 按照上面的计算公式: G
|
网络协议 数据安全/隐私保护
群晖设置固定IP (Fix IP)的方法
群晖设置固定IP (Fix IP)的方法
群晖设置固定IP (Fix IP)的方法