1. 程式人生 > >Tcp協議中的3次握手與4次揮手過程分析

Tcp協議中的3次握手與4次揮手過程分析

轉載https://blog.csdn.net/u012824097/article/details/52490091

客戶端與服務端的通訊中步驟

  • 1建立Tcp連線
    • 3次握手
  • 2再進行資料傳輸
  • 3資料傳輸完成後,斷開連線。
    • 4次揮手

 

建立Tcp連線

1 Client ---> Server:(員工:老闆看到我發的訊息沒)

設定SYN=1,seq=J,並將該資料包和SYN請求訊號傳送給Server,Client進入syn_sent(傳送)狀態,等待Server確認。

2Server --->Client :(老闆:看到了,你確定下看到我訊息沒)

接收資料包後,設定SYN=1,ACK=1,ack=J+1 ,seq=K,傳送給Client,表示確認收到了Client的請求,Server進入syn_rcvd(已收到)狀態;

3 Client---> Server:(員工:我也收到你的回覆的,你看下收到我的回覆了沒,收到說明我們通訊連線成功了)

Client:檢查是否 ACK=1 && ack=J+1,如果是則設定ACK=1,ack=K+1,並將資料包傳送給Server;

Server:檢查ack是否為K+1,ACK是否為1,如果正確則連線建立成功,Client和Server進入established(確認)狀態,三次握手完成,

 

 

注意

半連線

在三次握手過程中,Server傳送SYN+ACK之後,收到Client的ACK之前的TCP連線稱為半連線(half-open connect)

SYN攻擊

在三次握手過程中,Server傳送SYN-ACK之後,收到Client的ACK之前的TCP連線稱為半連線(half-open connect),此時Server處於SYN_RCVD狀態,當收到ACK後,Server轉入ESTABLISHED狀態。SYN攻擊就是Client在短時間內偽造大量不存在的IP地址,並向Server不斷地傳送SYN包,Server回覆確認包,並等待Client的確認,由於源地址是不存在的,因此,Server需要不斷重發直至超時,這些偽造的SYN包將產時間佔用未連線佇列,導致正常的SYN請求因為佇列滿而被丟棄,從而引起網路堵塞甚至系統癱瘓。SYN攻擊時一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當Server上有大量半連線狀態且源IP地址是隨機的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現行:

 

 

 

斷開連線:

 

Client傳送一個FIN,用來關閉Client到Server的資料傳送,Client進入FIN_WAIT_1狀態。

1 Client---> Server(資料傳送完了,關閉連線吧)

Client傳送一個FIN,表示Client要傳送的資料已經發送完成,請求結束連線,Client進入fin_wait_1狀態;

2 Server---> Client(收到你的資訊,請確定你也收到我的資訊)

Server收到Client的FIN後,會向Client傳送一個ACK,表示收到了Client的FIN請求,確認序號為收到序號(A)+1(即ack=A+1),Server進入close_wait狀態(此時Server可能沒有完成向Client的資料傳輸);

3 Server---> Client(收到你的資訊,我的資訊已傳送完畢,請確定收到我的資訊)

 當Server完成向Client的資料傳輸後,向Client傳送一個FIN ,,表示Server已經完成傳送,Client可以斷開連線,Server進入last_ack狀態;

4 Client---> Server(收到你的資訊,我過一定就關閉了,你也關閉吧)

 Client:接收到Server的FIN後,Client進入time_wait狀態,並向Server傳送一個ACK,確認序號為收到序號(C)+1(ack=C+1)

Server:檢查客戶端資訊正確,Server進入closed狀態,Client斷開連線,Server關閉連線,四次揮手完成。

 

 

注意

在time_wait狀態中,如果TCP client端最後一次傳送的ACK丟失了,它將重新發送。TIME_WAIT狀態中所需要的時間是依賴於實現方法的。典型的值為30秒、1分鐘和2分鐘。等待之後連線正式關閉,並且所有的資源(包括埠號)都被釋放。