TCP三次握手和四次揮手總結

TCP我來了→_→*


1、TCP的連接建立——三次握手


最初兩端的TCP進程都處於CLOSED(關閉)狀態。客戶端主動打開連接,服務器被動打開連接

服務器進程創建傳輸控制塊TCB(Transmission Control Block),然後處於LISTEN(收聽)狀態,準備接受客戶端的連接請求**

客戶端進程也創建傳輸控制塊TCB,向服務器發出連接請求報文段,此報文段中同步位SYN=1,且選擇一個初始序號seq=x。TCP規定,SYN=1的報文段不能攜帶數據,但要消耗一個序號。此時A進入SYN-SENT(同步已發送)狀態。

服務器收到連接請求報文後,如果同意建立連接,則向客戶端發送確認報文段,此報文段中SYN=1,確認位ACK=1,確認號爲ack=x+1,同時選擇一個初始序號seq=y。此報文段也不能攜帶數據,但同樣要消耗一個序號。此時B進入SYN-RCVD(同步收到)狀態。

客戶端收到服務器的確認報文段後,還要向服務器發送確認報文段。此報文段中ACK=1,ack=y+1,seq=x+1。TCP規定ACK報文段可以攜帶數據,但如果不攜帶數據則不消耗序號,所以下一個數據報文段的序號仍是seq=x+1。此時A進入ESTABLISHED(以建立連接)狀態

當服務器收到客戶端的確認後,也進入ESTABLISHED(以建立連接)狀態。

2、爲什麼TCP握手需要三次?

tcp是可靠的傳輸控制協議,三次握手能保證數據可靠傳輸又能提高傳輸效率。

如果tcp的握手是兩次:

《1》如果client向server發送的第一條請求連接報文段由於網絡原因,延遲發送。由於client沒有接收到server對SYN的確認報文段,會重發SYN報文。server回覆ACK,建立連接。數據發送完畢,這條連接正常關閉。這時,延遲的SYN報文發送到server,服務器誤認爲這是client重新發送的同步報文,又回覆了一個ACK,和客戶端建立了連接。

《2》如果server給client發送的ACK報文,由於網絡原因,報文被丟棄,但server認爲已經建立好連接,但是client沒有收到server發來的確認報文,認爲沒有建立好連接。client會重新發送SYN報文,此時server已經處於ESTABLISHED狀態,認爲已經建立好連接。

《3》如果client向server發送了第一條請求連接報文段,但發送過後client由於程序關閉或超時導致直接關閉,但server收到了客戶端發來的請求,並回復ACK報文,建立連接。這樣會浪費服務器的資源。

如果TCP的連接是四次:

1.client給server發送SYN同步報文; 
2.server收到SYN後,給client回覆ACK確認報文; 
3.server給client發送SYN同步報文; 
4.client給server發送ACK確認報文。 
第2.3步之間,server和client沒有任何的數據交互,分開發送相當於多發了一次TCP報文段,SYN和ACK標識只是TCP報頭的一個標識位。很明顯,這兩步可以合併,從而提高連接的速度和效率。


3、TCP連接的關閉———四次揮手


客戶端向服務器發送連接釋放報文段並停止發送數據。此報文段中終止控制位FIN=1,seq=u(等於前面已傳送過的數據的最後一個字節加1)。此時A進入FIN-WAIT-1(終止等待1)狀態。TCP規定,FIN報文段即使不攜帶數據也要消耗一個序號。

服務器收到連接釋放報文段後就發出確認報文段。此報文段中確認號ack=u+1,seq=v(等於前面已傳送過的數據的最後一個字節加1)。此時服務器進入CLOSE-WAIT(關閉等待)狀態。TCP服務器進程通知應用進程,客戶端到服務器的連接釋放了,這時的TCP連接處於半關閉(half-close)狀態,但服務器到客戶端的連接並未關閉,此時服務器發數據,客戶端仍要接收。

客戶端收到服務器的確認後,就進入FIN-WAIT2(終止等待2)狀態,等待服務器發出的連接釋放報文段

如果服務器已沒有要發送的數據,就發送連接釋放報文段。此報文段中FIN=1,seq=w(在半關閉狀態中B可能發送了數據),ack=u+1。此時服務器進入LAST-ACK(最後確認)狀態

客戶端收到了服務器的連接釋放報文段後就發出確認報文段。此報文段中ACK=1,ack=w+1,seq=u+1。此時客戶端進入TIME-WAIT(時間等待)狀態

此時TCP連接還沒有釋放掉,必須經過時間等待計時器(TIME-WAIT timer)設置的2倍的最長報文段壽命MSL(Maximum Segment Lifetime)後,客戶端才進入到CLOSED狀態。MSL建議設爲2分鐘當客戶端撤銷相應的傳輸控制塊TCB後,就結束了這次TCP連接

服務器收到客戶端的確認報文,就進入CLOSED狀態。服務器撤銷相應的傳輸控制塊TCB後,就結束了這次的TCP連接

4、爲什麼要設置TIME_WAIT狀態?

(1)可靠的終止TCP連接。如果客戶端向服務器發送的ACK報文由於網絡原因被丟棄,此時服務器沒有收到客戶端發來的確認報文段就會重傳FIN結束報文段,處於TIME_WAIT狀態的客戶端可以重新對服務器發送ACK確認報文段,釋放連接。

(2)保證讓遲來的TCP報文段有足夠的時間被識別並丟棄。連接結束了,網絡中的延遲報文段也應該被丟棄,經過2MSL後,就可以使本連接持續的時間內所產生的所有報文段都從網絡中消失,避免影響立刻新建立的連接。

5、爲什麼是四次揮手?

TCP協議是全雙工通信,這意味着客戶端和服務器端都可以向彼此發送數據,所以關閉連接是雙方都需要確認的共同行爲。

如果是三次揮手:首先釋放了客戶端到服務器方向的連接,此時TCP連接處於半關閉(Half-Close)狀態,這時客戶端不能向服務器發送數據,而服務器還是可以向客戶端發送數據。如果此時客戶端收到了服務器的確認報文段後,就立即發送一個確認報文段,這會導致服務器向客戶端還在發送數據時連接就被關閉。這樣會導致客戶端沒有完整收到服務器所發的報文段。

6、TCP狀態轉移總圖



粗虛線表示典型的服務器連接的狀態轉移圖

粗實線表示典型的客戶端連接的狀態轉移圖

細線表示異常變遷

7、DOS攻擊 

DOS攻擊利用合理的服務請求佔用過多的服務資源,使正常用戶的請求無法得到相應。

常見的DOS攻擊有計算機網絡帶寬攻擊和連通性攻擊

帶寬攻擊指以極大的通信量衝擊網絡,使得所有可用網絡資源都被消耗殆盡,最後導致合法的用戶請求無法通過。

連通性攻擊指用大量的連接請求衝擊計算機,使得所有可用的操作系統資源都被消耗殆盡,最終計算機無法再處理合法用戶的請求。

SYN洪水攻擊 
SYN
洪水攻擊屬於DOS攻擊的一種,它利用TCP協議缺陷,通過發送大量的半連接請求,耗費CPU和內存資源。

客戶端在短時間內僞造大量不存在的IP地址,向服務器不斷地發送SYN報文,服務器回覆ACK確認報文,並等待客戶的確認,由於源地址是不存在的,服務器需要不斷的重發直至超時,這些僞造的SYN報文被丟棄,目標系統運行緩慢,嚴重者引起網絡堵塞甚至系統癱瘓。

死亡值ping

許多操作系統的TCP/IP協議棧規定ICMP包大小爲64KB,且在對包的標題頭進行讀取之後,要根據該標題頭裏包含的信息來爲有效載荷生成緩衝區。死亡值ping”就是故意產生畸形的測試ping包,聲稱自己的尺寸超過ICMP上限,也就是加載的尺寸超過64KB上限,使未採取保護措施的網絡系統出現內存分配錯誤,導致TCP/IP協議棧崩潰,最終接收方宕機 

 


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