TCP三次握手及四次斷開過程

TCP報文

TCP三次握手及四次斷開過程

TCP報文

  • 源端口號:發送TCP進程對應的端口號
  • 目標端口號:目標端接收進程的端口號
  • 序列號:數據段標記,用於對到達目的端數據包的重組
  • 確認號:對發送端的信息確認,告訴發送端這個序號之前的數據段都收到了
  • 保留位:保留今後使用,但目前都為0
  • URG:與16位緊急指針配合使用,為1時表明緊急指針字段有效
  • ACK:確認序列號有效位,表明該數據包包含確認信息,在連接建立後所有報文的傳輸都必須把ACK置1
  • PSH:通知接收端立即將數據提交給用戶進程,不在緩存中停留
  • RST:為1時,請求重新建立TCP鏈接
  • SYN:在連接建立時用來同步序號,為1時請求建立鏈接
  • FIN:請求斷開鏈接,為1時數據發送完畢
  • 窗口大小:通知接收方,發送本報文你需要有多大的空間來接受
  • 檢驗和:佔2字節,校驗首部和數據兩部分

TCP鏈接的建立

TCP三次握手及四次斷開過程

TCP三次握手過程

最開始的時候客戶端和服務器都是處於CLOSED狀態。

主動打開連接的為客戶端,被動打開連接的是服務器

  • TCP服務器進程先創建傳輸控制塊TCB,時刻準備接受客戶進程的連接請求,此時服務器就進入了LISTEN(監聽)狀態;
  • TCP客戶端進程也是先創建傳輸控制塊TCB,然後向服務器發出連接請求報文,這時報文首部中的同部位SYN=1,同時選擇一個初始序列號 seq=x ,此時,TCP客戶端進程進入了 SYN-SENT(同步已發送狀態)狀態。
  • TCP服務器收到請求報文後,如果同意連接,則發出確認報文。確認報文中應該 ACK=1,SYN=1,確認號是ack=x+1,同時也要為自己初始化一個序列號 seq=y,此時,TCP服務器進程進入了SYN-RCVD(同步收到)狀態。
  • TCP客戶進程收到確認後,還要向服務器給出確認。確認報文的ACK=1,ack=y+1,自己的序列號seq=x+1,此時,TCP連接建立,客戶端進入ESTABLISHED(已建立連接)狀態。TCP規定,ACK報文段可以攜帶數據,但是如果不攜帶數據則不消耗序號。
  • 當服務器收到客戶端的確認後也進入ESTABLISHED狀態,此後雙方就可以開始通信了。

TCP連接的釋放

TCP三次握手及四次斷開過程

TCP四次揮手過程

  • 客戶端進程發出連接釋放報文,並且停止發送數據。FIN=1,其序列號為seq=u,此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。
  • 服務器收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,並且帶上自己的序列號seq=v,此時,服務端就進入了CLOSE-WAIT-1狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有數據要發送了,但是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。
  • 客戶端收到服務器的確認請求後,此時,客戶端就進入FIN-WAIT-2狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最後的數據)。
  • 服務器將最後的數據發送完畢後,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由於在半關閉狀態,服務器很可能又發送了一些數據,假定此時的序列號為seq=w,此時,服務器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。
  • 客戶端收到服務器的連接釋放報文後,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP連接還沒有釋放,必須經過2MSL(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。
  • 服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB後,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。

TCP的應用

TCP三次握手及四次斷開過程

基於TCP的應用層協議


分享到:


相關文章: