網絡傳輸基本流程(封裝,解包)+圖解(同層直接通信的證明),報頭分離問題,協議定位問題,協議多路復用

目錄

網絡傳輸基本流程

引入

封裝

過程梳理

圖解

報文

解包

過程梳理

圖解 -- 同層直接通信的證明

總結

解包時的報頭分離問題

舉例 -- 倒水

介紹

自底向上傳輸時的協議定位問題

介紹

解決方法

協議多路復用

介紹

優勢?


網絡傳輸基本流程

引入

首先,我們明確一個前提,協議如何被體現,就是通過在數據前添加報頭實現的 --?協議的概念+本質+作用+最終表現形式,網絡問題(技術+應用+解決的協議+存在原因),主機的對稱性-CSDN博客

所以,每經過一層協議,就會添加一段報頭

封裝

過程梳理

我們根據信息傳輸的順序自頂向下

首先是應用層

  • 因為我們一般都是使用某種軟件來進行通信,而軟件一般都會進行更新,但版本更新不是強制的,所以會存在新/老版本都要向服務器請求數據的情況
  • 那么為了不亂套(新老版本的提供的功能不同,兩者是有差異的),就肯定會為它加上一個版本字段,確保不同版本的軟件能夠正確地解析和處理收到的數據
  • 而這個字段,正是在應用層的協議
  • 所以數據到了應用層后,會添加應用層協議的報頭
  • 該報頭內就會有版本信息

然后來到傳輸層,該層用來保證可靠性

  • 這個可靠性不僅僅保證數據成功運輸,也包括信息的發送順序等等(因為順序亂了,意思就完全不一樣了)
  • 比如:
  • 所以,協議會定義一個序號,用于為信息排序
  • 當數據來到傳輸層,依然會添加該層協議的報頭
  • 報頭內包含一系列字段,其中就有序號

同理,當數據來到網絡層時(他解決主機定位問題)

  • 數據中依然會繼續添加該層協議的報頭
  • 報頭內包括了自己的身份,目標主機是哪個等信息

鏈路層也是一樣的

圖解

  • 每層新添加的報頭都在最外側
  • 到達每層的數據(也叫做報文)都不一樣
報文

指在網絡中傳輸的數據單元,報文=報頭+有效載荷

  • 注意,這個報頭僅僅是當前層協議的報頭,剩下的數據就是有效載荷
  • 有效載荷每經歷一層,就會增加字段,增加的恰好是上一層添加的報頭:

完成了這四層后,也就完成了封裝的過程(將數據一層一層用報頭包裹在里面)

解包

過程梳理

當我們將報文發送給對方主機后,對方主機就開始自底向上傳輸

  • 恰好,報頭可以被一層一層地解析
  • 從圖中可以看到,我們最外層的協議報頭,恰好和[在對方主機中遇到的第一層協議]對應上了
  • 又因為,這段報文在鏈路層就已經是二進制序列了,所以指針可以指向這塊內存
  • 不僅如此,我們還可以通過指針的強制類型轉換,精準地指向該層的協議報頭
  • 剩下的部分,就是有效載荷,而有效載荷的開頭,就是上一層的協議報頭
  • 之后將有效載荷交給自己的上一層
  • 因為各層協議都是匹配的,重復上述過程,就可以準確地解碼出每層對應的報頭(之前一層一層包起來,現在再一層一層解開)

圖解 -- 同層直接通信的證明

注意看,同層之間,發送的和收到的是同樣的報文

這不就相當于同層之間在進行直接通信嗎?

所以,也就證明了 --? 在邏輯上,每層之間根據約定在進行通信

和封裝對應的,以上過程就被叫做解包?

總結

所以,通信的過程就是不斷進行封裝和解包

?

解包時的報頭分離問題

舉例 -- 倒水

如果我們要把多次倒入的水,再分離出來,這是很難的事情

但如果我們將每次倒入的水都用容器裝起來,再將容器扔進去,再想分離就很簡單了

介紹

而在網絡通信中的封裝和分離過程也是同理

  • 在封裝的時候,就應該考慮之后該如何分離

比如:

  • 協議里就規定好報頭的大小 / 記錄當前報頭大小和報文大小

?

自底向上傳輸時的協議定位問題

介紹

  • 我們經過協議封裝后,得到的報頭是特定協議的(具體選擇哪個協議我們不用管)
  • 但是將報文發送給對方主機后,下一層如何知道交給上一層的哪個協議呢
  • 畢竟每一層的協議有很多,但我們必須交給封裝數據的那個協議(必須要一一對應才能進行通信)

解決方法

所以,協議里還需要記錄當前協議是誰

  • 也就是在報頭里增加一個標識字段,該字段指示上層協議的類型
  • 從上到下傳輸時,下一層記錄是上一層的哪一個協議交給我的
  • 然后從下到上傳輸時,該層解析自己的報頭后,就可以知道自己該交給誰了

而這個協議標識(也就是決定將有效荷載交給上層哪個協議的能力),是實現協議多路復用的關鍵

協議多路復用

介紹

指在通信過程中,通過使用不同的協議標識來區分和識別多個上層協議的技術

  • 確保了在傳輸中的數據,能夠被正確地解析和交付給相應的協議進行處理

優勢?

  • 可以同時支持多種上層協議,使得網絡更加靈活和可擴展
  • 不同的應用和服務可以使用不同的協議,而這些協議可以在同一通信通道上共存,通過協議標識字段確保數據被正確地路由和處理

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

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

相關文章

VS查看C++頭文件(.h文件)的函數列表

這里使用的是VS2019舉例 如下圖查看Actor.h文件中的函數列表 設置步驟如下圖

【d35】【Java】【力扣】28. 找出字符串中第一個匹配項的下標

題目 給你兩個字符串 haystack 和 needle ,請你在 haystack 字符串中找出 needle 字符串的第一個匹配項的下標(下標從 0 開始)。如果 needle 不是 haystack 的一部分,則返回 -1 。 示例 1: 輸入:haystac…

【大數據】通過 docker-compose 快速部署 MinIO 保姆級教程

文章目錄 一、概述二、MinIO 與 Ceph 對比1)架構設計對比2)數據一致性對比3)部署和管理對比4)生態系統和兼容性對比 三、前期準備1)部署 docker2)部署 docker-compose 四、創建網絡五、MinIO 編排部署1&…

【SQL】608. 樹節點(流控制語句 CASE + IF語句)

前述 知識點推薦學習: sql中的 IF 條件語句的用法 MySQL:if語句、if…else語句、case語句,使用方法解析 題目描述 leetcode 題目:608. 樹節點 思路 關鍵點:如何確定有沒有子節點 根節點:父節點為空內節…

基于Redo log Undo log的MySQL的崩潰恢復

基于Redo log & Undo log的MySQL的崩潰恢復 Redo log Undo log Redo log 重做日志,記錄,修改過的數據 Undo log 回滾日志,記錄修改之前的數據 兩個我不做詳細的介紹了,redo log就是記錄哪些地方被修改了 undo log是記錄修改之前我們的數據長什么樣 更新流程 我們來捋一…

python封裝,繼承,復寫詳解

目錄 1.封裝 2.繼承 復寫和使用父類成員 1.封裝 class phone:__voltage 0.5def __keepsinglecore(self):print("單核運行")def callby5g(self):if self.__voltage > 1:print("5g通話開啟")else:self.__keepsinglecore()print("不能開啟5g通…

Redis集群(主從)

1.主從集群 集群結構: 一.單機安裝redis 1.上傳壓縮包并解壓,編譯 tar -xzf redis-6.2.4.tar.gz cd redis-6.2.4 make && make install 2.修改redis.config的配置并啟動redis # 綁定地址,默認是127.0.0.1,會導致只能在本地訪問。…

Tomcat布署及優化-----JDK和Tomcat

1.Tomcat簡介 Tomcat 是 Java 語言開發的,Tomcat 服務器是一個免費的開放源代碼的 Web 應用服務器,Tomcat 屬于輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,是開發和調試 JSP 程序的首選。一般來說&…

C++ //練習 10.2 重做上一題,但讀取string序列存入list中。

C Primer(第5版) 練習 10.2 練習 10.2 重做上一題,但讀取string序列存入list中。 環境:Linux Ubuntu(云服務器) 工具:vim 代碼塊 /******************************************************…

Vue前端加密后的數據發送到服務器端

首先,定義了一個名為 PUBLIC_KEY 的公鑰和一個名為 PRIVATE_KEY 的私鑰。然后,通過 JSEncrypt 創建了兩個實例 encrypt 和 decrypt,分別用于加密和解密操作。 對于加密操作,調用了 encrypt.setPublicKey() 方法設置公鑰&#xff…

升級Centos7的openssh到openssh-9.6p1版本 shell腳本 漏掃整改

升級Centos7的openssh到openssh-9.6p1版本 shell腳本 漏掃整改 #!/bin/bash# 聲明: 該腳本適用于升級Centos7的openssh到openssh-9.6p1版本# 定義源碼包版本號 OPENSSH_VERSIONopenssh-9.6p1 OPENSSL_VERSIONopenssl-3.2.1 ZILB_VERSIONzlib-1.3.1# 安裝編譯環境 yum -y insta…

【前端面試題5】利用 border 屬性畫一個三角形

舉例1:利用 border 屬性畫一個三角形(小技巧) 完整代碼如下: div{width: 0;height: 0;border: 50px solid transparent;border-top-color: red;border-bottom: none; }步驟如下: (1)當我們設…

【QT+QGIS跨平臺編譯】之五十六:【QGIS_CORE跨平臺編譯】—【qgsmeshcalclexer.cpp生成】

文章目錄 一、Flex二、生成來源三、構建過程一、Flex Flex (fast lexical analyser generator) 是 Lex 的另一個替代品。它經常和自由軟件 Bison 語法分析器生成器 一起使用。Flex 最初由 Vern Paxson 于 1987 年用 C 語言寫成。 “flex 是一個生成掃描器的工具,能夠識別文本中…

Android 拍照本地圖片選擇框架適配

前言 通常技術方案的選擇、會帶來后續一些不可控的東西,這也是沒法避免的,程序開發者中同時面對、測試、領導、產品各種要求。同時在網絡上查找的資料也只是很舊的,不一定適合新設備,需要推倒重新弄 1、解決方案通過意圖選擇器做…

day6 數組 嵌套循環

1&#xff1a;打印楊輝三角 91 int arr[6][6];92 int i,j0;93 for(i0;i<6;i)94 {95 for(j0;j<i;j) 96 {97 if(j0||ij)98 {99 arr[i][j]1; …

2024-3-4 如何寫出具有python風格的代碼

寫出具有python風格的代碼 什么是python風格如何寫出具有python風格的自定義數據類型 什么是python風格 python風格是指自定義的數據類型表現得得與內置類型一樣。比如&#xff0c;我創建了一個類&#xff0c;它的實例不用調用類的方法就可以實現迭代、切片&#xff0c;可以直…

推特API(Twitter API)對接說明,用戶code To Token換取

前期準備 提前準備、說明&#xff1a;目前對接推特api開發門戶分為3個版本&#xff0c;分別是免費的&#xff0c;100美金一個月的基礎版以及5000美金一個月的企業版&#xff0c;免費的目前就兩個接口可以調用&#xff0c;所以想要對接和使用推特最基本的也需要付100美元一個月…

百度百科人物創建要求是什么?

百度百科作為我國最大的中文百科全書&#xff0c;其收錄的人物詞條要求嚴謹、客觀、有權威性。那么&#xff0c;如何撰寫一篇高質量的人物詞條呢&#xff1f;本文伯樂網絡傳媒將從內容要求、注意事項以及創建流程與步驟三個方面進行詳細介紹。 一、內容要求 1. 基本信息&#…

什么是 web 應用的 type-ahead search help

在 Web 前端設計領域&#xff0c;type-ahead search help&#xff08;又稱為自動完成或即時搜索&#xff09;是一種用戶界面功能&#xff0c;它能夠在用戶輸入搜索詞的同時&#xff0c;實時提供搜索建議或結果。這種功能極大地提升了用戶體驗&#xff0c;因為它可以幫助用戶快速…

LeetCode每日一題【c++版】- 用隊列實現棧與用棧實現隊列

用隊列實現棧 題目描述 請你僅使用兩個隊列實現一個后入先出&#xff08;LIFO&#xff09;的棧&#xff0c;并支持普通棧的全部四種操作&#xff08;push、top、pop 和 empty&#xff09;。 實現 MyStack 類&#xff1a; void push(int x) 將元素 x 壓入棧頂。int pop() 移除…