Java | TCP的三次握手&四次揮手

TCP數據在傳輸之前會建立連接需要進行3次溝通,一般被稱爲"三次握手";在數據傳輸完成斷開連接得時候要進行4次溝通,一般稱爲"四次揮手"

再來看下TCP報頭中得6個標誌比特,也就是控制位6位,它們中得多個可以被同時設置爲1,如下:

 

控制位 說    明
URG 1:緊急指針有效;  0:忽略緊急指針得值;
ACK 1:確認號有效;      0:表示在報文中不包含確認消息,忽略確認號字段;

PSH

1:帶有PUSH標誌的數據,指示接收方應該儘快將這個報文段交給應用層,而不用等待緩衝區裝滿;
RST 用於復位錯誤的連接或拒絕非法的報文段;如果收到RST=1,一定發生了異常;
SYN 同步序號,1:表示連接請求,用於建立連接和順序號同步  (Synchronize)
FIN 用於釋放連接,爲1時表示發送方已經沒有數據要發送了, 即關閉本方數據流。

TCP中三次握手:

TCP是因特網的傳輸層協議,使用三次握手協議建立連接。在客戶端主動發出SYN連接請求後,等待對方回答SYN+ACK ,兵最終對對方的SYN執行ACK確認。詳細過程如下:

1、客戶端發送SYN(seq=x)報文給服務器端,進入SYN_SEND狀態;

2、服務器端收到SYN報文,慧穎一個SYN(seq=y) 和 ACK(ack=x+1)報文,進入SYN_RECY狀態;

3、客戶端收到服務器端的SYN報文,迴應一個ACK(ack=y+1)報文,進入Established狀態;

三次握手完成後,TCP客戶端和服務端成功建立連接,開始傳輸數據,具體過程如下圖所示:


TCP在斷開連接時要進行四次揮手,這是由於TCP的半關閉所造成的,因爲TCP是全雙工的,即數據可在兩個方向上同時傳遞,所以在進行關閉時需要對每個方向都要單獨進行關閉,這種單方向的關閉叫做半關閉,在一方完成它的數據發送任務時,就發送一個FIN控制位來向另一方通知將要終止這個方向的連接。

TCP四次揮手過程如下:

1、客戶端應用進程調用斷開連接的請求,向服務器端發送一個終止標誌位FIN=1,seq=u的消息,表示在客戶端關閉鏈路前要發送的數據已經完全發送完畢,可以開始關閉鏈路操作,並請求服務端確認關閉客戶端到服務器的鏈路操作。此時客戶端處於FIN-WAIT-1狀態;

2、服務器端在收到這個FIN消息後返回一個ACK=1,ack=u+1,seq=v的消息給客戶端,表示接收到客戶端斷開鏈路的操作請求,這時候TCP服務器端進程需要通知高層應用進程釋放客戶端到服務端的鏈路,服務器處於CLOSE-WAIT狀態,即半關閉狀態。客戶端收到返回的消息後處於FIN-WAIT-2狀態;

3、服務器端將關閉鏈路前需要發送給客戶端的消息發送給客戶端,在等待該數據發送完成後, 發送一個終止標誌位FIN=1,seq=w,ack=u+1的消息給客戶端,表示關閉鏈路前服務器需要向客戶端發送的消息已經全部發送完畢,請求客戶端確認關閉服務器到客戶端的鏈路操作,此時服務器端處於LAST-ACK裝填,等待客戶端最終斷開鏈路;

4、客戶端在接受到最終FIN消息後,發送一個ACK=1,seq=u+1,ack=w+1的消息給服務器端,表示接收到服務器端的斷開連接請求兵準備斷開服務器端到客戶端的鏈路。此時客戶端處於TIME-WAIT狀態,TCP連接並沒有完全釋放,還需要經過等待計時器設置的時間後,客戶端才進入CLOSE狀態。

整個四次揮手過程如下圖所示:


    主機 A 發送 FIN 後,進入終止等待狀態, 服務器 B 收到主機 A 連接釋放報文段後,就立即給主機 A 發送確認,然後服務器 B 就進入 close-wait 狀態,此時 TCP 服務器進程就通知高層應用進程,因而從 A 到 B 的連接就釋放了。此時是“半關閉”狀態。即 A 不可以發送給B,但是 B 可以發送給 A。此時,若 B 沒有數據報要發送給 A 了,其應用進程就通知 TCP 釋放連接,然後發送給 A 連接釋放報文段,並等待確認。A 發送確認後,進入 time-wait,注意,此時 TCP 連接還沒有釋放掉,然後經過時間等待計時器設置的 2MSL 後,A 才進入到close 狀態。

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