這就是爲什麼鏈接跟蹤很重要的緣由了. 沒有鏈接跟蹤,防火牆將沒法判斷收到的ACK包是否屬於一個已經創建的鏈接.通常的包過濾(Ipchains)收到ACK包時,會讓它經過(這絕對不是個 好主意). 而當狀態型防火牆收到此種包時,它會先在鏈接表中查找是否屬於哪一個已建鏈接,不然丟棄該包 服務器
在TCP層,有個FLAGS字段,這個字段有如下幾個標識:SYN, FIN, ACK, PSH, RST, URG.
其中,對於咱們平常的分析有用的就是前面的五個字段。spa
它們的含義是:指針
URG:Urget pointer is valid (緊急指針字段值有效)接口
SYN: 表示創建鏈接,攜帶此標誌位的包表示正在發起鏈接請求get
FIN: 表示關閉鏈接,攜帶此標誌位的包表示正在請求終止鏈接服務器端
ACK: 表示響應,確認號請求
PSH: 表示有 DATA數據傳輸防火牆
RST: 表示鏈接重置,或者拒絕一個無效的請求總結
其中,ACK是可能與SYN,FIN等同時使用的,好比SYN和ACK可能同時爲1,它表示的就是創建鏈接以後的響應,若是隻是單個的一個SYN,它表示的只是創建鏈接。TCP的幾回握手就是經過這樣的ACK表現出來的。但SYN與FIN是不會同時爲1的,由於前者表示的是創建鏈接,然後者表示的是斷開鏈接。RST通常是在FIN以後纔會出現爲1的狀況,表示的是鏈接重置。通常地,當出現FIN包或RST包時,咱們便認爲客戶端與服務器端斷開了鏈接;而當出現SYN和SYN+ACK包時,咱們認爲客戶端與服務器創建了一個鏈接。PSH爲1的狀況,通常只出如今 DATA內容不爲0的包中,也就是說PSH爲1表示的是有真正的TCP數據包內容被傳遞。通信
Client --> 置SYN標誌 序列號 = J,確認號 = 0 ----> Server
Client <-- 置SYN標誌 置ACK標誌 序列號 = K, 確認號 = J + 1 <-- Server
Client --> 置PSH標誌,置ACK標誌 序列號 = 55555, 確認號 = 22222,數據包長度 = 11 ---> Server
Client <-- 置ACK標誌,序列號 = 22222, 確認號 = 55566 (=55555 + 11),數據包長度 = 0 <--- Server
Client <-- 置PSH標誌,置ACK標誌 序列號 = 22223, 確認號 = 55566,數據包長度 = 22 <--- Server