【詳解】計算機網絡從總到細——UDP與TCP

重點協議TCP與UDP

1. 認識傳輸層的兩個協議

  • 傳輸層功能: 爲相互通信的應用進程提供邏輯通信

  • TCP(Transmission Control Protocol,傳輸控制協議) :需要將要傳輸的文件分段進行傳輸,在傳輸之前需要建立會話,他的傳輸過程是可靠傳輸,同時要進行流量控制;[QQ傳文件]

  • UDP(User Data Protocol,用戶數據報協議):一個數據包就能夠完成數據通信,不分段,也不需要建立會話,不需要流量控制,是一種不可靠傳輸;[DNS域名解析;QQ聊天]

  • 查看會話:netstat -n

  • 查看建立會話的進程:netstat -nb

  • 查看服務偵聽的端口:netstat -an

  • 測試到遠程計算機某個端口是否打開 :telnet 39.99.188.117 8080

2.傳輸層協議和應用層協議之間的關係

  • 常見的應用層協議使用的端口
    • http=TCP+80
    • https=TCP+443
    • RDP=TCP+3389
    • ftp=TCP+21
    • SMTP=TCP+25
    • 共享文件夾=TCP+445
    • POP3=TCP+23
    • telnet=TCP+23
    • SQL=TCP+1433
    • DNS=UDP+53

3.服務和應用層協議之間關係

  • 服務使用TCP或UDP的端口偵聽客戶端請求
  • 客戶端使用IP地址定位服務器使用目標端口定位服務
  • 可以在服務器網卡上設置只開放必要的端口實現服務器網絡安全

4.UDP

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-uW4V1v0A-1591196440671)(C:\Users\apple\AppData\Roaming\Typora\typora-user-images\image-20200419214643600.png)]

16位UDP長度,表示數據報(UDP首部+UDP數據)的最大長度。

如果校驗和出錯,就會直接丟棄

  • 特點:不安全但是效率高
    • 無連接
    • 不可靠:沒有確定應答機制,沒有超時重傳機制,也沒有連接管理機制
    • 面向數據報:最大發送64k
      • 應用層交給UDP多長的報文, UDP原樣發送, 既不會拆分, 也不會合並;、
      • 用UDP傳輸100個字節的數據:
        • 如果發送端調用一次sendto, 發送100個字節, 那麼接收端也必須調用對應的一次recvfrom, 接收100個字節; 而不能循環調用10次recvfrom, 每次接收10個字節;
    • UDP沒有發送緩衝區,只有接收緩衝區:
      • UDP沒有真正意義上的 發送緩衝區. 調用sendto會直接交給內核, 由內核將數據傳給網絡層協議進行後續的傳輸動作;
      • UDP具有接收緩衝區. 但是這個接收緩衝區不能保證收到的UDP報的順序和發送UDP報的順序一致; 如果緩衝區滿了, 再到達的UDP數據就會被丟棄;
  • 基於UDP的應用層協議:
    • NFS: 網絡文件系統
    • TFTP: 簡單文件傳輸協議
    • DHCP: 動態主機配置協議
    • BOOTP: 啓動協議(用於無盤設備啓動)
    • DNS: 域名解析協議

5. TCP

  • 協議格式:

    在這裏插入圖片描述

    • 源/目的端口號:從那個進程來,到那個進程去;
    • 32位序號/32位確定號:和 TCP 的 ACK 機制有關,發送端給數據進行編號,接收端收到數據後確認收到哪些編號的數據。
    • 4位TCP報頭長度:表示該TCP頭部有多少個32位bit(有4個字節);所以TCP頭部最大長度是15*4=60
    • 6位標誌位:
      • URG:緊急指針是否有效
      • **ACK:**確認號是否有效
      • PSH:提示接收端應用程序立刻從TCP緩衝區把數據讀走
      • RST:對方要求重新建立連接; 我們把攜帶RST標識的稱爲復位報文段
      • **SYN:**請求建立連接; 我們把攜帶SYN標識的稱爲同步報文段
      • **FIN:**通知對方, 本端要關閉了, 我們稱攜帶FIN標識的爲結束報文段
    • 16位窗口大小:
    • 16位校驗和:發送端填充,CRC 校驗,接收端校驗不通過,則認爲數據有問題。此處的檢驗和不光包含TCP首部,也包含TCP數據部分。
    • 16緊急指針:略
    • 40字節頭部選項:略
  • 特點:

    • 有連接
    • 可靠的
    • 面向字節流
    • 具有接收和發送緩衝區
  • 確定應答機制(ACK):序號+確定序號實現

    • 生活案例理解確定應答機制

通常,兩個人對話時,在談話的停頓處可以點頭或詢問以確認談話內容。如果對方遲遲沒有任何反饋,說話的一方還可以再重複一遍以保證對方確實聽到。 因此,對方是否理解了此次對話內容,對方是否完全聽到了對話的內容,都要靠對方的反應來判斷。網絡中的 “確認應答” 就是類似這樣的一個概念。當對方聽懂對話內容時會說: " 嗯 ",這就相當於返回了一個確認應答(ACK)。而當對方沒有理解對話內容或沒有聽清時會問一句 `` 咦?” 這好比一個否定確認應答
在這裏插入圖片描述

  • TCP將每個字節都進行了編號,既爲序列號

  • 每個ACK都帶有對應得確認序列號,意思是告訴發送者,我已經收到那些數據;下一次你從什麼地方開始

  • 超時重傳機制:系統基於TCP協議實現,動態計算報文的最大生存時間(MSL),超時時間設置爲2MSL

    • 作用:超過超時時間,表示丟包(兩種情況,如下),需要重新發送數據報(系統中發送緩衝區保存有數據,可以重發)

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aOT6GMqH-1591196440674)(C:\Users\apple\AppData\Roaming\Typora\typora-user-images\image-20200419230335443.png)]

    • 主機A發送數據給B之後, 可能因爲網絡擁堵等原因, 數據無法到達主機B;
    • 如果主機A在一個特定時間間隔內沒有收到B發來的確認應答, 就會進行重發;、

    但是,主機A未收到B發來的確認應答, 也可能是因爲ACK丟失了;

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Kjspdv43-1591196440676)(C:\Users\apple\AppData\Roaming\Typora\typora-user-images\image-20200419230522261.png)]

    • 因此主機B會收到很多重複數據. 那麼TCP協議需要能夠識別出那些包是重複的包, 並且把重複的丟棄掉.
      這時候我們可以利用前面提到的序列號, 就可以很容易做到去重的效果.
  • 連接管理機制:

    • 在正常情況下, TCP要經過三次握手(紅色)建立連接, 四次揮手(藍色)斷開連接
    • **!**注意:建立連接都是單方向的連接

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tMqN8KW0-1591196440678)(C:\Users\apple\AppData\Roaming\Typora\typora-user-images\image-20200419233249388.png)]

    • 三次握手:(建立連接)

      1. 客戶端的協議棧向服務器端發送了 SYN 包,並告訴服務器端當前發送序列號 j,客戶端進入 SYNC_SENT 狀態;
      2. 服務器端的協議棧收到這個包之後,和客戶端進行 ACK 應答,應答的值爲 j+1,表示對 SYN 包 j 的確認,同時服務器也發送一個 SYN 包,告訴客戶端當前我的發送序列號爲 k,服務器端進入 SYNC_RCVD 狀態;
      3. 客戶端協議棧收到 ACK 之後,使得應用程序從 connect 調用返回,表示客戶端到服務器端的單向連接建立成功,客戶端的狀態爲 ESTABLISHED,同時客戶端協議棧也會對服務器端的 SYN 包進行應答,應答數據爲 k+1;
      4. 應答包到達服務器端後,服務器端協議棧使得 accept 阻塞調用返回,這個時候服務器端到客戶端的單向連接也建立成功,服務器端也進入 ESTABLISHED 狀態。
    • 四次揮手:(斷開連接)

      TCP 連接終止時,主機 1 先發送 FIN 報文,主機 2 進入 CLOSE_WAIT 狀態,併發送一個 ACK 應答,同時,主機 2 通過 read 調用獲得 EOF,並將此結果通知應用程序進行主動關閉操作,發送 FIN 報文。主機 1 在接收到 FIN 報文後發送 ACK 應答,此時主機 1 進入 TIME_WAIT 狀態

      • 爲什麼要ACK與FIN分開發送?服務器沒有繼續發FIN包給客戶端。
        • 服務器爲什麼不發FIN,可能是業務實現上的需要,現在不是發送FIN的時機,因爲服務器還有數據要發往客戶端,發送完了自然就要通過系統調用發FIN了
    • ClOSE_WAIT狀態:服務端程序沒有調用close方法,導致出現大量的連接處於CLOSE_WAIT狀態,代表半關閉,是一種bug,只需要加上對應的 close 即可解決問題.

      • 關於 “半關閉” , 類似男女朋友分手
    • TIME_WAIT狀態:

      • 爲啥不能設置爲CLOSED? 因爲低4次ACK響應報文時可能丟包,導致服務端無法關閉連接,需要服務器重新發送FIN請求
      • **爲啥是2MSL?**返回ACK傳輸時間+服務端重新發送FIN的傳輸時間
  • 滑動窗口:

    • 窗口大小指的是無需等待確定應答而可以繼續發生數據的最大值。假如窗口爲n段
      • 依賴ACK響應報文中的窗口大小字段
      • 依賴擁塞控制窗口大小
    • 收到第一個ACK,滑動窗口向後移動,繼續發送第n+1段的數據
    • 操作系統內核爲了維護這個滑動窗口,需要開闢發送緩衝區來記錄當前還有那些數據沒有應答;只有確認應答過的數據,才能從緩衝區刪掉
    • ACJ響應報文中,攜帶下一個序號是多少。---->表示在此序號之前的所有數據都已經接收到、
    • 窗口的滑動:
      • 依賴ACK響應報文中的下一個序號進行滑動,而下一個序號是多少,又依賴接接收到連續報文的最大序號。
  • 流量控制:

    • 接收端:通過TCP協議頭中的“窗口大小”字段,告訴發送端,發送數據的大小。
    • 目的:接收端接收能力有限,爲了防止接收緩衝區被打滿,再接收數據直接丟棄。使用窗口大小可以告訴發送端發送數據的大小。
  • 擁塞控制:

    • 因爲網絡上有很多的計算機,可能當前網絡狀態就已經比較擁堵,在不清楚當前網絡狀態下,貿然發送大量的數據,是很有可能引起雪上加霜的
    • TCP引入慢啓動機制,先發少量的數據探探路,摸清當前網絡擁塞狀態,再決定按照多大的速度傳輸數據。
    • 原理:
      • 擁塞窗口初始值設爲1,以慢啓動指數級增長的方式,達到一定閾值變爲線性增長的方式
  • 延時應答機制

    • 原理:接收到多個數據段時,不針對每條數據報響應ACK,而是延遲一定時間,這樣接收緩衝區數據很快被處理,可用空間更大,返回窗口大小字段就可以設置的更大,使網絡吞吐量更大,傳輸效率更高。
  • 捎帶應答:

    • 如果服務端也要傳輸數據到客戶端,可以和ACK結合起來一起發送,這就叫捎帶應答
  • TCP安全機制:

    • 響應應答,超時重傳,連接機制,流量控制,擁塞控制
  • TCP性能機制:

    • 滑動窗口,延遲應答,捎帶應答
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章