網絡原理 - 3(UDP 協議)

目錄

協議

應用層

xml

json

protobuffer

傳輸層

端口號(Port)

UDP 協議

UDP 協議端格式

完!


協議

網絡通信中,協議是一個非常重要的概念。我們前面在網絡原理中,就已經介紹了,為了統一各方網絡,大佬們提出了協議,因為協議太多,對其進行了分層。

應用層

應用層,對應著應用程序,是跟我們程序員打交道最多的一層。調用系統提供的網絡 API 寫出的代碼,都是屬于應用層的。

應用層這里當然也有很多現成的協議,但是更多的,還是需要我們程序員根據實際的業務場景,自定義協議(網絡傳輸的數據要怎么使用,當然也要考慮到數據是什么樣的格式,里面包含那些內容~)

協議,其實就是一種與欸的那個,雖然存在很多的現有的協議(大佬們已經搞好了的),除此之外,我們程序員也可以自己來約定協議。

自定義協議,一般要約定好兩方面的內容:

1. 服務器和客戶端之間要交互那些信息

2. 數據是具體格式

(客戶端按照上述約定發送請求,服務器按照上述約定來解析請求)

(服務器按照上述約定構造響應,客戶端按照上述約定來解析響應)

舉個栗子:

住酒店:

打開出行相關的 APP,顯示出主頁,主頁里面就很顯示出一些酒店的列表。

而且這些酒店都是在我們附近的(打開軟件的時候,需要把我們的位置,告訴服務器)

顯示的酒店列表中,也會包含一些信息 -- 酒店的名稱 細節圖片 相關評分 相關簡介...

上述的這些信息,要按照什么樣的格式來進行組織呢???是有一些固定的套路的~~~

確定如何組織數據格式這件事情,往往是需要客戶端的程序員和服務器的程序員,這兩伙人坐在一起,一起把這個事情給確定下來~~~(這里的格式怎么樣約定都可以,只要是兩伙程序員達成共識即可~~~)

一個簡單粗暴但五臟俱全的栗子~~~

1. 請求,約定使用行文本的格式來進行表示:

userId,position\n? ? ? ? ? ? ? ?(一個請求以 \n 為結尾,多個字段之間只用 , 來進行分割)

比如(1003,[經緯度]\n)

2. 響應,也是使用行文本來表示,一個響應中可能會包含多個酒店,每個酒店占一行,每個酒店都要返回 id,名稱,圖片,評分,簡介

比如( 2001,A 酒店,[logo圖片地址],4.9,五星級酒店\n

? ? ? ? ? ? 2002,B酒店,[logo圖片地址],4.5,干凈衛生的民宿\n

? ? ? ? ? ?\n)

(若干行的最后,使用空行來作為所有數據的結束標志,上面的這一系列內容就是同一個響應中的數據了)

補充:

客戶端和服務器之間往往要進行交互的是”結構化數據“(交互的數據是一個結構體 / 類,其中會包含很多個屬性)網絡傳輸的數據其實是”字符串“”二進制 bit 流“。

協議約定的過程,就是把結構化數據轉換成字符串 / 二進制 bit 流的過程。

把結構化數據,轉成字符串 / 二進制 bit 流,這個操作,稱為”序列化“

把字符串 / 二進制 bit 流還原成結構化數據,這個操作,稱為”反序列化“

序列化 / 反序列化具體要組織成什么樣的格式,這里要包含那些信息,預定這兩件事情的過程,就是自定義協議的過程。

為了讓程序員更方便的去約定這里的協議格式,業界給出了幾個比較好用的方案:

xml

大概的模樣如下:

<> 稱為標簽(tag),一般都是成對出現的,分別為開始標簽和結束標簽。開始標簽和結束標簽中間夾著的就是標簽的值,標簽是可以嵌套的。(標簽的名字 / 標簽的值 / 標簽的嵌套關系,都是程序員自定義的~)

xml 約定

優點:使得數據內容的可讀性和拓展性都提升了很多,標簽的名字能夠對數據起到說明作用,后續要再增加一個屬性,新添加一個標簽即可,對已有代碼影響不大~

缺點:冗余信息比較多,標簽的描述性信息,占據的空間反而比數據本身還要多了~

json

大概的模樣如下:

采用的是鍵值對結構:

鍵和值之間用:進行分割,鍵值對之間用 , 進行分割。

把若干個鍵值對使用 {? }? 括起來,此時就形成了一個 json 對象,還可以把多個 json 對象放到一起,使用 , 分隔開,并且整體使用 [ ] 括起來,就形成了一個 json 數組。

json 約定:

優點:可讀性,擴展性都很好,而且對比 xml 來說,占用的空間更少了。

缺點:雖然 json 的確比 xml 占用的空間更少了,節省了寬帶,但很明顯,這里的寬帶仍然還是有浪費的部分的,尤其是這種數組格式的 json,這種情況下往往傳輸的數據字段都是相同的,很多 key 關鍵字都是被重復傳輸的(id,name 等等...)

protobuffer

這種約定是更加節省寬帶的方式,也是效率最高的方式。

protobuffer 只是在開發階段(代碼)定義出這里都有那些資源,描述每個字段的定義。程序真正運行起來的時候,實際傳輸的數據是不包含這些描述信息的。這樣的數據都是按照二進制的方式來進行組織的。

這種方式雖然程序運行的效率會非常高,但其實并不太有利于程序員閱讀~~~

雖然 protobuffer 運行效率更高,但是使用并沒有比 json 更加廣泛,只有一些對于性能要求非常搞的場景,才會使用 protobuffer。

應用層也很多線程的協議,HTTP 這種 后面詳細介紹~

傳輸層

傳輸層中,雖然是系統內核已經實現好了的,但我們仍然需要重點進行關注,我們之前在網絡編程中,使用的 socket API 就是傳輸層提供的

端口號(Port)

端口號,是一個 2 字節的整數。標識了一個主機上進行通信的不同的應用程序。

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

端口號范圍劃分:

0 - 1023:是一些知名端口號,HTTP,FTP,SSH 等這些廣為使用的應用層協議,他們的端口號的固定的。

1024 - 65535:操作系統動態分配的端口號。我們前面在網絡編程中,客戶端程序的端口號,就是由操作系統在這個范圍內分配的。

一些有名的端口號:

SSH 服務器:22 端口

FTP 服務器:21 端口

telnet 服務器:23 端口

HTTP 服務器:80 端口

HTTPS 服務器:443 端口

我們寫程序使用端口號的時候,需要避開這些知名端口號~

UDP 協議

前面我們已經提過,UDP 協議的四個特點:無連接,不可靠傳輸,面向數據報,全雙工。

研究一個協議,我們主要是研究報文格式,基于報文格式,來了解這個協議的各個特性。

UDP 數據報 = 報頭(重點) +? 載荷(應用層數據包)

UDP 協議端格式

上面的這個圖,并不準確,是為了我們書籍教材排版方便做出的妥協,其實應該是下面這樣的:

UDP 報頭中,一共有 4 個字段,每個字段 2 個字節(一共 8 個字節)

由于 UDP 協議中使用 2 個字節(16 位)來標識端口號,端口號的取值范圍就是 0 - 655335(即這里最大值就是 64KB(2^10 = 1 KB),即,一個 UDP 數據報最大的長度,就是 64 KB,沒辦法更長了),一旦整個數據報的長度超出 64 KB,此時就可能導致數據出現階段(數據后面的部分就沒有了)

(總的 UDP 數據報最大長度是 64KB,則載荷部分實際能承擔的最大長度,應該是 64KB - 8(減去報頭的長度))

為了解決數據被截斷的問題,有兩個方案。

方案一:在應用層,把數據報進行拆分,之前一個數據報表示 N 個頁面,拆分成每一個頁面占用一個 UDP 數據報,甚至可以進一步的拆分成,一個頁面對應多個 UDP 數據報。(開發和測試的成本都很大~~)

方案二:使用 TCP 代替 UDP,TCP 沒有上述的長度限制~~

那為什么,不進行擴展呢???將 UDP 數據報,擴展成 4 個字節的長度呢???

技術上很容易實現,但要改,就要所有的系統一起改,如果一方改了,另一方不該,相互之間就無法進行通信了~~~大家都僵持住了...

校驗和:驗證數據在傳輸過程中是否正確~~~

前提是:數據在網絡傳輸的過程中,是可能出錯的!

網絡數據傳輸:本質上其實是光信號 / 電信號 / 電磁波進行傳輸

上述信號都是很可能收到干擾的。

比如,使用高低電平來表示 0 1,外界如果加上一個磁場,就有可能把高電平變為低電平,低電平變為高電平,此時, 0 -> 1,1 -> 0 出現了比特翻轉。現代的傳輸體系,其實有一系列的保護機制,來減少外界的干擾。

校驗和的作用就是用來識別出當前的數據是否在傳輸過程中出現錯誤。

注意:網絡中的校驗和,并非是簡單的按照數據的長度 / 數量來作為標準進行校驗的,一定是數據的內容會參與到其中。

嚴格的來說,校驗和只能用來“證偽”,即,只能是證明數據是出錯了,沒辦法確保這個數據 100% 是正確的。但是實踐中可以近似的認為檢驗和一致,數據就一致了。

UDP 中,校驗和是使用比較簡單的方法 - CRC 算法來完成校驗的(循環冗余校驗)

比如,要產生一個兩字節的校驗和:

加的過程中,產生的數據可能會比較大,超出了 short 兩個字節的范圍,溢出了,其實也無妨,這里不用管。

UDP 數據報發送方,在發送數據之前,先計算一邊 CRC,把算好的 CRC 值放到 UDP 數據報中。(設這個 CRC 值為 value1)

接下來,這個數據報會通過網絡傳輸到達接收端,接收端收到這個數據之后,也會按照同樣的算法,再算一次 CRC 的值,得到的結果是 value2。比較自己計算的 value2 和收到的 value1 是否一致。如果是一致的,就說明數據大概率是 ok 的。如果不一致,則傳輸過程中一定出現了錯誤。

上述 CRC 算法,為什么說?value1 和 value2 如果是一致的,數據大概率是 ok 的呢???如果只有一個 bit 位發生反轉,則 CRC 100% 能夠發現錯誤。但如果恰好有兩個 / 多個 bit 位發生反轉,有可能恰好校驗和仍然和之前的一樣~~~(這種情況比較低,可以忽略不計,但如果希望這里有更高的檢查精度,就需要使用其他更為嚴格的校驗和算法了)

md5 算法,md5 算法的背后,是有一系列的數學公式來進行計算的,此處不討論數學公式,來重點認識一下特點:

1. 定長:無論原始數據有多長,算出來的 md5 的最終值都是一個固定長度(md5 有 16 位版本,也有 32 版本,也有 64 位版本)

2. 分散:計算 md5 的過程中,原始數據,只要變化一點點,其算出來的 md5 值就會發生很大的變化差異。(這樣的特性,使得 md5 也可以作為一個字符的 hash 算法)

3. 不可逆:給一個源字符串,計算 md5 值,過程非常簡單(比 CRC 復雜一些,但整體比較簡單)但是如果給一個算好的 md5 值,還原為原始的字符串,理論上無法完成~

原始的字符串 ==》 md5 這個過程,會有很多信息量損失了,無法直接還原~

(一些在線解密 md5 的網站,本質上是通過“打表”的方式完成 --> 服務器在不停的計算各種字符串的 md5 值,然后存儲下來,我們輸入 md5 值,他就直接去數據庫里面查詢 == 》 只能破解出一些常見的一般的字符串的 md5值~)

完!

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

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

相關文章

Java Agent 注入 WebSocket 篇

Agent 如果要對其進行Agent注入的編寫&#xff0c;需要先理解三個名字premain&#xff0c;agentmain&#xff0c;Instrumentation premain方法在 JVM 啟動階段調用&#xff0c;一般維持權限的時候不會使用 agentmain方法在 JVM 運行時調用 常用的 Instrumentation實例為代理…

【深度強化學習 DRL 快速實踐】近端策略優化 (PPO)

PPO&#xff08;2017&#xff0c;OpenAI&#xff09;核心改進點 Proximal Policy Optimization (PPO)&#xff1a;一種基于信賴域優化的強化學習算法&#xff0c;旨在克服傳統策略梯度方法在更新時不穩定的問題&#xff0c;采用簡單易實現的目標函數來保證學習過程的穩定性 解決…

筆試強訓:Day2

一、字符串中找出連續最長的數字串(雙指針) 字符串中找出連續最長的數字串_牛客題霸_牛客網 #include <iostream> #include <string> #include <cctype> using namespace std;int main() {//雙指針string str;cin>>str;int nstr.size();int begin-1,l…

MySQL 詳解之 InnoDB:核心特性深度剖析 (ACID, 事務, 鎖, 外鍵, 崩潰恢復)

在 MySQL 的世界里,存儲引擎是數據庫管理系統的核心組成部分,它負責數據的存儲和提取。MySQL 支持多種存儲引擎,如 MyISAM, Memory, CSV 等,但自 MySQL 5.5 版本以來,InnoDB 成為了默認的存儲引擎,也是絕大多數應用場景的首選。 為什么 InnoDB 如此重要并被廣泛采用?因…

Java中正則表達式使用方法

1. 正則表達式概述 正則表達式&#xff08;Regular Expression&#xff0c;簡稱 Regex&#xff09;是一種用于匹配字符串的模式工具。在 Java 中&#xff0c;正則表達式通過 java.util.regex 包實現&#xff0c;主要涉及以下兩個類&#xff1a; Pattern&#xff1a;表示一個編…

使用瀏覽器的Clipboard API實現前端復制copy功能

在前端開發中&#xff0c;復制文本到剪貼板的功能通常使用瀏覽器的 Clipboard API 實現。比如 navigator.clipboard.writeText 方法。以下是一個簡單的案例&#xff0c;展示如何使用 Clipboard API 實現復制文本的功能。 基本用法 首先&#xff0c;你需要創建一個按鈕&#x…

【因果推斷】(二)CV中的應用

文章目錄 因果表征學習因果圖 (Causal Diagram)“后門準則”&#xff08;backdoor criterion&#xff09;和“前門準則”&#xff08;frontdoor criterion&#xff09;后門調整Visual Commonsense R-CNNCausal Intervention for Weakly-Supervised Semantic SegmentationCausal…

【iOS】alloc init new底層原理

目錄 前言 alloc alloc核心操作 cls->instanceSize(extraBytes) calloc obj->initInstanceIsa init 類方法&#xff1a; 實例方法&#xff1a; new 前言 筆者最近在進行對OC語言源碼的學習&#xff0c;學習源碼的過程中經常會出現一些從來沒有遇見過的函數&…

QT窗口相關控件及其屬性

widget&#xff0c;PushButton&#xff0c;lineEdit等都是基于QWidget延展出來的 并不是完整的窗口&#xff0c;而是作為窗口的一部分 真正的窗口是QMainWindow 菜單欄 Qt中的菜單欄是通過QMenuBar這個類來實現的&#xff0c;一個主窗口最多只有一個菜單欄&#xff0c;位于主…

day47—雙指針-平方數之和(LeetCode-633)

題目描述 給定一個非負整數 c &#xff0c;你要判斷是否存在兩個整數 a 和 b&#xff0c;使得 a^2 b^2 c 。 示例 1&#xff1a; 輸入&#xff1a;c 5 輸出&#xff1a;true 解釋&#xff1a;1 * 1 2 * 2 5示例 2&#xff1a; 輸入&#xff1a;c 3 輸出&#xff1a;f…

藍橋杯 20. 壓縮變換

壓縮變換 原題目鏈接 題目描述 小明最近在研究壓縮算法。他知道&#xff0c;壓縮時如果能夠使數值很小&#xff0c;就能通過熵編碼得到較高的壓縮比。然而&#xff0c;要使數值變小是一個挑戰。 最近&#xff0c;小明需要壓縮一些正整數序列&#xff0c;這些序列的特點是&a…

element-ui多個form同時驗證,以及動態循環表單注意事項

多個form同時驗證&#xff1a; validateForm(refs) {if (!refs) {return false}return new Promise((resolve, reject) > {refs.validate().then((valid) > {resolve(valid)}).catch((val) > {resolve(false)})}) }, async handleConfirm() {Promise.all([this.valid…

Spring Boot中自定義404異常處理問題學習筆記

1. 問題背景 在Spring Boot項目中&#xff0c;需要手動返回404異常給前端。為此&#xff0c;我創建了一個自定義的404異常類UnauthorizedAccessException&#xff0c;并在全局異常處理器GlobalExceptionHandler中處理該異常。然而&#xff0c;在使用Postman測試時&#xff0c;…

你學會了些什么220622?--搭建UI自動化

jenkins訪問地址&#xff1a;http://192.168.82.129:8080/ 賬號密碼&#xff1a;admin/a123456a ***** 什么是UI自動化** 使用工具或者腳本對需要測試的軟件的前端界面在預設的條件下&#xff0c;在已有的測試數據下運行系統或者應用程序&#xff0c;并獲取其前端頁面UI顯示的…

【2025計算機網絡-面試常問】http和https區別是什么,http的內容有哪些,https用的是對稱加密還是非對稱加密,流程是怎么樣的

HTTP與HTTPS全面對比及HTTPS加密流程詳解 一、HTTP與HTTPS核心區別 特性HTTPHTTPS協議基礎明文傳輸HTTP SSL/TLS加密層默認端口80443加密方式無加密混合加密&#xff08;非對稱對稱&#xff09;證書要求不需要需要CA頒發的數字證書安全性易被竊聽、篡改、冒充防竊聽、防篡改…

JavaFX 第一篇 Hello World

1、簡介 JavaFX 是一個用于構建客戶端應用程序的 Java 庫&#xff0c;作為 Java 標準庫的一部分&#xff08;JDK 8 到 10&#xff09;&#xff0c;從 JDK 11 開始&#xff0c;JavaFX 將以獨立模塊發布&#xff0c;將不再包含在 JDK標準庫中&#xff0c;他是 Java 應用程序開發的…

SQL實戰:02之連續數問題求解

文章目錄 概述題目:體育館的人流量題解步驟一&#xff1a;構造出一個連續序列步驟二&#xff1a;找出符合條件的組的序號步驟三&#xff1a;fetch結果&#xff0c;使用內連接過濾出符合條件的記錄。完整SQL 題目二&#xff1a;連續出現的數字題解步驟一&#xff1a;分區并構建連…

STM32 的 GPIO和中斷

GPIO的簡單介紹 內部結構 施密特觸發器&#xff08;TTL肖特基觸發器&#xff09; 的工作原理&#xff1a; 施密特觸發電路&#xff08;簡稱&#xff09;是一種波形整形電路&#xff0c;當任何波形的信號進入電路時&#xff0c;輸出在正、負飽和之間跳動&#xff0c;產生方波或…

Server - 優雅的配置服務器 Bash 環境(.bashrc)

歡迎關注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/147335592 免責聲明&#xff1a;本文來源于個人知識與公開資料&#xff0c;僅用于學術交流&#xff0c;歡迎討論&#xff0c;不支持轉載。 登錄服…

使用PyTorch實現圖像增廣與模型訓練實戰

本文通過完整代碼示例演示如何利用PyTorch和torchvision實現常用圖像增廣方法&#xff0c;并在CIFAR-10數據集上訓練ResNet-18模型。我們將從基礎圖像變換到復雜數據增強策略逐步講解&#xff0c;最終實現一個完整的訓練流程。 一、圖像增廣基礎操作 1.1 準備工作 #matplotli…