一次正常的TCP/IP會話的過程

由於TCP是面向連接的協議,面向有連接是指在數據通信開始之前先做好兩端之間的準備工作。

1、所以在雙方正式傳輸數據之前,需要用“三次握手”來建立一個穩重的連接。所謂三次握手是指建立一個 TCP 連接時需要客戶端和服務器端總共發送三個包以確認連接的建立。

  • 第一次握手:客戶端將標誌位SYN置爲1,隨機產生一個值seq=J,並將該數據包發送給服務器端,客戶端進入SYN_SENT狀態,等待服務器端確認。
  • 第二次握手:服務器端收到數據包後由標誌位SYN=1知道客戶端請求建立連接,服務器端將標誌位SYN和ACK都置爲1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給客戶端以確認連接請求,服務器端進入SYN_RCVD狀態。
  • 第三次握手:客戶端收到確認後,檢查ack是否爲J+1,ACK是否爲1,如果正確則將標誌位ACK置爲1,ack=K+1,並將該數據包發送給服務器端,服務器端檢查ack是否爲K+1,ACK是否爲1,如果正確則連接建立成功,客戶端和服務器端進入ESTABLISHED狀態,完成三次握手,隨後客戶端與服務器端之間可以開始傳輸數據了。

 

下面來看看三次握手的流程圖:

太厲害了,終於有人能把TCP/IP 協議講的明明白白了

2、四次揮手即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開。

  • 中斷連接端可以是客戶端,也可以是服務器端。
  • ***次揮手:客戶端發送一個FIN=M,用來關閉客戶端到服務器端的數據傳送,客戶端進入FIN_WAIT_1狀態。意思是說"我客戶端沒有數據要發給你了",但是如果你服務器端還有數據沒有發送完成,則不必急着關閉連接,可以繼續發送數據。
  • 第二次揮手:服務器端收到FIN後,先發送ack=M+1,告訴客戶端,你的請求我收到了,但是我還沒準備好,請繼續你等我的消息。這個時候客戶端就進入FIN_WAIT_2 狀態,繼續等待服務器端的FIN報文。
  • 第三次揮手:當服務器端確定數據已發送完成,則向客戶端發送FIN=N報文,告訴客戶端,好了,我這邊數據發完了,準備好關閉連接了。服務器端進入LAST_ACK狀態。
  • 第四次揮手:客戶端收到FIN=N報文後,就知道可以關閉連接了,但是他還是不相信網絡,怕服務器端不知道要關閉,所以發送ack=N+1後進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。服務器端收到ACK後,就知道可以斷開連接了。客戶端等待了2MSL後依然沒有收到回覆,則證明服務器端已正常關閉,那好,我客戶端也可以關閉連接了。最終完成了四次握手。

下面來看看四次揮手的流程圖:

太厲害了,終於有人能把TCP/IP 協議講的明明白白了

上面是一方主動關閉,另一方被動關閉的情況,實際中還會出現同時發起主動關閉的情況。

具體流程如下圖:

太厲害了,終於有人能把TCP/IP 協議講的明明白白了

 

 更具體可參考:https://developer.51cto.com/art/201906/597961.htm

1、OSI參考模型(開放系統互連參考模型 )
網絡七層協議

2、TCP/IP參考模型(簡化的七層OSI模型)
網絡四層協議:網絡訪問層、網際互聯層、傳輸層(主機到主機)、和應用層。

 

 

 


 

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