TCP---三次握手,四次揮手過程理解

1.TCP簡介:

  • 傳輸控制協議(TCP,Transmission Control Protocol)是爲了在不可靠的互聯網絡上提供可靠的端到端字節流而專門設計的一個傳輸協議。
  • 是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。

2.TCP的特點:

  • 1.面向連接:
    • 通信雙方必須先建立好連接才能進行數據的傳輸,數據傳輸完成後,雙方必須斷開此連接,以釋放系統資源。
  • 2.可靠傳輸:
    • TCP 採用發送應答機制
    • 超時重傳
    • 錯誤校驗
    • 流量控制和阻塞管理

3.TCP報文首部

1.源端口和目的端口,各佔2個字節,分別寫入源端口和目的端口;
2.序號,佔4個字節,TCP連接中傳送的字節流中的每個字節都按順序編號。例如,一段報文的序號字段值是 301 ,而攜帶的數據共有100字段,顯然下一個報文段(如果還有的話)的數據序號應該從401開始;
3.確認號,佔4個字節,是期望收到對方下一個報文的第一個數據字節的序號。例如,B收到了A發送過來的報文,其序列號字段是501,而數據長度是200字節,這表明B正確的收到了A發送的到序號700爲止的數據。因此,B期望收到A的下一個數據序號是701,於是B在發送給A的確認報文段中把確認號置爲701;
4.保留,佔6位,保留今後使用,但目前應都位0;
5.確認ACK,僅當ACK=1時,確認號字段纔有效。TCP規定,在連接建立後所有報文的傳輸都必須把ACK置1;
6.推送PSH,當兩個應用進程進行交互式通信時,有時在一端的應用進程希望在鍵入一個命令後立即就能收到對方的響應,這時候就將PSH=1;
7.復位RST,當RST=1,表明TCP連接中出現嚴重差錯,必須釋放連接,然後再重新建立連接;
8.同步SYN,在連接建立時用來同步序號。當SYN=1,ACK=0,表明是連接請求報文,若同意連接,則響應報文中應該使SYN=1,ACK=1;
9.終止FIN,用來釋放連接。當FIN=1,表明此報文的發送方的數據已經發送完畢,並且要求釋放;

4.三次握手:

  • TCP建立連接的過程叫做握手,握手需要在客戶和服務器之間交換三個TCP報文段。
    在這裏插入圖片描述
  • 解釋過程:
    • 一開始,客戶端和服務器都處於關閉狀態,客戶端A主動打開請求連接,而服務器B在沒有接受到連接請求之前,被動打開並且監聽請求。
    • 第一次握手: 此時的客戶端A開始第一次請求連接,並且攜帶着SYN=1,seq=x。此時的客戶端A進入進入SYN-SENT(同步已發送)狀態。SYN是TCP首部的同步位,用於同步序號。SYN=1表示這個請求是連接請求或者連接接受請求。seq是一個序列號,由於當TCP傳輸時,是基於字節流的傳輸,所以TCP會給每個數據字節編上序號,第一個字節的序號由本地隨機產生。當數據字節都有序號之後,就會給每個報文段一個序號。seq序列號就是這個報文段的第一個字節的序號。
    • 第二次握手: 當服務器B接收到客戶端A的請求時,給客戶端A發送SYN=1,ACK=1,seq=y,ack=x+1,此時服務器B進入SYN-RCVD(同步已接收)狀態。ACK是確認,一般置1,若置0,則代表報文無效。ack代表是確認號,ack=x+1,是期望收到對方下一個報文段的第一個數據字節的序號,是對客戶端發來的seq進行加1。seq=y,是服務端自己生成的序列號。由於SYN不攜帶報文數據,所以會消耗一個序號。
    • 第三次握手: 當客戶端接收到服務器發送的數據,需要進行確認。此時客戶端會查看ACK是否爲1,ack是否是自己發送x+1。若都正確,則會把服務端發來的y+1,然後放入ack中,把x+1放入seq中,因爲這是服務器期望的報文段的第一個數據字節的序號。發送ACK=1,seq=x+1,ack=y+1之後,客戶端進入ESTAB-LISHED(已經建立連接)狀態,當服務端接收到確認之後,也進入ESTAB-LISHED(已經建立連接)狀態。此時ACK可以攜帶報文數據,不攜帶數據不消耗序號。

5.四次揮手:

在這裏插入圖片描述

  • 第一次揮手: 此時的客戶端A和服務端B都是ESTAB-LISHED(已經連接狀態),此時的客戶端A主動關閉連接,向服務器B發送了一個FIN=1,seq=u,此時客戶端進入FIN-WAIT-1(結束等待1)狀態。FIN是終止連接,當FIN=1是,表示發送方的數據都已經發送完畢,請求釋放連接。FIN不攜帶報文數據,但是要消耗一個序號。
  • 第二次揮手: 服務端B接收到請求後,向客戶端A發送確認,ACK=1,seq=v,ack=u+1,服務端進入CLOSE-WAIT(關閉等待狀態)。ack=u+1是對客戶端的seq=u的確認。客戶端A接收到服務端的請求後,進入FIN-WAIT-2(結束等待2)狀態。等待服務端B其他數據的傳送。
  • 第三次揮手: 若服務端B沒有可發送的數據,那麼就發送FIN=1,ACK=1,seq=w,ack=u+1,進入LAST-ACK(最後確認狀態),這時B需要重複發送確認ACK=1。
  • 第四次揮手: 客戶端A接收到請求之後,發送確認報文,ACK=1,seq=u+1,ack=w+1,此時客戶端A進入TIME-WAIT(等待狀態),此時並不是馬上斷開TCP連接,而是必須經過時間等待計時器設置的時間2MSL後,客戶端A才能進入CLOSE (關閉狀態)。MSL(maximum segment lifetime)是最長報文段壽命。

6.這些僅僅是TCP連接和斷開過程,沒有深入到底層研究,以下問題有待今後解決。

  • 比如爲什麼是三次握手不是二次握手?
  • 爲什麼必須是四次揮手?
  • 爲什麼客戶端不是直接斷開而需要等待2MSL?
發佈了9 篇原創文章 · 獲贊 3 · 訪問量 618
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章