Linux的ip_conntrack实现得过于沉重和精细。而实际上有时候,根本不需要在conntrack中对TCP的状态进行跟踪,只把它当UDP好了,我们的需求就是让系统可以将一个数据包和一个五元组标示的流相关联,因为很多的基于流的策略都设置在conntrack结构中,所以当关联好之后,就可以直接取出策略来作用于数据包了,不再需要为每一个数据包都来一次策略匹配。
        TCP的状态本就不应该在途中被检测,这也是TCP/IP的设计者的中心思想。还好,Linux提供了两个sysctl参数可以在一定程度上放弃对TCP状态的精细化监控,它们是:

net.netfilter.nf_conntrack_tcp_loose = 1
net.netfilter.ip_conntrack_tcp_be_liberal = 1
相关的代码解释是:

/* "Be conservative in what you do,
be liberal in what you accept from others."
If it's non-zero, we mark only out of window RST segments as INVALID. */
static int nf_ct_tcp_be_liberal __read_mostly = 0; /* If it is set to zero, we disable picking up already established
connections. */
static int nf_ct_tcp_loose __read_mostly = 1;

在ip_conntrack的逻辑中,如果一个包没有在conntrack哈希中找到对应的流,就会被认为是一个流的头包,流程如下:



TCP对数据包的要求太高了,在上述的loose参数不为1的情况下,tcp_new要求新到来的第一个包必然要有SYN标志,否则不予创建conntrack,数据包将成为游离数据包,NAT等都将失去作用,即便是中间的数据包,be_liberal不为1时,tcp_packet要求数据包必须in_window。这就是为何TCP的establish conntrack超时时间设置5天那么久的原因,还好,有上述两个参数,我们可以避开这个,将TCP尽可能地和UDP同等对待。我的方式更猛,索性将TCP的nf_conntrack_l4proto换成了nf_conntrack_l4proto_udp4,这样连sysctl参数都不用设置了。

NAT问题的解释

一条TCP连接,经过Linux Box,被NAT,过了120秒+之后,连接断开!这个解释很简单,我将net.netfilter.nf_conntrack_tcp_timeout_established设置成了120秒,此后conntrack超时被删除!再有数据时,按照上面的tcp_new流程,数据包将成为游离数据包,NAT依赖conntrack,故失效,连接依赖NAT,故而连接失效!

无状态TCP的ip_conntrack的更多相关文章

  1. http协议和web应用有状态和无状态浅析

    http协议和web应用有状态和无状态浅析 (2013-10-14 10:38:06) 转载▼ 标签: it   我们通常说的web应用程序的无状态性的含义是什么呢? 直观的说,“每次的请求都是独立的 ...

  2. http的无状态无连接到底是什么含义

    无连接:服务器处理完客户的请求,并收到客户的应答后,即断开连接. 早期这么做的原因是 HTTP协议产生于互联网,因此服务器需要处理同时面向全世界数十万.上百万客户端的网页访问,但每个客户端(即浏览器) ...

  3. 为什么说http协议是无状态的?

    首先了解基本概念:什么是无状态,什么是无连接 无状态协议: 协议的状态是指下一次传输可以“记住”这次传输信息的能力. http是不会为了下一次连接而维护这次连接所传输的信息,为了保证服务器内存. 比如 ...

  4. http协议无状态中的 "状态" 到底指的是什么?!

    引子: 最近在好好了解http,发现对介绍http的第一句话[http协议是无状态的,无连接的]就无法理解了:无状态的[状态]到底指的是什么?! 找了很多资料不仅没有发现有一针见血正面回答这个问题的, ...

  5. http协议——无连接、无状态

    无连接 无连接的含义是限制每次连接只处理一个请求.服务器处理完客户的请求,并收到客户的应答后,即断开连接.采用这种方式可以节省传输时间. 早期这么做的原因是 HTTP 协议产生于互联网,因此服务器需要 ...

  6. HTTP协议是无状态的

    含义: 无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态.从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系 实际中的使用情况: 在web应用中,我 ...

  7. 【Python】【有趣的模块】【Requests】无状态 & 无连接

    无状态:原来的Web是静态,后来换成动态的就需要保存一些上下文信息,session和cookie应运而生 无连接:原来为了请求结束后赶紧把资源让出去,后来发现每次请求中有相同的小请求时候再重复执行(而 ...

  8. Service Fabric学习-从helloworld开始(无状态服务)

    原先做服务器程序, 都是部署在xx云上, 也没理解云是个啥, 不就是个服务器(虚拟机)租赁商吗? 好吧, 其实这个是IaaS, 而接下来要学习的ServiceFabric(以下简称SF)是PaaS. ...

  9. EJB开发第二期---开发具有本地接口的无状态Bean

    一.EJB中的bean 1.1 EJB中bean分类 会话bean(session bean) 负责与客户端交互,是编写业务逻辑的地方,在会话bean中可以通过jdbc直接操作数据库,但大多数情况下都 ...

随机推荐

  1. 看到关于socket非阻塞模式设置方式记录一下。

    关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的:我打个很简单的比方,如果你调用socket send函数时: 如果是阻塞模式下: send先比较待发送数据的长度len和套接 ...

  2. hdu 3350

    hdu 3350 题意:让你求运算式的结果和运算过程中加法的次数 (a) > (b) ? (a) : (b) 大于取a,小于等于取b MAX( 1 + 2 , 3) 因为(a) > (b) ...

  3. 基于jquery-easyui的仓库管理系统

    使用jQuery EasyUI创建的仓库管理系统包括系统管理.数据维护.业务单据管理等,有兴趣可以对其进行修改扩展. 数据库采用MYSQL, 帐号/密码:root/root,演示登录帐号/密码:adm ...

  4. VPS服务器下的centos网卡配置详解……

    自动激活网卡 安装了CENTOS 6.X后,每次启动了系统都需要手动激话网卡,以下方法可以在系统启动后自动激活网卡. cat /etc/sysconfig/network-scripts/ifcfg- ...

  5. asp.net微软认证全新考试题库及答案1

    1.你创建了一个ASP.net应用程序,该程序将运行在TK公司的WEB站点上.你的应用程序包括100个WEB页面.你想配置你的应用程序,当HTTP代码发生错误时,可显示自定义的错误信息给用户.同时你想 ...

  6. 关于storyboard的一点学习记录

    1.storyboard中“Main storyboard file base name”这个用来注册启动是所需要的storyboard 文件名称.当我们程序启动的时候,我们的工程就会根据这一项来自动 ...

  7. 键盘皇者 RealForce 104Pro独家评测

    http://tech.sina.cn/?sa=t84d20738943v44&page=2&pwt=rest2&vt=4&from=mbaidu&clickt ...

  8. cocos2d-x关于CCTableView的“乱序问题”的理解

    Cocos2d-x有一个不错的控件CCTableView.之前用的时候发现有cell的顺序错乱和重复出现的问题.后来仔细看了一下源码,发现是自己用法错误.但是网上有人说是一个bug,要改源码.我发现2 ...

  9. java python oracle推断字符串是否为数字的函数

    java public boolean isNumeric(String str){ Pattern pattern = Pattern.compile("^-?[0-9]+\\.?[0-9 ...

  10. Java使用HttpURLConnection上传文件

    从普通Web页面上传文件非常easy.仅仅须要在form标签叫上enctype="multipart/form-data"就可以,剩余工作便都交给浏览器去完毕数据收集并发送Http ...