【網絡編程】十、詳解 UDP 協議

文章目錄

  • Ⅰ. 傳輸層概述
    • 1、進程之間的通信
    • 2、再談端口號
      • 端口號的引出
      • 五元組標識一個通信
      • 端口號范圍劃分
      • 常見的知名端口號
      • 查看知名端口號
      • 協議號 VS 端口號
    • 3、兩個問題
      • 一個端口號是否可以被多個進程綁定?
      • 一個進程是否可以綁定多個端口號?
    • 4、部分常見指令
      • pidof(用于查看進程id)
      • netstat(查看網絡狀態)
  • Ⅱ. UDP協議
    • 1、UDP協議所處位置
    • 2、UDP協議格式
      • 如何理解首部?
      • UDP協議如何將首部與有效載荷進行分離?
      • UDP協議如何決定將有效載荷交付給上層的哪一個協議?
    • 3、UDP的主要特點
    • 4、面向數據報
    • 5、UDP協議的緩沖區
      • 為什么UDP要有接收緩沖區?
    • 6、基于UDP的應用層協議

在這里插入圖片描述

Ⅰ. 傳輸層概述

1、進程之間的通信

? 在學習 HTTP 等應用層協議時,為了便于理解,可以簡單的認為 HTTP 協議是將請求和響應直接發送到了網絡當中。但實際應用層需要先將數據交給傳輸層,再由傳輸層對數據做進一步處理后再將數據繼續向下進行交付,該過程貫穿整個網絡協議棧,最終才能將數據發送到網絡當中。
在這里插入圖片描述

? 傳輸層負責可靠性傳輸,確保數據能夠可靠地傳送到目標地址。從通信和信息處理的角度看,運輸層為它上面的應用層提供通信服務
在這里插入圖片描述

? 但是我們要明確的是,真正進行通信的實體,其實是主機中的應用進程,也就是進程之間的通信!而為了達到傳輸層向上服務應用層的時候,可以找到對應的進程,就有了兩個重要的功能:復用分用!如下圖所示:
在這里插入圖片描述

? 此外,傳輸層還要對收到的報文進行差錯檢測,只不過 傳輸層只檢驗首部是否出現差錯,而不檢查有效載荷部分!

2、再談端口號

端口號的引出

? 應用層所有的應用進程都可以通過運輸層再傳送到網絡層,這叫做復用;而運輸層從網絡層收到發送給各應用進程的數據后,必須分別交付指明的各應用進程,這就是分用。

? 所以很明顯,給應用層的每個應用進程賦予一個非常明確唯一的標志是至關重要的

? 我們知道,一臺計算機中的進程有著唯一標識的進程標識符,但因為這個進程標識符和操作系統是強相關的,如果我們將其作為復用和分用的標識的話,那么會有一個問題,就是一個進程的標識符由操作系統管理,所以進程的銷毀和創建都會導致進程標識符的變化,但是我們又是希望在網絡中傳輸的時候,對方的唯一標志可以是盡量保持不變的(因為一旦變化,請求連接的標識也需要改變),所以我們 不能用進程標識符作為復用和分用的唯一標志

? 所以此時就有人使用了端口號這種方案來作為唯一標識!

? 端口號(Port)標識一個主機上進行網絡通信的不同的應用程序。當主機從網絡中獲取到數據后,需要自底向上進行數據的交付,而這個數據最終應該交給上層的哪個應用處理程序,就是由該數據當中的目的端口號來決定的。

? 從網絡中獲取的數據在進行向上交付時,在傳輸層就會提取出該數據對應的目的端口號,進而確定該數據應該交付給當前主機上的哪一個服務進程。
在這里插入圖片描述

? 因此端口號是屬于傳輸層的概念的,在傳輸層協議的報頭當中就會包含與端口相關的字段。

? 請注意,端口號只具有本地意義,在互聯網不同的計算機中,相同的端口號是沒有關聯的!

五元組標識一個通信

? 在 TCP/IP 協議中,用 “源IP地址”、“源端口號”、“目的IP地址”、“目的端口號”、“協議號” 這樣一個五元組來標識一個通信。

? 比如有多臺客戶端主機同時訪問服務器,這些客戶端主機上可能有一個客戶端進程,也可能有多個客戶端進程,它們都在訪問同一臺服務器。
在這里插入圖片描述

而這臺服務器就是通過 “源IP地址”、“源端口號”、“目的IP地址”、“目的端口號”、“協議號” 來識別一個通信的。

  • 先提取出數據當中的目的 IP 地址和目的端口號,確定該數據是發送給當前服務進程的。
  • 然后提取出數據當中的協議號,為該數據提供對應類型的服務。
  • 最后提取出數據當中的源 IP 地址和源端口號,將其作為響應數據的目的IP地址和目的端口號,將響應結果發送給對應的客戶端進程。
    在這里插入圖片描述

? 通過 netstat 命令可以查看到這樣的五元組信息。
在這里插入圖片描述

? 其中的 Local Address 表示的就是源IP地址和源端口號,Foreign Address 表示的就是目的IP地址和目的端口號,而 Proto 表示的就是協議類型。

端口號范圍劃分

端口號的長度是 16,因此端口號的范圍是 0 ~ 65535

  • 0 ~ 1023知名端口號。比如 HTTPFTPSSH 等這些廣為使用的應用層協議,它們的端口號都是固定的。
  • 1024 ~ 65535操作系統動態分配的端口號。客戶端程序的端口號就是由操作系統從這個范圍分配的。

常見的知名端口號

有些服務器是非常常用的,這些服務器的端口號一般都是固定的:

  • ssh 服務器,使用 22 端口
  • ftp 服務器,使用 21 端口
  • telnet 服務器,使用 23 端口
  • dns 服務器,使用 53 端口
  • http 服務器,使用 80 端口
  • https 服務器,使用 443 端口

查看知名端口號

? 我們可以查看 /etc/services 文件,該文件是記錄網絡服務名和它們對應使用的端口號及協議。
在這里插入圖片描述

? 說明一下:文件中的每一行對應一種服務,它由 4 個字段組成,每個字段之間用 TAB 或空格分隔,分別表示“服務名稱”、“使用端口”、“協議名稱”以及“別名”。

協議號 VS 端口號

  • 協議號是存在于 IP 報頭當中的,其長度是 8 位。協議號指明了數據報所攜帶的數據是使用的何種協議,以便讓目的主機的 IP 層知道應該將該數據交付給傳輸層的哪個協議進行處理。
  • 端口號是存在于 UDPTCP 報頭當中的,其長度是 16 位。端口號的作用是唯一標識一臺主機上的某個進程。
  • 協議號是作用于傳輸層和網絡層之間的,而端口號是作用于應用層于傳輸層之間的。

3、兩個問題

一個端口號是否可以被多個進程綁定?

? 一個端口號絕對不能被多個進程綁定,因為端口號的作用就是唯一標識一個進程,如果綁定一個已經被綁定的端口號,就會出現綁定失敗的問題。

一個進程是否可以綁定多個端口號?

? 一個進程是可以綁定多個端口號的,這與“端口號必須唯一標識一個進程”是不沖突的,只不過現在這多個端口唯一標識的是同一個進程罷了。

? 我們限制的是從端口號到進程的唯一性,而沒有要求從進程到端口號也必須滿足唯一性,因此一個進程是可以綁定多個端口號的。

4、部分常見指令

pidof(用于查看進程id)

pidof httpServer | xargs kill -9 // xargs用于將管道前面獲取的參數追加到該指令后面

netstat(查看網絡狀態)

n  拒絕顯示別名,能顯示數字的全部轉化成數字
l  僅列出有在 Listen (監聽) 的服務狀態
p  顯示建立相關鏈接的程序名
t(tcp)  僅顯示tcp相關選項
u(udp)  僅顯示udp相關選項
a(all)  顯示所有選項,默認不顯示LISTEN相關

Ⅱ. UDP協議

1、UDP協議所處位置

? 網絡套接字編程時用到的各種接口,是位于應用層和傳輸層之間的一層系統調用接口,這些接口是系統提供的,我們可以通過這些接口搭建上層應用,比如 HTTP。我們經常說 HTTP 是基于 TCP 的,實際就是因為 HTTPTCP 套接字編程上搭建的。

? 而 socket 接口往下的傳輸層實際就是由操作系統管理的,因此 UDP 是屬于內核當中的,是操作系統本身協議棧自帶的,其代碼不是由上層用戶編寫的,UDP 的所有功能都是由操作系統完成,因此網絡也是操作系統的一部分。

2、UDP協議格式

? 其格式如下:
在這里插入圖片描述

  • 16 位源端口號:表示數據從哪里來。
  • 16 位目的端口號:表示數據要到哪里去。
  • 16 位整個報文長度:表示整個數據報(UDP 首部 + UDP 數據)的長度。
    • 這也就說明 UDP 最大可傳輸的長度為 2^1664KB(包含首部字段),如果需要 傳輸大于 64KB 的數據,就需要應用層多次分包,并在接收端手動拼裝
  • 16 位檢驗和:如果 UDP 報文的檢驗和出錯,就會直接將報文丟棄。

? 之所以我們在應用層看到的端口號大部分都是 16 位的,比如使用 uint16_t 類型,其根本原因就是因為傳輸層協議當中的端口號就是 16 位的。

如何理解首部?

? 操作系統是 C 語言寫的,而 UDP 協議又是屬于內核協議棧的,因此 UDP 協議也一定是用 C 語言編寫的,所以 UDP 首部本質上是一個結構體對象或者包含位段的結構體,如下所示:

struct udphdr {uint16_t uh_sport;  /* 源端口號 */uint16_t uh_dport;  /* 目的端口號 */uint16_t uh_ulen;   /* UDP數據報長度(包括頭部+數據) */uint16_t uh_sum;    /* 數據校驗和 */
};

UDP數據封裝:

  • 當應用層將數據交給傳輸層后,在傳輸層就會創建一個 UDP 報頭類型的變量,然后填充報頭當中的各個字段,此時就得到了一個 UDP 報頭。
  • 此時操作系統再在內核當中開辟一塊空間,將 UDP 報頭和有效載荷拷貝到一起,此時就形成了 UDP 報文。

UDP數據分用:

  • 當傳輸層從下層獲取到一個報文后,就會讀取該報文的前 8 個字節,提取出對應的目的端口號。
  • 通過目的端口號找到對應的上層應用層進程,然后將剩下的有效載荷向上交付給該應用層進程。

UDP協議如何將首部與有效載荷進行分離?

? UDP的報頭當中只包含四個字段,每個字段的長度都是 16 位,總共 8 字節。因此 UDP 采用的實際上是一種定長報頭,UDP 在讀取報文時讀取完前 8 個字節后剩下的就都是有效載荷了。

? 而我們只需要提取報頭中的 數據報長度 字段,減去 8 個字節,最后的大小就是有效載荷的長度,是可以直接讀取上來的!

UDP協議如何決定將有效載荷交付給上層的哪一個協議?

? UDP 上層也有很多應用層協議,因此 UDP 必須想辦法將有效載荷交給對應的上層協議,也就是交給應用層對應的進程。

? 應用層的每一個網絡進程都會綁定一個端口號,服務端進程必須顯示綁定一個端口號,客戶端進程則是由系統動態綁定的一個端口號。UDP 就是通過報頭當中的目的端口號來找到對應的應用層進程的。

? 說明一下: 內核中用哈希的方式維護了端口號與進程 ID 之間的映射關系,因此傳輸層可以通過端口號得到對應的進程 ID,進而找到對應的應用層進程

3、UDP的主要特點

  1. 無連接。發送數據之前不需要建立連接。
  2. 使用盡最大努力交付。即 不保證可靠交付
  3. 面向報文UDP 一次傳送和交付一個完整的報文。
  4. 沒有擁塞控制。網絡出現的擁塞不會使源主機的發送速率降低。很適合多媒體通信的要求。
  5. 支持一對一、一對多、多對一、多對多等交互通信。
  6. 首部開銷小,只有 8 個字節。

? 總結一點,就是【簡單方便,但不可靠】。
在這里插入圖片描述

? 此外,應用程序必須選擇合適大小的報文。若報文太長,IP 層在傳送時可能要進行分片,降低 IP 層的效率。若報文太短,會使 IP 數據報的首部的相對長度太大,降低 IP 層的效率。

4、面向數據報

? 應用層交給 UDP 多長的報文,UDP 就原樣發送,既不會拆分,也不會合并,這就叫做面向數據報。

? 比如用 UDP 傳輸 100 個字節的數據:

? 如果發送端調用一次 sendto,發送 100 字節,那么接收端也必須調用對應的一次 recvfrom,接收 100 個字節,而不能循環調用 10recvfrom 去每次接收 10 個字節。

5、UDP協議的緩沖區

? UDP 協議不需要考慮多個報文之間的粘連問題,因為 UDP 沒有真正意義上的發送緩沖區。調用 sendto 函數會直接交給內核(應用層發一個,傳輸層送走一個),由內核將數據傳給網絡層協議進行后續的傳輸動作。

? 但是 UDP 具有接收緩沖區。但是這個接收緩沖區不能保證收到的 UDP 報的順序和發送 UDP 報的順序一致。如果緩沖區滿了,再到達的 UDP 數據就會直接被丟棄,所以 UDP 協議是一種不可靠、全雙工的協議。
在這里插入圖片描述

為什么UDP要有接收緩沖區?

? 如果 UDP 沒有接收緩沖區,那么就要求上層及時將 UDP 獲取到的報文讀取上去,如果一個報文在 UDP 沒有被讀取,那么此時 UDP 從底層獲取上來的報文數據就會被迫丟棄。

? 一個報文從一臺主機傳輸到另一臺主機,在傳輸過程中會消耗主機資源和網絡資源。如果 UDP 收到一個報文后僅僅因為上次收到的報文沒有被上層讀取,而被迫丟棄一個可能并沒有錯誤的報文,這就是在 浪費主機資源和網絡資源

? 因此 UDP 本身是會維護一個接收緩沖區的,當有新的 UDP 報文到來時就會把這個報文放到接收緩沖區當中,此時上層在讀數據的時就直接從這個接收緩沖區當中進行讀取就行了,而如果 UDP 接收緩沖區當中沒有數據那上層在讀取時就會被阻塞。因此 UDP 的接收緩沖區的作用就是,將接收到的報文暫時的保存起來,供上層讀取。

6、基于UDP的應用層協議

  • NFS:網絡文件系統
  • TFTP:簡單文件傳輸協議
  • DHCP:動態主機配置協議
  • BOOTP:啟動協議(用于無盤設備啟動)
  • DNS:域名解析協議

當然,也包括自己寫 UDP 程序時自定義的應用層協議。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83400.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83400.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83400.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實現RTSP低延遲播放器,挑戰與解決方案

隨著低延遲直播需求的快速增長,RTSP(Real-Time Streaming Protocol)播放器逐漸成為實時視頻流傳輸中的核心技術之一。與WebRTC(Web Real-Time Communication)相比,RTSP在實時性和網絡延遲方面面臨諸多挑戰&…

【springcloud學習(dalston.sr1)】Eureka單個服務端的搭建(含源代碼)(三)

該系列項目整體介紹及源代碼請參照前面寫的一篇文章【springcloud學習(dalston.sr1)】項目整體介紹(含源代碼)(一) springcloud學習(dalston.sr1)系統文章匯總如下: 【springcloud學習(dalston…

GPU與NPU異構計算任務劃分算法研究:基于強化學習的Transformer負載均衡實踐

點擊 “AladdinEdu,同學們用得起的【H卡】算力平臺”,H卡級別算力,按量計費,靈活彈性,頂級配置,學生專屬優惠。 引言 在邊緣計算與AI推理場景中,GPU-NPU異構計算架構已成為突破算力瓶頸的關鍵技…

探索C語言中的二叉樹:原理、實現與應用

一、引言 二叉樹作為一種重要的數據結構,在計算機科學領域有著廣泛的應用,無論是在操作系統的文件系統管理,還是在數據庫的索引構建中,都能看到它的身影。在C語言中,我們可以利用指針靈活地構建和操作二叉樹。接下來&…

使用libUSB-win32的簡單讀寫例程參考

USB上位機程序的編寫,函數的調用過程. 調用 void usb_init(void); 進行初始化 調用usb_find_busses、usb_find_devices和usb_get_busses這三個函數,獲得已找到的USB總線序列;然后通過鏈表遍歷所有的USB設備,根據已知的要打開USB設…

vue注冊用戶使用v-model實現數據雙向綁定

定義數據模型 Login.vue //定義數據模型 const registerData ref({username: ,password: ,confirmPassword: })使用 v-model 實現數據模型的key與注冊表單中的元素之間的雙向綁定 <!-- 注冊表單 --><el-form ref"form" size"large" autocompl…

【Arthas實戰】常見使用場景與命令分享

簡介: Arthas是一款Java診斷工具&#xff0c;適用于多種場景&#xff0c;如接口響應變慢、CPU占用過高、熱更新需求等。其核心命令包括實時監控面板&#xff08;dashboard&#xff09;、線程狀態查看&#xff08;thread&#xff09;、方法調用鏈路追蹤&#xff08;trace&#x…

Jenkins 最佳實踐

1. 在Jenkins中避免調度過載 過載Jenkins以同時運行多個作業可能導致資源競爭、構建速度變慢和系統性能問題。分配作業啟動時間可以防止瓶頸&#xff0c;并確保更順暢的執行。如何實現&#xff1f; 在Cron表達式中使用H&#xff1a;引入抖動&#xff08;jitter&#xff09;&a…

pytest框架 - 第二集 allure報告

一、斷言assert 二、Pytest 結合 allure-pytest 插件生成美觀的 Allure 報告 (1) 安裝 allure 環境 安裝 allure-pytest 插件&#xff1a;pip install allure-pytest在 github 下載 allure 報告文件 地址&#xff1a;Releases allure-framework/allure2 GitHub下載&#x…

人工智能時代:解鎖職業新身份,從“認證師”到“工程師”的進階之路

在人工智能技術浪潮席卷全球的今天,技術的飛速迭代正在重塑職業版圖。從算法優化到倫理決策,從系統測試到應用開發,AI技術不再只是程序員的專屬領域,而是成為各行各業從業者必須掌握的“生存技能”。當企業爭相布局AI賽道,個人如何在這場變革中搶占先機?答案或許藏在兩個…

【帶文檔】網上點餐系統 springboot + vue 全棧項目實戰(源碼+數據庫+萬字說明文檔)

&#x1f4cc; 一、項目概括 本系統共包含三個角色&#xff1a; 管理員&#xff1a;系統運營管理者 用戶&#xff1a;點餐消費用戶 美食店&#xff1a;上傳菜品與處理訂單的店鋪賬號 通過對這三類角色的權限與業務分工設計&#xff0c;系統實現了點餐流程的全鏈路數字化&a…

window nvidia-smi命令 Failed to initialize NVML: Unknown Error

如果驅動目錄下的可以執行&#xff0c;那可能版本原因 "C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"復制"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe"替換 C:\Windows\System32\nvidia-smi.exe 或者 把C:\Windows\System3…

接觸感知 鉗位電路分析

以下是NG板接觸感知電路的原理圖。兩極分別為P3和P4S&#xff0c;電壓值P4S < P3。 電路結構分兩部分&#xff0c;第一部分對輸入電壓進行分壓鉗位。后級電路使用LM113比較器芯片進行電壓比較&#xff0c;輸出ST接觸感知信號。 鉗位電路輸出特性分析 輸出電壓變化趨勢&a…

70、微服務保姆教程(十三)Docker容器詳細講義

一、關于Docker 1.1為什么要用docker? 隨著開發的項目越來越復雜,軟件越來越多,服務器越來越多,我們在開發和部署的時候會遇到很多問題,比如: 1.不同的應用程序可能會有不同的應用環境,比如Java開發的網站和php開發的網站依賴的軟件就不一樣,如果把他們依賴的軟件都…

Python 中的 typing.ClassVar 詳解

一、ClassVar 的定義和基本用途 ClassVar 是 typing 模塊中提供的一種特殊類型&#xff0c;用于在類型注解中標記類變量&#xff08;靜態變量&#xff09;。根據官方文檔&#xff0c;使用 ClassVar[…] 注釋的屬性表示該屬性只在類層面使用&#xff0c;不應在實例上賦值 例如&…

架構與UML4+1視圖

簡單對比分析 架構41視圖 架構41視圖是由Philippe Kruchten提出的&#xff0c;用于描述軟件系統的架構。它包括以下五個視圖&#xff1a; 邏輯視圖&#xff1a;描述系統的功能需求&#xff0c;展示系統的靜態結構&#xff0c;通常使用類圖、對象圖等。開發視圖&#xff1a;…

Redis 八股

目錄 數據類型 字符串&#xff1a; List&#xff1a; HASH&#xff1a; Set&#xff1a; Zset&#xff1a; BitMap&#xff1a;&#xff08;這個及以下是后來新增的數據結構&#xff09; HyperLogLog&#xff1a; GEO&#xff1a; Stream&#xff1a; 主要數據結構 …

基于協同過濾的文學推薦系統設計【源碼+文檔+部署】

基于協同過濾的文學推薦系統設計 摘要 隨著信息技術的飛速發展和文學閱讀需求的日益多樣化&#xff0c;構建一個高效、精準的文學推薦系統變得尤為重要。本文采用Spring Boot框架&#xff0c;結合協同過濾算法&#xff0c;設計并實現了一個基于用戶借閱行為和社交論壇互動的文學…

鴻蒙電腦:五年鑄劍開新篇,國產操作系統新引擎

出品 | 何璽 排版 | 葉媛 前不久&#xff0c;璽哥發布的《鴻蒙電腦&#xff0c;刺向壟斷的利刃&#xff0c;將重塑全球PC市場格局》發布后&#xff0c;獲得了讀者朋友的積極反饋&#xff0c;不少都期望鴻蒙電腦早日發布。 如今&#xff0c;它真來了&#xff01; 5月8日&…

EWOMAIL

1、錯誤 Problem: problem with installed package selinux-policy-targeted-3.14.3-41.el8.noarch package fail2ban-server-1.0.2-3.el8.noarch requires (fail2ban-selinux if selinux-policy-targeted), but none of the providers can be installed - package fail2ban-…