1. 程式人生 > >wireshark分析包中關於三次握手和四次終止標識

wireshark分析包中關於三次握手和四次終止標識

三次握手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包時,會讓它通過(這絕對不是個好主意). 而當狀態型防火牆收到此種包時,它會先在連線表中查詢是否屬於哪個已建連線,否則丟棄該包 

四次握手Four-way Handshake 

四次握手用來關閉已建立的TCP連線 

1. (B) --> ACK/FIN --> (A) 

2. (B) <-- ACK <-- (A) 

3. (B) <-- ACK/FIN <-- (A) 

4. (B) --> ACK --> (A) 

注意: 由於TCP連線是雙向連線, 因此關閉連線需要在兩個方向上做。ACK/FIN 包(ACK 和FIN 標記設為1)通常被認為是FIN(終結)包.然而, 由於連線還沒有關閉, FIN包總是打上ACK標記. 沒有ACK標記而僅有FIN標記的包不是合法的包,並且通常被認為是惡意的 

連線復位Resetting a connection 

四次握手不是關閉TCP連線的唯一方法. 有時,如果主機需要儘快關閉連線(或連線超時,埠或主機不可達),RST (Reset)包將被髮送. 注意在,由於RST包不是TCP連線中的必須部分, 可以只發送RST包(即不帶ACK標記). 但在正常的TCP連線中RST包可以帶ACK確認標記,請注意RST包是可以不要收到方確認的? 

無效的TCP標記Invalid TCP Flags 

到目前為止,你已經看到了 SYN, ACK, FIN, 和RST 標記. 另外,還有PSH (Push) 和URG (Urgent)標記. 

最常見的非法組合是SYN/FIN 包. 注意:由於 SYN包是用來初始化連線的, 它不可能和 FIN和RST標記一起出現. 這也是一個惡意攻擊. 

由於現在大多數防火牆已知 SYN/FIN 包, 別的一些組合,例如SYN/FIN/PSH, SYN/FIN/RST, SYN/FIN/RST/PSH。很明顯,當網路中出現這種包時,很你的網路肯定受到攻擊了。 

別的已知的非法包有FIN (無ACK標記)和"NULL"包。如同早先討論的,由於ACK/FIN包的出現是為了關閉一個TCP連線,那麼正常的FIN包總是帶有 ACK 標記。"NULL"包就是沒有任何TCP標記的包(URG,ACK,PSH,RST,SYN,FIN都為0)。 

到目前為止,正常的網路活動下,TCP協議棧不可能產生帶有上面提到的任何一種標記組合的TCP包。當你發現這些不正常的包時,肯定有人對你的網路不懷好意。