TCP三次握手/四次揮手詳解

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

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

二,三次握手過程

        第一次握手:主機A發送位碼爲SYN=1,隨機產生seq =X 的數據包到服務器,主機B由SYN=1知道,A要求建立聯機。(A處於SYN - SENT,B處於LISTEN)

                       

        第二次握手:主機B收到請求(根據SYN=1)後要確認聯機信息,向A發送ack =(X+1),SYN=1,ACK=1,隨機產生seq=Y的包 。(B處於SYN -- RECEIVED)

                      

        第三次握手:主機A收到後檢查ack是否正確,即第一次發送的seq+1,以及位碼ACK是否爲1,若正確,主機A會再發送ack =(Y+1),ACK=1,主機B收到後確認seq值與ack=1則連接建立成功。(記住此時SYN!=1)  (A發送完ESTABLISHED,B接受到爲ESTABLISHED)

                     

        完成三次握手,主機A與主機B開始傳送數據。一個完整的三次握手也就是 請求---應答---再次確認

三,四次揮手:

        由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。

        收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。

      (1)客戶端A發送一個FIN=1,用來關閉客戶A到服務器B的數據傳送。  (此時A處於FIN - WAIT-1,等待B的FIN=1)

      (2)服務器B收到這個FIN=1,它發回一個ACK=1,確認序號:X+1。   (此時B處於CLOSE - WAIT-1)

      (3)服務器B發送完數據,發送一個FIN=1給客戶端A。                            (此時B處於LAST - ACK,A處於FIN - WAIT-2)

      (4)客戶端A發回ACK=1報文確認,並將確認序號設置爲收到序號加1   (此時A處於TIME - WAIT,B處於CLOSEED)


四,問題彙總

        1.爲什麼建立連接協議是三次握手,而關閉連接卻是四次握手呢?

              這是因爲服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個報文裏來發送。

              但關閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送,未必所有的數據都全部發送給對方,所以你可以未必會馬上會關閉SOCKET,也即你可能還需要發送一些數據給對方之後,再發送FIN報文給對方來表示你同意現在可以關閉連接了,所以它這裏的ACK報文和FIN報文多數情況下都是分開發送的。

         2.爲什麼TIME_WAIT狀態還需要等2MSL後才能返回到CLOSED狀態?

               這是因爲雖然雙方都同意關閉連接了,而且握手的4個報文也都協調和發送完畢,按理可以直接回到CLOSED狀態(就好比從SYN_SEND狀態到ESTABLISH狀態那樣);

               但是因爲我們必須要假想網絡是不可靠的,你無法保證你最後發送的ACK報文會一定被對方收到,因此對方處於LAST_ACK狀態下的SOCKET可能會因爲超時未收到ACK報文,而重發FIN報文,所以這個TIME_WAIT狀態的作用就是用來重發可能丟失的ACK報文

         3.   什麼是2MSL

               MSL是Maximum Segment Lifetime,譯爲“報文最大生存時間”,他是任何報文在網絡上存在的最長時間,超過這個時間報文將被丟棄。

               因爲TCP報文(segment)是IP數據報(datagram)的數據部分,而IP頭中有一個TTL域,TTL是time to live的縮寫,中文可以譯爲“生存時間”,這個生存時間是由源主機設置初始值但不是存的具體時間,而是存儲了一個IP數據報可以經過的最大路由數,每經過一個處理他的路由器此值就減1,當此值爲0則數據報將被丟棄,同時發送ICMP報文通知源主機。

               RFC 793中規定MSL爲2分鐘,實際應用中常用的是30秒,1分鐘和2分鐘等

               2MSL即兩倍的MSL,TCP的TIME_WAIT狀態也稱爲2MSL等待狀態,當TCP的一端發起主動關閉,在發出最後一個ACK包後,即第3次握手完成後發送了第四次握手的ACK包後就進入了TIME_WAIT狀態,必須在此狀態上停留兩倍的MSL時間。

              等待2MSL時間主要目的是怕最後一個ACK包對方沒收到,那麼對方在超時後將重發第三次握手的FIN包,主動關閉端接到重發的FIN包後可以再發一個ACK應答包。

             在TIME_WAIT狀態時兩端的端口不能使用,要等到2MSL時間結束纔可繼續使用。

             當連接處於2MSL等待階段時任何遲到的報文段都將被丟棄。不過在實際應用中可以通過設置SO_REUSEADDR選項達到不必等待2MSL時間結束再使用此端口。

             TTL與MSL是有關係的但不是簡單的相等的關係,MSL要大於等於TTL。

          4   SYN攻擊

               在三次握手過程中,服務器【發送SYN-ACK之後,收到客戶端的ACK之前】的TCP連接稱爲半連接(half-open connect)。此時服務器處於SYN_RECV狀態

                                                   當收到ACK後,服務器轉入ESTABLISHED狀態.

              SYN攻擊就是:攻擊客戶端在短時間內僞造大量不存在的IP地址,向服務器不斷地發送SYN包,服務器回覆ACK確認包,並等待客戶的確認從而建立連接。

                                          由於源地址是不存在的,不會再發送ACK確認包,所以服務器需要不斷的重發直至超時,這些僞造的SYN包將長時間佔用未連接隊列,正常的SYN請求被丟棄,目標系統運行緩慢,嚴重者引起網絡堵塞甚至系統癱瘓。

              SYN攻擊是一個典型的DDOS攻擊。檢測SYN攻擊非常的方便,當你在服務器上看到大量的半連接狀態時,特別是源IP地址是隨機的,基本上可以斷定這是一次SYN攻擊.在Linux下可以如下命令檢測是否被Syn攻擊

              netstat  -n  -p  TCP | grep SYN_RECV

               一般較新的TCP/IP協議棧都對這一過程進行修正來防範Syn攻擊,修改tcp協議實現。主要方法有SynAttackProtect保護機制、SYN cookies技術、增加最大半連接和縮短超時時間等。但是不能完全防範syn攻擊。

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