1. 程式人生 > 實用技巧 >TCP:三次握手:URG、ACK、PSH、RST、SYN、FIN 分別代表什麼

TCP:三次握手:URG、ACK、PSH、RST、SYN、FIN 分別代表什麼

建立連線:

fin.k.l_tcp四次揮手 fin ack_tcp fin

關閉連線:

tcp fin_fin.k.l_tcp四次揮手 fin ack

一、三次握手Three-way Handshake

TCP(Transmission Control Protocol)傳輸控制協議

TCP是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立一個連線:

位碼即tcp標誌位,有6種標示:SYN(synchronous建立聯機) ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急)Sequence number(順序號碼) Acknowledge number(確認號碼)

第一次握手:主機A傳送位碼為syn=1,隨機產生seq number=1234567的資料包到伺服器,主機B由SYN=1知道,A要求建立聯機;

第二次握手:主機B收到請求後要確認聯機資訊,向A傳送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包;

第三次握手:主機A收到後檢查ack number是否正確,即第一次傳送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到後確認seq值與ack=1則連線建立成功。

完成三次握手,主機A與主機B開始傳送資料。

在TCP/IP協議中,TCP協議提供可靠的連線服務,採用三次握手建立一個連線。 第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認; 第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;

第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。完成三次握手,客戶端與伺服器開始傳送資料.

二、一個虛擬連線的建立是通過三次握手來實現的

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資料包內容被傳遞。