OSI Network Layer 網絡層

2023-11-13

OSI 網絡層

網絡層數據報

回憶一下,在數據鏈路層,數據是以幀(frame)的形式組織起來的。若還不清楚,可以去看看這篇 OSI Datalink Layer 數據鏈路層。那這邊要介紹的,是網絡層的數據報文,首先來看看 packet 的結構。

IP 數據報結構

這邊說的 packet 只是一個單位。而在網絡層傳輸的 packet 叫做 IP 數據報。

下圖就是 packet 結構 :

現在就一一來看看這樣一個 IP 數據報各個字段的用途跟涵意吧!

IP 數據報分為兩部分,首部和數據部分。以下是對於首部的字段介紹:

  1. version : 表示IP報所使用的IP協議版本。現在有0100(IPv4),0110(IPv6)。
  2. IHL(Internet Header Length) : 表示首部長度。4b 最多表示 15(1111),而這邊的單位是以一行來算,也就是 4B 為一個字節。所以 15 的意思是說,首部最多可以有 15*4=60 個字節,而 60-20-40,是說扣掉固定部分 20 個字節,可變部分最多可以有 40B。
  3. Service Type : 後期使用較少, 這邊不做介紹。
  4. Total length : 指IP報文的總長度,最多是65535B(2^16-1),但實際上,因為我們其實是把數據報放到數據鏈路層的幀結構中,所以一般不會超過 1500 個字節。
  5. Identification : 因為IP是無可靠服務,報文不可以按序接收(TCP可以實現按序接收),但當報文長度超過MTU而必須分片時,這欄位來標識多個分片是否屬於同一個報文,比如A報文被分成A1和A2,那麼A1和A2的Identification是相同的。Flags和Fragment Offest 結合實現在接受端組合分片報文
  6. Flags : 这个地方的内容为『0DM』,其意义为:
  1. 0: 不可用
  2. D:若為 0 表示可以分片,若為 1 表示不可分片
  3. M:若為 0 表示此 IP數據報為最後分片,若為 1 表示非最後分片
  1. Fragment Offset : 表示該 IP 包在該組分片包中位置,接收端靠此來組裝還原 IP 包。這個字段是以 8B 為單位的。
  2. TTL(Time To Live) : 表示數據報能夠在網絡中經過多少個路由器。不過其實要通過 255 個路由器也很難。
  3. Protocol : 指定數據報該交由網絡層的哪一種協議處理。
  4. Header checksum : 因為可靠性極低,後期使用較少, 這邊不做介紹。
  5. Source IP addr : 源 ip 地址
  6. Destination IP addr : 目標 ip 地址

以上都是一個 IP 數據報所包含的固定首部

IP 地址

IP 地址是 32 位的,通常分 8 位寫成四部分。像是 192.168.1.7。而 IP 地址包含二部分,分別是網絡號和主機號。

IP 地址分類

IP 地址主要分為 A,B,C 三類。每一類地址都會保留不同的位數給網號和主機號。

那有了這樣的分類以後,我們又要如何區分這是哪一類的地址,以解析該地址的網絡號和主機號呢?下圖的分類就滿清楚的:

可以看到,A,B,C 三類地址的開頭都不一樣,所以也造成了第一個字節取值的分別,因此,我們可以方便地得知任意 IP 地址屬於哪類。

這邊補充一個概念。IP 地址規定,有兩個地址不能分配給網絡中的設備。第一個就是 host 全取 0 時。這是因為,這樣的地址要保留起來表示該網絡的 network id。當網絡中欲通信的設備基於自己的 IP 地址計算出的 network id都一樣時,就可以直接通信,而不必透過第三層設備轉發。而當 host 全取 1 時,也不能分配給設備。因為 host 全為 1 的這個地址,表示的是該數據報是一個廣播數據報。

所以舉例來說,一個 C 類網段所能分配的設備數量就是 2^8 -2 個。全 0 全 1 都是不能作為分配用途的。

私有 IP 地址

對於 A,B,C 三類 ip 地址,還特別劃分了一些範圍屬於私有 ip 地址。私有的意思就是說,這些 ip 地址是不用於上網的,也就是說,這些 ip 地址可以用在不同的私有局域網,且不會產生衝突。那麼至於這些 ip 地址的設備要上 Internet,之後會介紹 NAT 技術。

私有 ip 地址主要可以解決 ip 地址耗盡的問題。若有興趣,可以參考 全球IPv4地址耗尽意味着什么?

子網 (subnet)

子網是什麼 ?

上述提到的 A,B,C 三類 ip 地址,我們可以看到,對於每個 ip 地址,是可以容納很多很多主機數的。但是其實要在同個網段中容納這麼多的主機數是不大可能的,所以會造成 ip 地址的浪費。這就是子網出現的原因。

有時候對於一個網段,我們還會需要劃分成更小的幾個網段,我們稱為子網。這樣可以增加靈活性,或是縮小廣播域等等。作法是,我們會跟 IP 地址的 host 借位,來當作 subnet 標示。

那問題來了,我們可以借幾位來做為 subnet id 呢?
最少我們必須要至少借 2 位。回顧下,剛剛我們說到,一個網段有兩個 IP 地址是不能作為分配設備用的,那就是 host 全 0 和 全 1。所以其實很好理解,因為如果今天只借 1 位,那對於這兩個子網,根本無法分配給任何設備。

那最多至少要給 host 留 2 位。原因也跟上面是一樣的,相信很好理解。

當然,借多少位取決於我們,但是我們當然是希望可以盡可能增加子網的使用效率,來看看下面這張表:

而劃分子網,因為提升了一些靈活性,所以難免會有些損失,但是我們還是希望可以盡量降低損失。

譬如說第一行的數據。首先這是對於 c 類地址的分析,如果只借了 2 位,那麼我們最多可以劃分為 2^2 -2 = 2 個子網。而每個子網又可以分配給 2^6 -2 = 62 個設備。所以總共可以分配 2*62 = 124 個主機。那如果不劃分子網,可以分配 2^8 -2 = 254 個主機,也就是說,利用率是 124/254 = 49%。所以可見,劃分子網也是有效率高低的。

子網掩碼 (subnet mask)

子網掩碼的基本概念就是,要標明對於某個 IP 地址,那些位用作 network id,那些位用作 host id。舉例來說,對於一個普通的 A 類地址,他的子網掩碼就會是 255.0.0.0。把網絡號相應部分置為 1,其餘主機部分置為 0。那麼接下來直接來看看這個例子,綜合上面所介紹劃份子網的概念,還有子網掩碼的用途:

給定 IP 地址 223.14.17.0。我們想對這個網段劃分子網,需要 13 個子網,每個子網要容納 10 台主機。

首先分析下,223.14.17.0 是一個 C 類地址,且因為 host 全為 0,所以表示的是一個網段號。

Step1 : 因為是個 C 類地址,所以默認子網掩碼是 255.255.255.0

Step2 : 要求要 13 個子網,所以說最少要跟 host 位借 4 位當作 subnet id。5 位可以嗎?不行,因為如果借 5 位,那 host 不夠每個子網容納 10 台主機。

Step3 : 因為發現要借 4 位當作 subnet id,所以把 subnet id 的部分置為 1。最後一個字節就變成 11110000,換算成十進制就是 240。所以在這樣的要求下,對於 223.14.17.0 這個網段的子網掩碼就是 255.255.255.240。

以上就完成了要求。那麼這個子網掩碼到底有甚麼用呢?有了子網掩碼和主機的 IP 地址,其實我們就可以回推出這個主機所在網段。怎麼做呢,看看下面的例子:

子網掩碼的用途就在於,可以讓我們回推出該 IP 地址的主機所屬的網段,或者子網段,這樣對於我們的目標主機,如果計算出和源主機所在的網段是一樣的,就可以直接轉發,而不用透過路由器。

路由器 (Router)

路由器可以說是網絡層最代表的設備。我們可以把路由器想像成,一個路由器上面其實有很多端口(port),而每一個端口都有配置一個網關(Gateway),這個網關需要配對相應的網段的 network id。

每一個路由器還都會有自己的路由表,當一個報文到達某個端口時,路由器就會去查自己的路由表,來確定到底要交由哪個端口轉發該報文。

而構建路由表,主要分為兩種方式,動態和靜態的。

static addressing

static addressing 的做法就是由網管去特別賦予設備一個特定,且不會改變的 IP 地址。

dynamic addressing

現今主流的 dynamic addressing 方法是 DHCP,會再特別介紹。

還有關於路由器劃分衝突域和廣播域,以及和其他網絡設備比較的知識點,可以去看看 搞清楚網絡中的設備

Routing Protocol 和 Routed Protocol

這邊要釐清這兩個概念,Routing Protocol 和 Routed Protocol。

Routed Protocol 是說,這樣的協議是基於第三層做判斷,協助路由器之間報文的轉發,從而使得路由器之間可以成功連通。IP 協議就是一種 Routed Protocol。

Routing Protocol 是說,這樣的協議仍然工作於第三層,只是它的目的不是要轉發報文,而是幫助路由器生成各自的路由表。

通過 Routing Protocol,路由器之間會動態的交換信息,成功的生成當下的路由表,再基於 Routed Protocol 成功轉發數據報。來看看一句總結的繞口令:

Routing protocols determine how Routing protocols are routed.

理解二者的差別之後,其實還是很好理解的。下面我們再來看看具體的 Routing Protocol。

細說 Routing Protocol

Routing protocol 主要分為兩大類,IGP(Interior Gateway Protocol) 和 EGP(Exterior Gateway Protocol)。IGP 用在自治系統內,而 EGP 是跨自治系統的。而 IGP 又有更多的分類。

來看看關於 IGP 的分類;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OSI Network Layer 網絡層 的相关文章

  • JDBC Utils 详解(通俗易懂)

    目录 一 前言 二 JDBCUtils说明 1 背景及起因 2 示意图 3 JDBCUtils类的定义 三 JDBCUtils应用 1 DML的应用 2 DQL的应用 四 总结 一 前言 第三节内容 up主要和大家分享一下JDBC Util
  • 输入权重和偏置的范围问题?

    对于张的单输入单输出的非线性函数 用黄的程序 隐层神经元的个数并没有太大的影响 而输入权重和偏置的范围有很大的影响 隐层神经元数50 InputWeight rand NumberofHiddenNeurons NumberofInputN
  • 龙芯+RT-Thread+LVGL实战笔记(1)——从移植开始

    过去的大半年时间 一直带着学生备战全国职业院校技能大赛 嵌入式系统应用开发 赛项 由于是首次参加该赛项 很多东西都是从0到1的摸索和积累 最后的成绩自然也不甚理想 作为指导教师 备赛期间除了给予学生必要的指导 自己也花了不少精力研究了大赛指

随机推荐

  • 9.7C++作业

    include
  • redis安装过程报错解决方案

    问题一 出现如下错误 cd src make all make 1 Entering directory xx xx redis x x x src CC adlist o bin sh cc command not found make
  • pycharm 安装 markdown 的三种方法! 绝对管用!!!

    Markdown是一种可以使用普通文本编辑器编写的标记语言 通过简单的标记语法 它可以使普通文本内容具有一定的格式 本人使用的是专业版pycharm 自己破解的 不知道正版的有没有安装不上markdown的情况 就个人所遇到的问题解决方案如
  • Spark读取ES报错EsHadoopInvalidRequest The number of slices [1632] is too large

    Spark读取ES报错EsHadoopInvalidRequest The number of slices 1632 is too large 1 背景 最近需要将ES指定索引中的数据使用Spark读取 进行简单处理后写入HBase 使用
  • avalon框架系列-指令(一)

    avalon的指令是一个非常重要的东西 它用来引入一些新的HTML语法 使元素拥有特定的行为 指令一共拥有3种形式 插值表达式 自定义标签 绑定属性 先说说两个比较少的形式 插值表达式和自定义标签 1 插值表达式 跟Vue框架的一样 都是一
  • MATLAB线性回归

    问题陈述 目标是通过使用线性回归技术进行统计推断预测 使用来自论文 1977 Narula and Wellington Prediction Linear Regression and the Minimum Sum of Relativ
  • 【深度学习】Inception的前世今生(四)--Inception V4,Inception-ResNet

    Inception的系列文章 1 Inception v1 Going deeper with convolutions https arxiv org abs 1409 4842 2 Inception v2 Batch Normaliz
  • 通过Docker创建CentOS容器

    前言 先安装Docker 使用文内的脚本可以快速创建CentOS 7 8虚拟系统集群 并通过SSH Secure Shell 远程工具连接 创建桥接网络 方便容器间通信 指令格式为docker network create lt 网络名称
  • 动态原型模式

    动态原型模式 通过开关 动态添加函数的方法
  • 史上最全!大数据开源框架技术扫盲

    一 目录 系统平台 Hadoop CDH HDP 监控管理 CM Hue Ambari Dr Elephant Ganglia Zabbix Eagle 文件系统 HDFS GPFS Ceph GlusterFS Swift BeeGFS
  • 图像构成与信号处理之二——信号滤波

    一 信号滤波与图像滤波 信号滤波和图像滤波都是信号处理的重要任务 它们在不同领域中有广泛的应用 一 信号滤波 信号滤波是对信号进行处理的过程 通过去除或抑制不需要的频率成分 以实现信号的平滑或去噪 信号滤波的目标是改变信号的频谱分布 以达到
  • WiFi-ESP8266入门开发(十三)-使用SPI

    注 对于ESP8266开源技术感兴趣的可以加群 我们一起探索交流学习 群号 579932824 群名 ESP8266开源技术交流群 介绍 串行外设接口 SPI 是摩托罗拉公司最初启动的总线接口连接协议 SPI接口使用四根线进行通信 因此也被
  • 【JS实用技巧篇】01-函数防抖

    JavaScript专栏 js实用技巧篇 该专栏博主会持续更新 目的是给大家分享一些非常实用的技巧 同时巩固自己的基础 共同进步 欢迎大家在评论区留言交流技术以及学习方法 心得方面的问题 你的一键三连是对我的最大支持 祝大家国庆快乐 文章目
  • 利用python进行数据分析之数据清洗与准备--小白笔记

    数据清洗和准备 处理缺失数据 import pandas as pd import numpy as np string data pd Series aardvark artichoke np nan avocado string dat
  • OpenStack部署之前需要安装哪些必备组件

    二 安全 下面的表格给出了需要密码的服务列表以及它们在指南中关联关系 密码 密码名称 描述 数据库密码 不能使用变量 数据库的root密码 ADMIN PASS admin 用户密码 CEILOMETER DBPASS Telemetry
  • three.js 创建文字的几种方法

    three js 创建文字的几种方法 1 DOM CSS 传统网页html实现 2 将文字绘制到画布中 并将其用作Texture 纹理 将文字保存为图片格式 再将其当作一张蒙皮材质 贴到某个物体上 3 在你所喜欢的3D软件里创建模型 并导出
  • 简单的数字水印加密技术

    最近我一个朋友问谍战情节里是怎样办到将数据隐藏到一般图片里的 正好有一段时间我也研究过这个问题 既然他问了干脆我就写出来和大家也一起分享一下吧 大都是自己琢磨的 如有更加专业的做法欢迎大家讨论啊 由于时间比较久远 当年研究的代码找了半天也没
  • [leetcode] 面试题 17.20. 连续中值

    有很多种形式可以实现中位数的求解 比如将所有的数放到一个数组中 然后sort一下获取中间的值 但这样在时间复杂度上不太优雅 为了能够更快的求解 可以使用对顶堆来求解 对顶堆通常用来实现动态k大 小 的问题 在这个题里 因为在往里面加数的过程
  • api接口的获取调用方式是什么?

    API接口的获取调用方式 通常分为以下几个步骤 1 注册账号并申请API Key 在API服务提供商的官方网站上注册账号 并申请API Key 包括通行证ID和密钥 以便后面的API调用验证 2 查看API接口文档 根据API服务提供商的官
  • OSI Network Layer 網絡層

    OSI Network Layer 網絡層 OSI 網絡層 網絡層數據報 IP 數據報結構 IP 地址 IP 地址分類 私有 IP 地址 子網 subnet 子網是什麼 子網掩碼 subnet mask 路由器 Router static