ip_conntrack的TCP状态机

深入理解ip_conntrack的都知道,ip-conntrack本身对于TCP维护了一个状态机,值得注意的是,该状态机和TCP协议本身的状态机相似但不相同。其区别如下:
TCP状态机:为TCP的两端分别维护一个状态机,TCP连接的主动发起/被动发起和主动关闭/被动关闭的状态机转换是不同的。
ip_conntrack的TCP状态机:只有一个概念,即conntrack本身,因此也就只有一个状态机,并不区分主动和被动。ip_conntrack并没有发送端和接收端的概念,因此也就没有双工的概念,而TCP是全双工的传输层协议,所以在连接开始和结束的时候才会分别有两个状态机转换图。
那么,如何将TCP的状态机映射到ip_conntrack的TCP状态机呢?实际上很简单,ip_conntrack的TCP状态机要比TCP本身的状态机简单得多,它完全基于前一个状态以及收到的TCP段的标志位决定要转换到的状态,没有主动端和被动端一说,所以它可以实现成一个多维数组的方式!Linux内核中的实现是三维数组,第一维表示方向,第二维表示TCP段的标志,第三维表示前一个状态。其具体实现就不多说了,前面也写过一篇文章。
        本文主要说一下ip_conntrack的TCP状态机面临TCP数据段时的表现以及其和几个恼人的TCP状态的关系。首先是一幅图,展示TCP状态和ip_conntrack的TCP状态:

下面我直接瞄向TIME_WAIT!ip_conntrack的TCP状态中也有TIME_WAIT,它和TCP本身的TIME_WAIT之间会不会有联动呢?先给出答案:没有!
1.TIME_WAIT状态的conntrack在接收到syn的时候,会立即将该conntrack删除,然后建立一个新的conntrack
这不会带来任何问题。虽然conntrack的TW状态并没有过期,但是conntrack本身并不处理TW状态的任何语义规范。正如conntrack的名称所示,它没有任何处理逻辑,只是有一个记录的功能,确认不管是什么协议,TCP也好,UDP也好,确保它们雁过留声。当然,你可以基于留下的足迹来做一些工作,比如NAT。
       事实上,TCP只在终端系统的第四层根据详细的TCP规范被处理!TCP当初在设计的时候就被设计成一个端到端的协议,这是它的本质。TCP之所以复杂是因为它经得起被复杂化。TCP并不是一开始就很复杂的,它的核心超级简单!一个经得起被任意程度复杂化的协议只能是端到端的协议,否则一个分布式的协议遇到的很多状态同步问题以及功能叠加重复的问题会阻碍协议复杂化的进程。想一下一个分布式的复杂协议OSPF的发展就知道了。
       因此,不管从原则上还是从实际实现上,conntrack都不过问TCP规范,也不强制保持状态过期时间,所有这一切都在端系统的传输层处理(不考虑SYN代理!),conntrack只是单纯的维持状态机运转,即简单的“来了什么数据,转到什么状态,过了时间就超时删除”。其任何状态都有一个超时时间,过期后的行为就是简单的“被删除”!
2.ip_conntrack不处理TCP,是的,但是并不绝对
conntrack不应该处理TCP,但是有时不得不处理,因为它首先要保证自身的状态不会乱掉。一个例子就是,conntrack处理逻辑会丢掉一个TCP连接中窗口外的数据。
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

问题一:RabbitMQ 中的 broker 是指什么?cluster 又是指什么? 问题二:什么是元数据?元数据分为哪些类型?包括哪些内容?与 cluster 相关的元数据 有哪些?元数据是如何保存的?元数据在 cluster 中是如何分布的? 问题三:RAM node 和 disk node 的区别? 问题四:RabbitMQ 上的一个 queue 中存放的 message 是否有数量限制? 问题五:RabbitMQ 概念里的 channel、exchange 和 queue 这些东东是逻辑概念,还是对应着进程实体?这些东东分别起什么作用? 问题六:vhost 是什么?起什么作用? 问题七:在单 node 系统和多 node 构成的 cluster 系统中声明 queue、exchange ,以及 进行 binding 会有什么不同? 问题八:客户端连接到 cluster 中的任意 node 上是否都能正常工作? 问题九:若 cluster 中拥有某个 queue 的 owner node 失效了,且该 queue 被声明具有 durable 属性,是否能够成功从其他 node 上重新声明该 queue ? 问题十:cluster 中 node 的失效会对 consumer 产生什么影响?若是在 cluster 中创建了 mirrored queue ,这时 node 失效会对 consumer 产生什么影响? 问题十一:能够在地理上分开的不同数据中心使用 RabbitMQ cluster 么? 问题十二:为什么 heavy RPC 的使用场景下不建议采用 disk node ? 问题十三:向不存在的 exchange 发 publish 消息会发生什么?向不存在的 queue 执行 consume 动作会发生什么? 问题十四:routing_key 和 binding_key 的最大长度是多少? 问题十五:RabbitMQ 允许发送的 message 最大可达多大? 问题十六:什么情况下 producer 不主动创建 queue 是安全的? 问题十七:“dead letter”queue 的用途? 问题十八:为什么说保证 message 被可靠持久化的条件是 queue 和 exchange 具有 durable 属性,同时 message 具有 persistent 属性才行? 问题十九:什么情况下会出现 blackholed 问题? 问题二十:如何防止出现 blackholed 问题? 问题二十一:Consumer Cancellation Notification 机制用于什么场景? 问题二十二:Basic.Reject 的用法是什么? 问题二十三:为什么不应该对所有的 message 都使用持久化机制? 问题二十四:RabbitMQ 中的 cluster、mirrored queue,以及 warrens 机制分别用于解决 什么问题?存在哪些问题?
©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值