看圖理解TCP的三次握手和四次揮手

閱讀時間:8min 閱讀目標:服務器

  1. 掌握TCP鏈接過程
  2. 學會計算seq、ack碼

TCP 協議是HTTP協議的重要基礎,充分理解TCP協議的鏈接及端口,有助於咱們深刻理解網絡請求和鏈接。今天就來看圖學習TCP請求的鏈接、數據傳輸及端口鏈接。網絡


OSI7層網絡模型

OSI是Open System Interconnection的縮寫,國際標準化組織(ISO)制定了OSI模型,該模型定義了不一樣計算機互聯的標準,是設計和描述計算機網絡通訊的基本框架。併發

參考模型(從上至下) 各層含義
應用層 爲應用程序提供服務,如HTTP、FTP、SMTP、POP3等
表示層 數據格式轉換翻譯、數據加密解密、壓縮解壓縮
會話層 不一樣機器之間的用戶創建及管理會話
傳輸層 創建管理和維護端到端的鏈接,TCP、UDP
網絡層 IP地址及路由選擇
數據鏈路層 物理尋址,將原始比特流轉化爲邏輯傳輸線路
物理層 機械、電子、定時接口通訊信道上上的原始比特流傳輸

1. 傳輸層

接受上一次的數據,將數據進行分割,保證數據準確到達對端。框架

2. TCP

TCP是面向鏈接的無狀態的協議。爲了鏈接的可靠性,每次鏈接的創建都須要3次握手。學習

2.1 創建鏈接(3次握手)

3次握手的目的:加密

  1. 同步鏈接雙方的序列號和確認號;
  2. 交換TCP窗口大小信息。
客戶端(狀態) 創建鏈接(三次握手) 服務端(狀態)
CLOSED LISTEN
SYN seq=0 ==》
SYN_SENT
《== SYN ACK ack=1,seq=0
SYN_RCVD
ACK ack=1,seq=1 ==》
ESTABLISHED ESTABLISHED
  • 第一次握手: 創建鏈接。客戶端發送鏈接請求,發送SYN報文,隨機生成seq,本例默認爲0。而後,客戶端進入SYN_SEND狀態,等待服務器的確認。
  • 第二次握手: 服務器收到客戶端的SYN報文段。須要對這個SYN報文段進行確認,發送ACK報文,將ack設置爲1(ack值爲對方seq+1或者seq+L(數據長度L))。同時,本身還要發送SYN請求信息,將seq爲0。服務器端將上述全部信息一併發送給客戶端,此時服務器進入SYN_RECV狀態。
  • 第三次握手: 客戶端收到服務器的ACK和SYN報文後,進行確認,而後將ack設置爲1,seq設置爲1,向服務器發送ACK報文段,這個報文段發送完畢之後,客戶端和服務器端都進入ESTABLISHED狀態,完成TCP三次握手。

2.2 數據傳輸

客戶端 數據傳輸 服務端
PSH seq=1, ACK ack=1(segmentLen = 99) ==》
《== PSH seq=1, ACK ack=100 (segmentLen = 119)
ACK ack=120,seq=100 ==》
  • 客戶端先向服務器發送數據,該數據報是長度爲99的數據。
  • 服務器收到報文後, 也向客戶端發送了一個數據進行確認(ACK),而且返回客戶端要請求的數據,數據的長度爲111,將seq設置爲1,ack設置爲120(1 + 119)。
  • 客戶端收到服務器返回的數據後進行確認(ACK),將seq設置爲100, ack設置爲112(1 + 111)。

2.3 斷開連接(4次揮手)

客戶端(狀態) 斷開鏈接 服務端(狀態)
FIN ACK ack=120,seq=100 ==》
FIN_WAIT_1
《== ACK ack=101,seq=120
FIN_WAIT_2 CLOSE_WAIT
《== ACK ack=101,seq=120
LAST_ACK
ACK ack=121,seq=101 ==》
TIME_WAIT CLOSE
  • 第一次揮手:客戶端向服務器發送一個FIN報文段,將設置seq爲100和ack爲120,;此時,客戶端進入 FIN_WAIT_1狀態,這表示客戶端沒有數據要發送服務器了,請求關閉鏈接;
  • 第二次揮手:服務器收到了客戶端發送的FIN報文段,向客戶端回一個ACK報文段,ack設置爲101,seq設置爲120;服務器進入了CLOSE_WAIT狀態,客戶端收到服務器返回的ACK報文後,進入FIN_WAIT_2狀態;
  • 第三次揮手:服務器會觀察本身是否還有數據沒有發送給客戶端,若是有,先把數據發送給客戶端,再發送FIN報文;若是沒有,那麼服務器直接發送FIN報文給客戶端。請求關閉鏈接,同時服務器進入LAST_ACK狀態;
  • 第四次揮手:客戶端收到服務器發送的FIN報文段,向服務器發送ACK報文段,將seq設置爲101,將ack設置爲121,而後客戶端進入TIME_WAIT狀態;服務器收到客戶端的ACK報文段之後,就關閉鏈接;此時,客戶端等待2MSL後依然沒有收到回覆,則證實Server端已正常關閉,客戶端也能夠關閉鏈接了。

** 計算規則: ** seq 爲序列號 ack 爲應答碼 seq = 對方上次的ack;(首次發送時seq爲系統隨機生成) ack = 對方的seq+1(無數據傳輸時) 或者 seq+L(報文數據的長度L)計算機網絡

相關文章
相關標籤/搜索