TCP:三次握手,URG、ACK、PSH、RST、SYN、FIN 含義

TCP:SYN ACK FIN RST PSH URG簡析
 
三次握手Three-way Handshake 
 
一個虛擬連接的建立是通過三次握手來實現的 
1. (B) --> [SYN] --> (A) 
 
假如服務器A和客戶機B通訊. 當A要和B通信時,B首先向A發一個SYN (Synchronize) 標記的包,告訴A請求建立連接. 
 
注意: 一個 SYN包就是僅SYN標記設爲1的TCP包(參見TCP包頭Resources). 認識到這點很重要,只有當A受到B發來的SYN包,纔可建立連接,除此之外別無他法。因此,如果你的防火牆丟棄所有的發往外網接口的SYN包,那麼你將不 能讓外部任何主機主動建立連接。


2. (B) <-- [SYN/ACK] <--(A) 
 
接着,A收到後會發一個對SYN包的確認包(SYN/ACK)回去,表示對第一個SYN包的確認,並繼續握手操作. 
 
注意: SYN/ACK包是僅SYN 和 ACK 標記爲1的包.

3. (B) --> [ACK] --> (A) 
 
B收到SYN/ACK 包,B發一個確認包(ACK),通知A連接已建立。至此,三次握手完成,一個TCP連接完成 
 
Note: ACK包就是僅ACK 標記設爲1的TCP包. 需要注意的是當三此握手完成、連接建立以後,TCP連接的每個包都會設置ACK位


這就是爲何連接跟蹤很重要的原因了. 沒有連接跟蹤,防火牆將無法判斷收到的ACK包是否屬於一個已經建立的連接.一般的包過濾(Ipchains)收到ACK包時,會讓它通過(這絕對不是個 好主意). 而當狀態型防火牆收到此種包時,它會先在連接表中查找是否屬於哪個已建連接,否則丟棄該包 


在TCP層,有個FLAGS字段,這個字段有以下幾個標識:SYN, FIN, ACK, PSH, RST, URG.
其中,對於我們日常的分析有用的就是前面的五個字段。

它們的含義是:

URG:Urget pointer is valid (緊急指針字段值有效)

SYN: 表示建立連接

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數據包內容被傳遞。


四次揮手

由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
TCP協議的連接是全雙工連接,一個TCP連接存在雙向的讀寫通道。 
簡單說來是 “先關讀,後關寫”,一共需要四個階段。以客戶機發起關閉連接爲例:
1.服務器讀通道關閉
2.客戶機寫通道關閉
3.客戶機讀通道關閉
4.服務器寫通道關閉
關閉行爲是在發起方數據發送完畢之後,給對方發出一個FIN(finish)數據段。直到接收到對方發送的FIN,且對方收到了接收確認ACK之後,雙方的數據通信完全結束,過程中每次接收都需要返回確認數據段ACK。
詳細過程:
    第一階段   客戶機發送完數據之後,向服務器發送一個FIN數據段,序列號爲i;
    1.服務器收到FIN(i)後,返回確認段ACK,序列號爲i+1,關閉服務器讀通道;
    2.客戶機收到ACK(i+1)後,關閉客戶機寫通道;
   (此時,客戶機仍能通過讀通道讀取服務器的數據,服務器仍能通過寫通道寫數據)
    第二階段 服務器發送完數據之後,向客戶機發送一個FIN數據段,序列號爲j;
    3.客戶機收到FIN(j)後,返回確認段ACK,序列號爲j+1,關閉客戶機讀通道;
    4.服務器收到ACK(j+1)後,關閉服務器寫通道。
這是標準的TCP關閉兩個階段,服務器和客戶機都可以發起關閉,完全對稱。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章