網絡協議-網絡分層、TCP/UDP、TCP三次握手和四次揮手


網絡的五層划分是什么?

  • 應用層,常見協議:HTTP、FTP
  • 傳輸層,常見協議:TCP.UDP
  • 網絡層,常見協議:IP
  • 鏈路層
  • 物理層

TCP 和 UDP 的區別是什么

  • TCP/UDP 都屬於傳輸層的協議
  • TCP 是面向連接的傳輸層協議,能夠准確可靠的把數據傳遞給對方,當數據有丟包情況會重發,但是需要在建立和斷開連接需要至少7次的發包和收包,會浪費網絡流量,主要用在對可靠性要求較高的地方。
  • UDP 是面向無連接的傳輸層協議,意思是只負責傳輸數據,不能確保對方是否收到數據和數據的正確順序,數據的正確性由應用層來校驗。主要用於高速傳輸和實時性要求較高的場合如音視頻會議,廣播。

TCP 三次握手和四次揮手

  • 先來張時序圖
    image
  • 來張自己使用 wireShark 抓取的 tcp 數據包和 wireShark 生成的流量圖
    • 數據包(三次握手是完整的,四次揮手不完整,丟了一個包)
      image
    • 流量圖(三次握手是完整的,四次揮手不完整,丟了一個包)
      image

序號,確認號

  • 序列號 Sequeuece number(Seq): 數據包本身的序列號,初始序列號是隨機的。
  • 確認號 Acknowledgment number(Ack): 在接收端,用來通知發送端數據成功接收
  • 標志位,標志位只有為 1 的時候才有效
    • SYN: 創建一個連接
    • ACK: 確認接收到的數據
    • FIN: 終結一個連接

TCP 三次握手

  • TCP 三次握手圖
    image
  1. 第一次握手:客戶端向服務器端發送報文,報文中設置標志位SYN=1,生成隨機序列號 Seq = x,這時客戶端進入 SYN_SENT 狀態。
    image
  2. 第二次握手: 服務器端收到客戶端的報文,由 SYN=1 可以知道客戶端請求建立連接。服務器端給客戶端發送報文,設置標志位 SYN=1,ACK=1, 生成隨機序列號 Seq=y,設置確認號 Ack = x+1 ,這是服務器端進入 SYN_RCVD 狀態
    image
  3. 第三次握手: 客戶端接收到服務器的報文,檢查 ACK 是否為 1Ack 是否為 x+1 , 如果正確則將標志位 ACK 置為 1Ack 置為 y+1,並將該數據包發送給服務器端,服務器端檢查 ACK 是否為 1Ack 是否為 y+1,如果正確則連接建立成功,服務器端和客戶端進入 ESTABLISHED 狀態,完成三次握手。
    image
  • 為什么需要三次握手,兩次確認?
    • 為什么客戶端還要發送一次確認呢,主要是為了防止已失效的連接請求報文突然又傳送到了服務器端,造成錯誤。比如:客戶端發送連接請求,因為網絡或者一些其他因素造成沒有在一定時間到達服務器端,所以客戶端沒有收到確認。於是客戶端會重發一次連接請求,通過三次握手與服務器建立連接,但是這時上次的請求到達服務器端了,服務器會誤以為客戶端又發來了一次新的連接請求,會向客戶端發送報文同意建立連接,但是客戶端已經建立了,就會放棄掉該報文,服務器端沒有收到響應,也就不會建立連接了。

TCP 四次揮手

  • 四次揮手數據包
    image

  • 四次揮手流量圖
    image

  • 由於 TCP 連接是全雙工的,因此每個方向都必須單獨進行關閉。這一原則是當一方數據發送完成,發送一個標志位為 FIN 的報文來終止這一方向的連接,收到標志位為 FIN 的報文意味着這一方向上不會再收到數據了。但是在 TCP 連接上仍然能夠發送數據,直到這一方向也發送了 FIN 。發送 FIN 的一方執行主動關閉,另一方則執行被動關閉。

  • 第一次揮手:客戶端發送報文,標志位 FIN =1Seq = n,此時客戶端進入到 FIN_WAIT_1 狀態,表示客戶端沒有數據要發送給服務器
    image

  • 第二次揮手:服務端收到客戶端發送的 FIN 報文,然后向客戶端發送一個報文,設置標志位為 ACK =1 ,確認序列號為Ack = n+1 ,這是服務端進入 CLOSE_WAIT 狀態.表示客戶端到服務端的發送連接已經斷開。
    image

  • 第三次揮手:服務器發送報文到客戶端,報文標志位 FIN =1 序列號為 Seq = m,用來關閉服務器到客戶端的數據傳輸,服務端進行 LAST_ACK 狀態
    image

  • 第四次揮手:客戶端收到服務器發送的標志位為 FIN 的報文,客戶端進入到 CLIENT_WAIT 狀態,等待2MSL時間。然后發送一個標志位為 ACK = 1 的報文,確認序列號為 Ack = m+1 。完成四次揮手。
    image

  • 為什么要等待 2MSL

    • 客戶端發送的第4次握手報文,服務器沒有收到。這時候服務器端會再次發送一個 FIN =1 的報文,而這個時候客戶端還處於 CLIENT_WAIT 狀態,所以可以再次發送確認消息。
  • TCP 發送失敗重發情況
    image

  • 抓包環境

    • whireShark: 2.6.1
    • Android device: HTC D820U
    • Android Version: 6.0
    • Android IP : 192.168.123.103
    • Destination IP : 183.192.196.182

https://blog.csdn.net/sssnmnmjmf/article/details/68486261
https://blog.csdn.net/oney139/article/details/8103223
https://www.jianshu.com/p/9f3e879a4c9c?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM