TCP三次握手與四次揮手(TCP報文)

TCP三次握手

  • 握手流程

    第一次握手:客戶端(client)發送數據包(syn=1,隨機序列號seq)到服務器,並進入SYN_SEND狀態,等待服務器(server)確認(目的:確保服務端接收功能正常)
    第二次握手:服務器收到報文並根據標誌(ACK=1,SYN=1)確認客戶端是否準備好,確認後發送報文(SYN=1,ACK=1,ack=client.seq+1,隨機序列號sql),此時服務器進入SYN_RECV狀態(目的:客戶端確認服務器能正常接收發送)
    第三次握手:客戶端收到服務器的報文,確認接收到的ack是否爲第一次發的seq+1及ACK是否標誌爲1,確認後向服務器發送報文(ack=server.seq+1,ACK=1),服務端收到報文確認seq與ack正確後和客戶端進入ESTABLISHED(TCP連接成功)狀態,完成三次握手建立起TCP連接
  • 標誌

    • ack:等待接收的數據包的序列號
    • SYN(Synchronize Sequence Numbers):同步序列號,連接建立時使用同步序列號
    • seq:當前報文段數據的第一個字節的序號
      %E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B.png

四次揮手

四次揮手(Four-Way Wavehand)即終止TCP連接,斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開。
  • 第一次揮手:Client發送FIN報文(FIN=1,seq=x),標識Client已無數據需要發送,關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態
  • 第二次揮手:Server收到Client報文後,發送一個ACK報文(ACK=1,FIN=1,ack=x+1,seq=y)給Client,Server進入CLOSE_WAIT狀態,不再接收Client的數據
  • 第三次揮手:Server發送一個FIN報文(FIN=1,ack=x+1,seq=z),表示已無需要發送給Client的數據,關閉Server到Client的數據傳送,Server進入LAST_ACK狀態
  • 第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接着發送一個ACK報文(FIN=1,ack=z+1,seq=h)給Server,Server進入CLOSED狀態
    tcp%E6%8A%A5%E6%96%87.png

爲什麼建立連接協議是三次握手,而關閉連接卻是四次握手呢?

  • 當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接,但收到一個FIN只意味着這一方向上沒有數據流動,另一個方向仍能發送數據,一個TCP連接在收到一個FIN後仍能發送數據
  • 第二次揮手服務端只表示收到了客戶端的FIN報文,但服務端可能還有數據需要發送給客戶端,只有在數據發送完後服務端纔會發送FIN報文給客戶端,客戶端收到FIN報文後才發送ACK給服務端使客戶端關閉

TCP報文詳解

TCP報文是TCP層傳輸的數據單元,也叫報文段,其數據格式如下:
tcp%E6%8A%A5%E6%96%87.png

  • 源端口號:數據發送方的端口
  • 目的端口:數據接收方的端口
  • 序列號seq:標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記
  • 確認號ack:ACK標誌位爲1時,確認序號字段纔有效,ack=seq+1
  • 首部長度/數據偏移:TCP報文段的數據起始處距離TCP報文段的起始處有多遠。
    TCP首部可能含可選項內容,固TCP報頭的長度是不確定的,當不包含任選字段時首部長度爲20字節。“首部長度”的單位是32位字(4字節),4位首部長度最大值1111的十進制爲15,故報頭的最大長度爲15*4=60字節
  • 保留:爲將來用途保留,一般爲0
  • 標誌位
    • URG: 緊急指針標誌是否有效
    • ACK:確認標誌,在連接建立後所有傳送的報文段。當ACK=1時,確認號纔有效
    • PSH:PUSH操作標誌位,表是否直接將接收到的數據包立即發送給應用程序,而不是在緩衝區中排隊
    • RST(reset):重置連接標誌
    • SYN:在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文段(client向server發起請求)。對方若同意建立連接,則應在響應的報文段中使SYN=1和ACK=1(server接收client請求並響應)。
    • FIN:結束標誌,表示發送方數據是否已發送完畢
  • 窗口:告知發送方(server)接收端(client)的緩存大小以控制發送端發送數據的速率,範圍值爲[0,2^16=65536]
    • 校驗和:奇偶校驗,此校驗和是對整個的 TCP 報文段,包括 TCP 頭部和 TCP 數據,以 16 位字進行計算所得。由發送端計算和存儲,並由接收端進行驗證
  • 緊急指針:只有當 URG 標誌置 1 時緊急指針纔有效。指本報文段中的緊急數據的字節數(緊急數據結束後就是普通數據)。當所有緊急數據都處理完時,TCP就告訴應用程序恢復到正常操作。窗口爲0時也可發送緊急數據。
  • 選項:可變的可選信息,最多包涵40字節。
  • 數據:TCP 報文段中的數據部分是可選的。在一個連接建立和一個連接終止時,雙方交換的報文段僅有 TCP 首部。如果一方沒有數據要發送,也使用沒有任何數據的首部來確認收到的數據。在處理超時的許多情況中,也會發送不帶任何數據的報文段。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章