網絡層協議

網絡層協議

  • IP協議
    • 基本概念
    • 協議頭格式
    • 網段劃分
    • 特殊的IP地址
    • IP地址的數量限制
    • 私有IP地址和公網IP地址
    • 路由
    • IP協議頭格式后續

在復雜的網絡環境中確定一個合適的路徑

IP協議

承接上文,TCP協議并不會直接將數據傳遞給對方,而是交付給下一層協議,那么TCP協議扮演了什么角色呢?
先介紹IP地址的作用:

  1. 定位主機
  2. 具有將一個數據包跨網絡可靠地傳遞給對方的能力

IP地址有這個能力,但是并不一定能夠做到,有很大概率可以做到;此時TCP協議就為此出謀劃策,IP去執行,如此以來便能夠做到

所以TCP扮演策略,IP付出實際行動

在這里插入圖片描述

路徑選擇中,目的IP非常重要,決定了路徑該如何走;
IP=目標網絡+目標主機
怎么理解目標網絡和目標主機呢?

舉個栗子
你打算去沈陽游玩,沈陽就是目標網絡;游玩地點比如故宮,故宮就是目標主機

基本概念

主機: 配有IP地址, 但是不進行路由控制的設備;
路由器: 即配有IP地址, 又能進行路由控制; 節點: 主機和路由器的統稱

協議頭格式

在這里插入圖片描述

  • 4位版本號(version): 指定IP協議的版本, 對于IPv4來說, 就是4
  • 4位首部長度(header length): IP頭部的長度是多少個32bit, 也就是 length * 4 的字節數. 4bit表示最大的數字是15, 因此IP頭部最大長度是60字節
  • 8位服務類型(Type Of Service): 3位優先權字段(已經棄用), 4位TOS字段, 和1位保留字段(必須置為0). 4位TOS分別表示: 最小延時, 最大吞吐量, 最高可靠性, 最小成本. 這四者相互沖突, 只能選擇一個. 對于ssh/telnet這樣的應用程序, 最小延時比較重要; 對于ftp這樣的程序, 最大吞吐量比較重要
  • 16位總長度(total length): IP數據報整體占多少個字節
  • 16位標識(id),3位標志,13位片偏移后面詳細介紹
  • 8位生存時間(Time To Live, TTL): 數據報到達目的地的最大報文跳數. 一般是64. 每次經過一個路由, TTL -= 1, 一直減到0還沒到達, 那么就丟棄了. 這個字段主要是用來防止出現路由循環
  • 8位協議: 表示上層協議的類型
  • 16位頭部校驗和: 使用CRC進行校驗, 來鑒別頭部是否損壞
  • 32位源地址和32位目標地址: 表示發送端和接收端
  • 選項字段(不定長, 最多40字節)

協議最重要的兩個問題:
如何解包?
IP協議有4位首部長度,16位總長度;解包輕松完成

如何分用(交付)?
IP協議報頭中的8位協議表示上層的協議類型,分用也可輕松完成

網段劃分

IP地址分為兩個部分, 網絡號和主機號

  • 網絡號: 保證相互連接的兩個網段具有不同的標識
  • 主機號: 同一網段內, 主機之間具有相同的網絡號, 但是必須有不同的主機號

介紹網段劃分之前,先舉個栗子
有一天,你在校園里把自己的學生卡不小心給丟了,結果被張三給撿到;此時如果張三想要物歸原主,他有兩種做法:
第一種做法:見到一個同學就問對方這張學生卡是不是對方的,這種做法效率太低,不可取;
第二種做法:在學校每個學生都有學號來標識自己,學號被劃分幾部分:學院,專業,班級,人數;恰好學生卡上也有你的學號;張三并不知道你是什么學院的,所以他只能將證件交給學院的學生會,院學生會再將證件交到校學生會,本學院的成員肯定是知道此證件是本院的學生,最后將證件歸還給你,如此一來,效率大大提高

在這里插入圖片描述

校學生會是目標網絡,院學生會就是目標主機;院學生會是目標網絡,學生就是目標主機

所以互聯網中每一臺主機都要隸屬于某一個子網,在子網中便可快速定位到每個主機

網段劃分就是為了劃分出每個子網,未來方便定位主機

在這里插入圖片描述

  • 不同的子網其實就是把網絡號相同的主機放到一起.
  • 如果在子網中新增一臺主機, 則這臺主機的網絡號和這個子網的網絡號一致, 但是主機號必須不能和子網中的其他主機重復

通過合理設置主機號和網絡號, 就可以保證在相互連接的網絡中, 每臺主機的IP地址都不相同

那么問題來了, 手動管理子網內的IP, 是一個相當麻煩的事情
有一種技術叫做DHCP, 能夠自動的給子網內新增主機節點分配IP地址, 避免了手動管理IP的不便一般的路由器都帶有DHCP功能. 因此路由器也可以看做一個DHCP服務器

因為IP地址一共就43億多,所以為了提高利用率,提出了劃分方案, 稱為CIDR(Classless Interdomain Routing)

  • 引入一個額外的子網掩碼(subnet mask)來區分網絡號和主機號
  • 子網掩碼也是一個32位的正整數. 通常用一串 “0” 來結尾
  • 將IP地址和子網掩碼進行 “按位與” 操作, 得到的結果就是網絡號
  • 網絡號和主機號的劃分與這個IP地址是A類、B類還是C類無關

舉個栗子

IP地址140.250.25.68
子網掩碼255.255.255.240
網絡號140.250.25.68
子網地址范圍140.250.25.64~140.250.25.79

計算過程
在這里插入圖片描述

IP地址與子網掩碼做與運算可以得到網絡號, 主機號從全0到全1就是子網的地址范圍

特殊的IP地址

  • 將IP地址中的主機地址全部設為0, 就成為了網絡號, 代表這個局域網
  • 將IP地址中的主機地址全部設為1, 就成為了廣播地址, 用于給同一個鏈路中相互連接的所有主機發送數據包
  • 127.*的IP地址用于本機環回(loop back)測試,通常是127.0.0.1

IP地址的數量限制

我們知道, IP地址(IPv4)是一個4字節32位的正整數. 那么一共只有 2的32次方 個IP地址, 大概是43億左右. 而TCP/IP協議規定, 每個主機都需要有一個IP地址
這意味著, 一共只有43億臺主機能接入網絡么?
實際上, 由于一些特殊的IP地址的存在, 數量遠不足43億; 另外IP地址并非是按照主機臺數來配置的, 而是每一個網卡都需要配置一個或多個IP地址
CIDR在一定程度上緩解了IP地址不夠用的問題(提高了利用率, 減少了浪費, 但是IP地址的絕對上限并沒有增加), 仍然不是很夠用. 這時候有三種方式來解決

  • 動態分配IP地址: 只給接入網絡的設備分配IP地址. 因此同一個MAC地址的設備, 每次接入互聯網中, 得到的IP地址不一定是相同的
  • NAT技術
  • IPv6: IPv6并不是IPv4的簡單升級版. 這是互不相干的兩個協議, 彼此并不兼容; IPv6用16字節128位來表示一個IP地址; 但是目前IPv6還沒有普及

私有IP地址和公網IP地址

如果一個組織內部組建局域網,IP地址只用于局域網內的通信,而不直接連到Internet上,理論上 使用任意的IP地址都可以,但是RFC 1918規定了用于組建局域網的私有IP地址

  • 10.*,前8位是網絡號,共16,777,216個地址
  • 172.16.到172.31.,前12位是網絡號,共1,048,576個地址
  • 192.168.*,前16位是網絡號,共65,536個地址

包含在這個范圍中的, 都成為私有IP, 其余的則稱為全局IP(或公網IP)

為了詳細理解私有IP和共有IP,先舉個栗子
如果家里想要連網,先要聯系附近的運營商來裝路由器,路由器裝好之后,需要先設置賬號和密碼,準備工作全部完成之后,便可找到自家的IP賬號輸入密碼聯通網路;家里面的各個設備連接網絡之后,也就組成了一個子網

結合上面的內容:
一般在一個子網中,管理子網中IP的設備通常是路由器
目標網絡和子網掩碼,子網中的主機都會被路由器管理;目標網絡和子網掩碼都是在路由器內部已經配置過的

路由器的作用分為三點:

  1. 轉發
  2. DHCP|組建局域網
  3. NAT

在這里插入圖片描述

介紹一下數據路由的過程
假設從左側主機192.168.201/24(私網)向122.77.241.3/24(公網)發送數據,有了源IP和目的IP,數據很快便可傳遞到目的主機中,但是卻存在一個問題,公網和私網是不能同時出現的;而且如果目的主機進行應答,又該怎么辦呢?

路由器中存在兩個IP:LAN口(對內),WAN口(對外)
真實的路由過程如下
在這里插入圖片描述

數據在經過路由器進行轉發時,目的IP不變,源IP會自動轉換為路由器的WAN口IP,反過來亦是如此;這個操作也稱為NAT計數;上圖只是一小部分子網,往上可以連接上城市,省份,國家和上面舉的例子(學生證丟失)一樣

  • 一個路由器可以配置兩個IP地址, 一個是WAN口IP, 一個是LAN口IP(子網IP)
  • 路由器LAN口連接的主機, 都從屬于當前這個路由器的子網中
  • 不同的路由器, 子網IP其實都是一樣的(通常都是192.168.1.1). 子網內的主機IP地址不能重復. 但是子網之間的IP地址就可以重復
  • 每一個家用路由器, 其實又作為運營商路由器的子網中的一個節點. 這樣的運營商路由器可能會有很多級, 最外層的運營商路由器, WAN口IP就是一個公網IP
  • 子網內的主機需要和外網進行通信時, 路由器將IP首部中的IP地址進行替換(替換成WAN口IP), 這樣逐級替換, 最終數據包中的IP地址成為一個公網IP. 這種技術稱為NAT(Network Address Translation,網絡地址轉換)

抽象的圖解如下

在這里插入圖片描述

路由

在復雜的網絡結構中, 找出一條通往終點的路線
路由的過程, 就是這樣一跳一跳(Hop by Hop) “問路” 的過程
所謂 “一跳” 就是數據鏈路層中的一個區間. 具體在以太網中指從源MAC地址到目的MAC地址之間的幀傳輸區間

舉個栗子
假如你下了火車,準備去學校,這時你只能通過問路的方式得知學校的地址;當你詢問一個陌生人時會有三種答案:不知道;不知道,但是告知你有人知道;不知道,但是知道到達學校過程中某一地點的地址

在網絡的路由中,只存在后面兩種情況

在這里插入圖片描述

IP數據包的傳輸過程也和問路一樣

  • 當IP數據包, 到達路由器時, 路由器會先查看目的IP
  • 路由器決定這個數據包是能直接發送給目標主機, 還是需要發送給下一個路由器
  • 依次反復, 一直到達目標IP地址

那么如何判定當前這個數據包該發送到哪里呢? 這個就依靠每個節點內部維護一個路由表
在這里插入圖片描述

  • destination:目標IP
  • gateway:路由選擇
  • genmask:子網掩碼
  • flags:使用狀態
  • Iface:接口

路由的過程

  1. 遍歷路由表
  2. 目的IP&路由表中的子網掩碼->確定報文的目標網絡
  3. 對比結果是否和目標IP相等
  4. 通過Iface接口發出報文

IP協議頭格式后續

網絡層的下一層數據鏈路層,MAC幀協議規定有效載荷不能超過1500字節(MTU)

網絡層并不能決定單個報文的大小,TCP決定單個報文的大小;數據鏈路層有規定只能接收那么多;網絡層只能夾在中間,提出解決方案

當IP報頭+IP有效載荷超過1500字節時:
IP分片和組裝,自己的IP層進行分片,對方的IP層進行組裝

  • 16位標識(id): 唯一的標識主機發送的報文. 如果IP報文在數據鏈路層被分片了, 那么每一個片里面的這個id都是相同的
  • 3位標志字段: 第一位保留(保留的意思是現在不用, 但是還沒想好說不定以后要用到). 第二位置為1表示禁止分片, 這時候如果報文長度超過MTU, IP模塊就會丟棄報文. 第三位表示"更多分片", 如果分片了的話, 最后一個分片置為1, 其他是0. 類似于一個結束標記
  • 13位分片偏移(framegament offset): 是分片相對于原始IP報文開始處的偏移. 其實就是在表示當前分片在原報文中處在哪個位置. 實際偏移的字節數是這個值 * 8 得到的. 因此, 除了最后一個報文之外, 其他報文的長度必須是8的整數倍(否則報文就不連續了)

報文分片簡單,組裝是個大問題
如何得知報文被分片?
3位標志中如果更多分片位1,說明該標識的報文進行分片;如果更多分片為0,并且13位片偏移大于零也標識報文進行分片,除此之外都沒有分片

同一個報文的分片如何被識別出來?
16位標識

每個分片的位置,有沒有收全或者丟失?
更多分片為1,片偏移為0是第一個分片;更多分片為0,片偏移大于零是最后一個分片;當前的起始位置+分片自身長度=下一個報文中填充的分片的偏移量大小,如果對不上就說明分片丟失

如何進行正確的組裝?
按照片偏移進行升序排序即可

如何保證組裝的報文是正確的?
TCP/IP存在校驗和

分片這一操作并不妥善,對于TCP/UDP/IP一個報文被拆分為多份,任意一個分片丟失,都會造成組裝失敗,從而導致報文重新發送

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

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

相關文章

機器學習基礎(四)

KNN算法 KNN:K-Nearest Neighbor,最近領規則分類。 為了判斷位置實例的類別,以所有已知類別的實例作為參照選擇參數K。計算未知實例與所有已知實例的距離。(一般采用歐氏距離)選擇最近K個已知實例。根據少數服從多數的投票法則,讓未知實例歸類為K個最近鄰樣本中最多數的類…

音視頻FAQ(三):音畫不同步

摘要 本文介紹了音畫不同步問題的五個因素:編碼和封裝階段、網絡傳輸階段、播放器中的處理階段、源內容產生的問題以及轉碼和編輯。針對這些因素,提出了相應的解決方案,如使用標準化工具、選擇強大的傳輸協議、自適應緩沖等。此外&#xff0…

uniapp微信小程序區分正式版,開發版,體驗版

小程序代碼區分是正式版,開發版,還是體驗版 通常正式和開發環境需要調用不同域名接口,發布時需要手動更換 或者有些東西不想在正式版顯示,只在開發版體驗版中顯示,也需要去手動隱藏 官方沒有明確給出判斷環境的方法&a…

SciencePub學術 | CCF推薦重點計算機SCIE征稿中

SciencePub學術 刊源推薦: CCF推薦重點計算機SCIE征稿中!信息如下,錄滿為止: 一、期刊概況: CCF推薦重點SCIE簡介 【期刊簡介】IF:4.0,JCR2區,中科院3區; 【版面類型】正刊&#…

Swift 基礎

工程目錄 請點擊下面工程名稱,跳轉到代碼的倉庫頁面,將工程 下載下來 Demo Code 里有詳細的注釋 點擊下載代碼:swift-01

記錄一下基于jeecg-boot3.0的待辦消息移植記錄

因為之前沒有記錄,所以還要看代碼進行尋找,比較費勁,所以今天記錄一下: 1、后端 SysAnnouncementController 下面函數增加待辦的幾個顯示內容給前端用 具體代碼如下: /*** 功能:補充用戶數據&#xff0c…

由小波變換模極大值重建信號

給定信號, 令小波變換的尺度 則x(t)的二進小波變換為 令為取模極大值時的橫坐標,那么就是模極大值。 目標是由坐標、模極大值及最后一級的低頻分量重建信號x(t) 為了重建x(t),假定有一信號集合h(t),該集合中信號的小波變換和x(…

打印出二進制的奇數位和偶數位

void print(int a) {int i0;printf("奇數位:");for(i30;i>0;i-2){printf("%d ",(a>>i)&1);}printf("\n");printf("偶數位:");for(i31;i>1;i-2){printf("%d ",(a>>i)&1);} …

人臉圖像處理

1,人臉圖像與特征基礎 人臉圖像的特點 規律性: 人的兩只眼睛總是對稱分布在人臉的上半部分,鼻子和嘴唇中心點的連線基本與兩眼之間的連線垂直,嘴絕對不會超過眼鏡的兩端點(雙眼為d,則雙眼到嘴巴的垂直距離一般在0.8-1.25) 唯一性 非侵擾與便利性 可擴展性 人臉圖像的應用 身份…

Linux MQTT智能家居(溫度,濕度,環境監測,攝像頭等界面布局設置)

文章目錄 前言一、溫度濕度曲線布局二、環境監測界面布局三、攝像頭界面布局總結 前言 本篇文章來完成另外三個界面的布局設置。 這里會使用到 feiyangqingyun的一些控件庫。 一、溫度濕度曲線布局 TempHumtiy.h: #ifndef TEMPHUMTIY_H #define TEMPHUMTIY_H#include <…

pprof 三把刀

pprof 三把刀 看內存 go tool pprof http://127.0.0.1:6060/debug/pprof/heap?seconds30 看cpu go tool pprof http://127.0.0.1:6060/debug/pprof/profile?seconds30 看協程 go tool pprof http://localhost:6060/debug/pprof/goroutine 端口是自定義的&#xff0c;看看…

Golang原生實現JA3指紋修改,并支持Proxy代理

起因 抓取某個HTTPS網站的時候 開啟charles代理能夠抓取成功,關閉被風控 通過檢測,懷疑可能是tls的時候有區別 嘗試 golang的http中,Transport.TLSClientConfig是可以自定義設置的 但起初通過隨意設置并不能繞過風控 困難 使用golang的http客戶端,修改DialTLSContext函數的…

使用Python批量將Word文件轉為PDF文件

說明&#xff1a;在使用Minio服務器時&#xff0c;無法對word文件預覽&#xff0c;如果有需要的話&#xff0c;可以將word文件轉為pdf文件&#xff0c;再存儲到Minio中&#xff0c;本文介紹如何批量將word文件&#xff0c;轉為pdf格式的文件&#xff1b; 安裝庫 首先&#xff…

神經網絡基礎-神經網絡補充概念-12-向量化邏輯回歸的梯度輸出

代碼實現 import numpy as npdef sigmoid(z):return 1 / (1 np.exp(-z))def compute_loss(X, y, theta):m len(y)h sigmoid(X.dot(theta))loss (-1/m) * np.sum(y * np.log(h) (1 - y) * np.log(1 - h))return lossdef compute_gradient(X, y, theta):m len(y)h sigmoi…

Python系統學習1-9-類一之類語法

一、類之初印象 1、類就是空表格&#xff0c;將變量&#xff08;列名&#xff09;和函數&#xff08;行為&#xff09;結合起來 2、創建對象&#xff0c;表達具體行 3、創建類就是創建數據的模板 --操作數據時有提示 --還能再組合數據的行為 --結構更加清晰 4、類的內存分配…

vue項目根據word模版導出word文件

一、安裝依賴 //1、docxtemplaternpm install docxtemplater pizzip -S//2、jszip-utilsnpm install jszip-utils -S//3、pizzipnpm install pizzip -S//4、FileSaver npm install file-saver --save二、創建word模版 也就是編輯一個word文檔&#xff0c;文檔中需要動態取值的…

【JAVA】數組練習

? 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主頁&#xff1a;小胡_不糊涂的個人主頁 &#x1f4c0; 收錄專欄&#xff1a;淺談Java &#x1f496; 持續更文&#xff0c;關注博主少走彎路&#xff0c;謝謝大家支持 &#x1f496; 數組練習 1. 數組轉字符串2. 數組拷貝3.…

arm-linux-gnueabihf-g++ gcc編譯、優化命令 匯總

gcc優化選項&#xff0c;可在編譯時間&#xff0c;目標文件長度&#xff0c;執行效率三個維度&#xff0c;進行不同的取舍和平衡。 gcc 常用編譯選項 arm-linux-gnueabihf-g -O3 -marcharmv7-a -mcpucortex-a9 -ftree-vectorize -mfpuneon -mfpuvfpv3-fp16 -mfloat-abihard -…

js的FileSaver.saveAs()方法:監聽保存進度,進度條等方法

在使用FileSaver.saveAs保存表格到本地時&#xff0c;如果想要獲取導出/保存進度可以如下操作 FileSaver.js的saveAs()方法是一個異步操作&#xff0c;它將文件保存到用戶設備上。在調用saveAs()方法后&#xff0c;可以通過使用回調函數、Promise、或監聽相關事件來確定saveAs(…

在vue中使用swiper輪播圖(搭配watch和$nextTick())

在組件中使用輪播圖展示圖片信息&#xff1a; 1.下載swiper,5版本為穩定版本 cnpm install swiper5 2.在組件中引入swiper包和對應樣式&#xff0c;若多組件使用swiper&#xff0c;可以把swiper引入到main.js入口文件中&#xff1a; import swiper/css/swiper.css //引入swipe…