網絡原理(六): UDP 協議

目錄

1. UDP 協議

1.1 協議特點

1.2 協議報文格式

1.2.1 UDP 長度?

1.2.2 校驗和


1. UDP 協議

在進行網絡編程時, 我們已經對 UDP 協議進行了簡單了解. 并且應用層的很多操作, 需要調用傳輸層的提供的接口, 基于 socket api 來進行完成的.

1.1 協議特點

UDP 協議具有以下特點:

  1. 面向數據報
  2. 不可靠傳輸
  3. 全雙工
  4. 無連接

在進行網絡編程使用 UDP socket api 進行數據傳輸時, 我們就對其中的一些特點有了一些感受:

面向數據報體現于: 每發送(send)或接收(receive)一次消息, 都是一個完整的 udp 報文.

全雙工體現在: 不論是客戶端還是服務器, 都可以進行 send 和 receive 操作.

無連接體現在: UDP 報文直接發送, 對端就可以接收, 并沒有像 TCP 那樣 accept 的過程.

不可靠傳輸, 是指消息發出后, 就不管了(不管數據是否成功發送到對端).?這一點并沒有在編程時具體體現, 接下來我們通過 udp 協議的報文格式來了解這一特點.

1.2 協議報文格式

UDP 數據報由兩個部分組成:

  1. UDP 報頭
  2. 載荷(完整的應用層數據包)

其中, 載荷就是完整的應用層數據報.

報頭, 大小為 64 個 bit 位, 8 個字節, 由以下四個部分組成:

  1. 源端口號
  2. 目的端口號
  3. 報文長度
  4. 校驗和

其中, 每個部分都占了 2 個字節.

至于源端口號和目的端口號的作用, 這里就不再贅述了, 主要聊一聊其中的 報文長度 和 檢驗和.

1.2.1 UDP 長度?

UDP 報文格式中的長度這一部分, 表示的是整個 UDP 數據報的長度, 即報頭 + 載荷的長度.?

由于大小為 2 字節, 也就是 16 個 bit 位, 所以 UDP 數據包長度的范圍為 0~2^16-1, 也就是 0~65535, 所以一個 UDP 數據報最大只能為?65535 個字節, 也就是?64kb.

由于報頭部分的大小是固定的, 8 字節, 這相對于 64kb(65535 字節) 來說是可以忽略不計的.

所以, 當我們面試表述 UDP 報文大小的上限時, 既可以說 64kb 是整個 UDP 數據包的上限, 也可以說是 UDP 攜帶的載荷的上限.

?64 kb, 在設計 UDP 的那個年代, 確實是一個充裕的大小, 但是放到 2024 年的今天, 就是一個非常小的數字了, 隨隨便便一張照片就可能是幾個 MB.

所以要發送數據的大小超出 UDP 數據包可以承載的大小的情況是經常發生的, 而當發送的大小一旦超過了 64kb, UDP 數據包就會被直接截斷, 對方拿到的數據就會出錯, 那么如何解決這個問題呢?? 有兩個方案可以選擇:

  1. 方案一: 在應用層代碼上進行拆包操作, 把一個大的應用層數據報拆成很多小的數據包, 再使用多個 UDP 數據包進行傳輸.
  2. 方案二: 使用 TCP 協議, 使用 TCP 數據包進行傳輸(TCP 沒有長度的限制).

方案一, 是一個工作量比較大的方法, 需要對代碼進行大量的修改, 寫大量的邏輯來實現分包組包的工作, 并且一不小心可能就寫出了隱藏 bug, 效率太低.

所以, 在工作中, 我們會優先選擇簡單且不易出錯的方案來解決問題, 即采用方案二, 使用 TCP 來解決 UDP 數據包大小限制的問題.

可能大家心中有一個疑問: 為啥不直接修改 UDP 的報文格式, 直接把 UDP 本身改的大一點呢??

其實, 要修改 UDP 很容易, 但是難就難在, UDP 已經內置在各種的操作系統中, 一旦發生變動, 就會造成很大的影響, 比如通信雙方, 一方進行了修改, 另一方沒有進行修改, 那么 UDP 數據包就會傳輸失敗, 導致不能使用 UDP 進行通信. 并且, 修改也會牽扯到系統兼容性的問題, 所以, 通信雙方誰先改, 誰可能就會出現問題.

所以 UDP 可以說是積重難返了, 目前也只能這樣子~~

1.2.2 校驗和

UDP 報文中的校驗和, 作用是為了驗證傳輸的數據是否發生修改.

注意, 這里的校驗和與 HTTPS 中數字簽名的校驗和不同, HTTPS 數字簽名的校驗和是為了反正數據被黑客篡改(防人), 但是這里 UDP 的校驗和, 與安全性無關, 而是防止傳輸過程中出現"比特翻轉".

比特翻轉, 就是在傳輸的過程中, 由于外界的影響, 導致數據中的某些 bit 位0變1, 1變0.
(數據都是以光電信號或者電磁波的形式進行傳輸的, 很容易收到外界的干擾)

驗證的過程如下:

  1. 發送之前, 會把整個數據報中的數據代入, 計算得出一個校驗和, 并將數據和校驗和一同發給對端.
  2. 對端收到數據后, 根據收到的數據, 再次計算校驗和, 將兩個校驗和進行對比, 如果校驗和不一致, 說明有數據發生了比特翻轉, 直接丟棄.

這里 UDP 采用的 CRC(循環冗余校驗) 的方式來計算校驗和:

  • CRC: 把 UDP 報文中的每個字節(除了校驗和位置外), 都當做整數, 進行累加, 即使溢出也沒關系, 繼續加, 最終得到的數據就是 CRC 校驗和.

所以, 如果在傳輸過程中, 有 bit 位發生了翻轉, 那么兩次計算得到的校驗和也會不同.

我們可以認為, 如果兩個數據是相同的數據, 那么計算得到的校驗和一定是相同的.

但是, 當兩次計算的校驗和相同時, 兩個數據不一定是相同的.

因為, 這其中可能存在變數, 例如: CRC 是累加的方式計算的校驗和, 如果第一個字節發生的翻轉, 使得值變小了, 而第二個字節發生的偏轉又使值變大了, 而恰恰這兩次偏轉各自的差值又相互抵消, 那得到的校驗和依然是相同的.

雖然, 可能出現上述情況, 但是這種情況發生的概率是非常小的(發生翻轉的概率本來就小, 再加上兩次偏轉的影響又相互抵消, 概率就小之又小了), 所以在實際開發中, 我們可以忽略這種情況的存在.

綜上, 我們可以通過 UDP 報文中的校驗和這一部分, 來確定數據在傳輸時, 是否發生了修改~?


END

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

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

相關文章

前端頁面展示本電腦的攝像頭,并使用js獲取攝像頭列表

可以通過 JavaScript 使用 navigator.mediaDevices.enumerateDevices() 獲取電腦上的攝像頭列表。以下是一個示例代碼&#xff0c;可以展示攝像頭列表并選擇進行預覽。 HTML JavaScript 實現攝像頭列表展示和預覽 <!DOCTYPE html> <html lang"zh-CN">…

【漫話機器學習系列】028.CP

Mallows’ Cp&#xff1a;標準化公式解析與應用 Mallows’ Cp 是一種常用的模型選擇工具&#xff0c;用于在一系列候選模型中權衡擬合度和復雜性&#xff0c;幫助我們選擇性能最優的模型。本文將基于其標準化公式展開詳細解析&#xff0c;并探討其應用場景、實現方法、優點與局…

期末算法分析程序填空題

目錄 5-1 最小生成樹&#xff08;普里姆算法&#xff09; 5-2 快速排序&#xff08;分治法&#xff09; 輸入樣例&#xff1a; 輸出樣例&#xff1a; 5-3 歸并排序(遞歸法) 輸入樣例&#xff1a; 輸出樣例&#xff1a; 5-4 求解編輯距離問題&#xff08;動態規劃法&#xff09;…

深入解析 Conda 安裝的默認依賴包及其作用:conda create安裝了哪些包(中英雙語)

深入解析 Conda 安裝的默認依賴包及其作用 當我們使用 Conda 創建新環境時&#xff0c;例如執行命令&#xff1a; conda create -n olmes python3.10Conda 會自動為我們安裝一系列基礎依賴包&#xff0c;保證 Python 環境能夠正常運行。這些包不僅是我們開發的基礎工具&#…

Mac、Linux命令

Linux 查本機IP&#xff1a;ip addr 查詢文件里符合條件的字符串&#xff1a;grep Mac 查本機IP&#xff1a;ipconfig

Visual Studio 中增加的AI功能

前言&#xff1a; 人工智能的發展&#xff0c;在現在&#xff0c;編程技術的IDE里面也融合了AI的基本操做。本例&#xff0c;以微軟的Visual Studio中的人工智能的功能介紹例子。 本例的環境&#xff1a; Visual Studio 17.12 1 AI 智能變量檢測&#xff1a; 上圖展示了一…

江科大學習筆記之——HAL庫點亮一個LED燈

HAL三步走&#xff1a;1.建工程。2.設配置。3.寫代碼 一.建立工程 HAL庫寫法 點擊FinIsh 2.配置時鐘 2 、設置配置參數 把模塊.C.h單獨設置文件 生產代碼 三寫代碼 控制GPIO就三步 1.RCC時鐘使能 2.結構體配置GPIO寄存器 3.控制GPIO值 上面的步驟已經把前兩步的配置完成了接下…

Spring MVC (下)小項目實戰

1. 加法計算器 需求分析: 客戶端輸入倆個數,服務端進行相加然后返回結果. 約定前后端交互接口: 接口的概念: 接口?叫API&#xff08;ApplicationProgrammingInterface),我們?般講到 接口或者API&#xff0c;指的都是同?個東西.是指應?程序對外提供的服務的描述,?于交換信…

在K8S中,如何查看Pod狀態的詳情?事件顯示cpu不足如何處理?

在Kubernetes中&#xff0c;查看Pod狀態的詳細通常設計使用kubectl命令行工具&#xff0c;這是kubernetes提供的一個強大的管理工具。以下是如何查看Pod狀態詳情的步驟&#xff1a; 1. 查看Pod狀態詳情 列出所有Pod&#xff1a; 使用kubectl get pods命令可以查看集群所有Po…

詳細講一下React中的路由React Router

1. 基本概念 React Router 是 React 的路由管理庫&#xff0c;用于在 React 應用中實現頁面導航和路由控制。 2. 安裝 npm install react-router-dom 3. 基礎用法 // App.jsx import { BrowserRouter, Routes, Route, Link } from react-router-domfunction App() {return (…

人工智能的視覺天賦:一文讀懂卷積神經網絡

什么是CNN&#xff1f; CNN&#xff0c;全稱為卷積神經網絡&#xff08;Convolutional Neural Network&#xff09;&#xff0c;是一種模擬人類視覺感知機制的人工神經網絡。它通過層疊的卷積、池化等操作&#xff0c;從數據中提取關鍵特征&#xff0c;進而完成分類、識別或預…

【OpenGL ES】GLSL基礎語法

1 前言 本文將介紹 GLSL 中數據類型、數組、結構體、宏、運算符、向量運算、矩陣運算、函數、流程控制、精度限定符、變量限定符&#xff08;in、out、inout&#xff09;、函數參數限定符等內容&#xff0c;另外提供了一個 include 工具&#xff0c;方便多文件管理 glsl 代碼&a…

使用 ECharts 與 Vue 構建數據可視化組件

在前端開發中&#xff0c;數據可視化是非常重要的一部分。ECharts 作為一個功能強大且易于使用的開源數據可視化庫&#xff0c;被廣泛應用于各種圖表展示需求中。而 Vue.js 是當下流行的前端框架之一&#xff0c;它的數據驅動和組件化開發模式讓我們能輕松地將 ECharts 集成到 …

RPA系列-uipath 學習筆記4

使用Uipath 處理hover的問題 備注&#xff1a;使用uipath stversion&#xff1a;2024.10.6,所有學習來源自uipath Academy 首先&#xff0c;打開uipath給我們提供的一個網站 ACME,這個網站呢&#xff0c;需要提前注冊一下的哈。 今天呢&#xff0c;就是記錄一下&#xff0c;怎…

Linux:進程概念

1.馮諾依曼體系結構 結論&#xff1a; --- CPU不和外設直接打交道&#xff0c;和內存直接打交道。 --- 所有的外設&#xff0c;有數據需要收入&#xff0c;只能載入到內存中&#xff1b;內存寫出&#xff0c;也一定是寫道外設中。 --- 為什么程序要運行必須加載到內存&#xf…

活動預告 | Microsoft Azure 在線技術公開課:使用 Azure OpenAI 服務構建生成式應用

課程介紹 通過 Microsoft Learn 免費參加 Microsoft Azure 在線技術公開課&#xff0c;掌握創造新機遇所需的技能&#xff0c;加快對 Microsoft Cloud 技術的了解。參加我們舉辦的“使用 Azure OpenAI 服務構建生成式應用”活動&#xff0c;了解如何使用包括 GPT 在內的強大的…

Linux(Centos 7.6)常見基礎配置

1.網絡配置 網絡配置詳見&#xff1a;VMware安裝Linux(Centos 7.6)后網絡配置 2.yum源配置 yum源配置詳見&#xff1a;Linux(Centos 7.6)yum源配置 3.主機名配置 1.Linux(Centos 7.6)系統安裝后&#xff0c;沒有配置主機名時&#xff0c;root用戶登錄后&#xff0c;是如下…

【PyCharm】如何把本地整個項目同步到服務器?

在PyCharm中&#xff0c;您可以使用部署功能將項目同步到服務器。以下是步驟和示例配置&#xff1a; 打開PyCharm&#xff0c;選擇您的項目。 點擊菜單欄的 “File” -> “Settings” -> “Build, Execution, Deployment”。 在左側菜單中&#xff0c;選擇 “Deployme…

電子電器架構 ---什么是智能電動汽車上的逆變器?

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 所謂雞湯,要么蠱惑你認命,要么慫恿你拼命,但都是回避問題的根源,以現象替代邏輯,以情緒代替思考,把消極接受現實的懦弱,偽裝成樂觀面對不幸的…

Flutter:打包apk,詳細圖文介紹

困擾了一天&#xff0c;終于能正常打包apk安裝了&#xff0c;記錄下打包的流程。建議參考我這篇文章時&#xff0c;同時看下官網的構建說明。 官網構建并發布 Android 應用詳情 1、AS創建Flutter項目 2、cmd執行命令 生成一個sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…