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
linux的ip conntrack實現得過於沉重和精細。而實際上有時候,根本不需要在conntrack中對tcp的狀態進行跟蹤,只把它當udp好了,我們的需求就是讓系統可以將乙個資料報和乙個五元組標示的流相關聯,因為很多的基於流的策略都設定在conntrack結構中,所以當關聯好之後,就可以直接取...
無狀態登入
有狀態服務,即服務端需要記錄每次會話的客戶端資訊,從而識別客戶端身份,根據使用者身份進行請求的處理,典型的設計如tomcat中的session。例如登入 使用者登入後,我們把登入者的資訊儲存在服務端session中,並且給使用者乙個cookie值,記錄對應的session。然後下次請求,使用者攜帶c...
restful的無狀態理解
所謂無狀態 就是資源可以通過uri來指定,就像是乙個蘿蔔乙個坑的意思。而且定位與其他資源無關,也不會因為其他資源的變化而變化。有狀態和無狀態的區別,有狀態是指 比如乙個資產應用系統,你想看下報廢的台式電腦有多少,是什麼型號,你得在登入介面登進去,然後點開資產維護功能,檢視報廢的相關資訊,選中台式電腦...