Linux——网络层协议

news2024/10/18 9:42:25

前言

网络层:在复杂的网络环境中确定一个合适的路径

目录

前言

一IP协议

1预备知识

2基本概念

3格式

4网段划分

4.1理解IP

4.2IP组成

4.3划分方式

4.4为什么要网段划分

5特殊的IP地址

6IP地址的限制

7私有IP和公网IP

8NAT技术

9理解公网

10路由

11分片

a为什么会分片

b为什么不想分片

c如何做到不分片

12组装 

a如何区分收到的报文分片了

b如何保证收齐了

13分片组装的场景


一IP协议

1预备知识

主机B要真正的把数据发送给主机C,是需要网络层和数据链路层(暂时忽略)的配合才能实现

而通过网络发送实际上时借助路由器来实现:那路由器有怎么知道要发送给哪个(下个)路由器呢?

通过目的IP

IP的意义:IP地址提供了一种‘能力’:将数据跨网络送到主机C的能力

那究竟什么叫做能力? 

这就好像现实生活中有的人平时也就上上课,下来作业也不做,题目也没写,当等到考试时总能考到很高的分:我们就认为他有考高分的能力!次次能考100分,但也有失误的时候考了99,98分:所以‘能力’:有很大的概率去做成一件事情~

就假设这个人就张三,他有一个教授父亲;这次考试只考了98分,教授父亲不满意,令该年级重新组织这场考试:势必要张三考到100分!如果一次不行就两次直到达到目的!

在上面的例子中,教授父亲作用:策略;张三:有执行能力和具体的操作:两者结合才能保证张三能实现次次考100分的能力!

而IP地址也是这样,需要传输层协议的配合才有将数据跨网络可靠送到主机C的能力

 而IP地址 = 网络号 + 主机号

理解IP地址:这就好比学校的学号,里面规定了从前几位到几位代表院,专业,班级;我在路上拿到了丢失的学生卡,就能根据前几位到几位去问别人这时哪个院的,哪个专业的,哪个班级的:依照这些信息一步一步找到丢失学生卡的人!IP地址在路由器中路由器也是如此(但真实较复杂)

2基本概念

主机: 配有 IP 地址的设备(也可以进行路由控制)
路由器: 即配有 IP 地址, 又能进行路由控制;
节点: 主机和路由器的统称;

3格式

a如何分离

在TCP报头中有4位首部长度(单位4字节)范围[0,15] ->换成字节范围[0,60]

如果报头大小为20字节,那么4位首部长度为:0101(20/4=5)

1.提取20字节(报头大小);

2.读取4位首部长度,用它 - 报头大小看看等不等于0;如果为0则没有选项:剩下的都是数据

不为0则有选项(选项=首部长度-报头大小):(假设选项大小为16)提取16字节:剩下的都是数据

b如何分用

通过8为协议来识别是UDP还是TCP后交给上层

4位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4

8位服务类型(Type Of Service): 3 位优先权字段(已经弃用), 4 位 TOS 字段, 和1 位保留字段(必须置为 0),4 位 TOS 分别表示: 最小延时, 最大吞吐量, 最高可靠性,最小成本. 这四者相互冲突, 只能选择一个. 对于 ssh/telnet 这样的应用程序, 最小延时比较重要

8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL -= 1, 一直减到 0 还没到达, 那么就丢弃了;这个字段主要是用来解决路由循环(BUG)
16 位头部校验和: 使用 CRC 进行校验, 来鉴别头部是否损坏

8位协议,源IP,目的IP(IP协议),源端口,目的端口(传输层协议) 五元组标识一个网络通信

4网段划分

4.1理解IP

在这之前我们先来简单理解下IP:IP地址:2^64字节,它是有限有用资源

所以我们要对IP进行合理分配来充分利用它:经过合理划分来给不同的区域,国家,组织,学校等... 也就是说:我们的网络世界是被精心设计过的,从硬件到软件...

4.2IP组成

IP 地址分为两个部分, 网络号和主机号

网络号: 保证相互连接的两个网段具有不同的标识;
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

不同的子网其实就是把网络号相同的主机放到一起.
如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复

这个工作我们可以手动设置(过时),也可以让路由器来自动分配:这种技术叫做 DHCP, 能够自动的给子网内新增主机节点分配 IP 地址, 避免了手动管理 IP 的不便

也就是说:路由器不仅具有路由的功能,也具有构建子网的功能

4.3划分方式

过去曾经提出一种划分网络号和主机号的方案, 把所有 IP 地址分为五类, 如下图所示

A 类 0.0.0.0 到 127.255.255.255
B 类 128.0.0.0 到 191.255.255.255
C 类 192.0.0.0 到 223.255.255.255
D 类 224.0.0.0 到 239.255.255.255
E 类 240.0.0.0 到 247.255.255.255

随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请 B 类网络地址, 导致 B 类地址很快就分配完了, 而 A 类却浪费了大量地址;

针对这种情况提出了新的划分方案, 称为 CIDR(Classless Interdomain Routing)

引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
子网掩码也是一个 32 位的正整数. 通常用一串 "0" 来结尾;
将 IP 地址和子网掩码进行 "&" 操作, 得到的结果就是网络号;
网络号和主机号的划分与这个 IP 地址是 A 类、 B 类还是 C 类无关;

例子1

只用最后一位来计算
IP地址140.252.20.680100 0100
子网掩码255.255.255.00000 0000
网络号140.252.20.00000 0000
子网地址范围140.252.20.0~140.252.20.2550000 0000~1111 1111

例子2

最后一位来计算
IP地址140.252.20.680100 0100
子网掩码255.255.255.2401111 0000
网络号140.252.20.640100 0000
子网地址范围140.252.20.64~140.252.20.790100 0000~0100 1111

例子1的子网掩码方式也可以写成:140.252.20.68/28(前28位bit为1) 

4.4为什么要网段划分

在学校中每个人都有自己的学号,学号中规定:前几位为院号,剩下的为自己的编号(网段划分);有一天张三(发送方主机)在操场散步时捡到一个钱包(报文):里面有几十块钱现金和学生卡(目的IP地址);由于张三没有学过网络,它去找钱包的主人是逮住一个人就询问学生号与钱包里的学习好进行核对,相同便是找到了钱包的主人;但学校里有几千人,找下来的话明年毕业也可能找不到主人,于是舍友建议它把钱包交给院学生会主席(出入口路由器),把缘由跟他说下叫他帮忙寻找;小李(学习会主席)看到钱包里的学生号时就明白该学生不是我们院的,是隔壁工程学院的(排除),于是在群里(各个院的学习会主席群)(公网)@小赵(工程学习会主席)跟他说我们院的学生捡到了你们院的钱包,你去你们院找下这个人,小赵一看到钱包里的学生卡就知道钱包的主人是小王(接收方主机)就在院群(子网)里@小王说有人捡到了你的钱包。加他微信沟通下

要进行网段划分与学校划分学号类似:经过精心的设计和合理的划分,可以高效支持未来的报文路径查找,大大提高查找目标主机的效率!

5特殊的IP地址

将 IP 地址中的主机地址全部设为 0, 就成为了网络号, 代表这个局域网;

将 IP 地址中的主机地址全部设为 1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;

127.*的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1

6IP地址的限制

我们知道, IP 地址(IPv4)是一个 4 字节 32 位的正整数. 那么一共只有 2 的 32 次方 个 IP地址, 大概是 43 亿左右. 而 TCP/IP 协议规定, 每个主机都需要有一个 IP 地址.
这意味着, 一共只有 43 亿台主机能接入网络么?

实际上, 由于一些特殊的 IP 地址的存在, 数量远不足 43 亿; 另外 IP 地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个 IP 地址.CIDR 在一定程度上缓解了 IP 地址不够用的问题(提高了利用率, 减少了浪费, 但是 IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:

动态分配 IP 地址: 只给接入网络的设备分配 IP 地址. 因此同一个 MAC 地址的设备, 每次接入互联网中, 得到的 IP 地址不一定是相同的;(IP地址共享)
NAT 技术(下面会介绍);
IPv6: IPv6 并不是 IPv4 的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6 用 16 字节 128 位来表示一个 IP 地址; 目前 IPv6 还没有普及;

7私有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地址,可以出现在不同的私网

也就是说:虽然存在公网,但我们平时要想上网,都必须先接入一个指定的内网中,也就是我们所有人在都在各自的内网中上网,不能出现在公网(除了运营商)

那你可能就要问了:我买的云服务器不就可以访问到公网吗?

其实不是的:使用云服务器势必要通过xshell来连接,而连接的网络也是在私网中~

一个路由器可以配置两个 IP 地址, 一个是 WAN 口 IP, 一个是 LAN 口 IP(子网IP)
路由器 LAN 口连接的主机, 都从属于当前这个路由器的子网中
不同的路由器, 子网 IP 其实都是一样的(通常都是 192.168.1.1). 子网内的主机IP 地址不能重复. 但是子网之间的 IP 地址就可以重复了
每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN 口 IP 就是一个公网 IP 了

 为什么运营商有访问公网的权利呢?

因为互联网就是运营商精心设计出来的!为了能实现上网,运营商要埋光纤,建基站,建机房,做着投入比产出高的工作,那让其它企业来做行吗?也可以,但大家都不愿做这件事:那为什么运营商愿意做呢?背后肯定是有人要他们这样的的:就是我们国家政府意识到网络的重要性而要求运营商这样做的!基础设施建好了,能够上网的人多了,也就慢慢诞生出如字节腾讯这样的互联网公司,也就是实现了现在的万物互联的情景!所以说运营商的功不可没(除了恶意乱扣话费外)

8NAT技术

主机A要发送报文给XXX软件服务器时,报文会先到达路由器(主机A知道发送的目的IP不在内网中(知道自己的网络号));路由器会把srcIP替换成WAN 口IP私网不能出现在公网中),先往上进行交付直到到达XXX软件服务器!这里路由器进行IP替换的过程就叫做NAT(Net Address Translation)技术

9理解公网

公网也是有一个个内网共同组成的!运营商根据各地区实际情况来选择构建子网要用NAT技术还是用IP地址!

10路由

在复杂的网络结构中, 找出一条通往终点的路线

路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程

所谓 "一跳" 就是数据链路层中的一个区间:具体在以太网中指从源 MAC 地址到目的MAC 地址之间的帧传输区间

IP 数据包的传输过程

当 IP 数据包, 到达路由器时, 路由器会先查看目的 IP;
路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;

那么如何判定当前这个数据包该发送到哪里呢?

这时就要依靠每个节点内部维护的一张路由表

Destination目的IP

Gateway

下一跳地址

Genmask

子网掩码

Flags

MetricRefUseIface
192.168.10.0*255.255.255.0U      000eth0
192.168.56.0*255.255.255.0U000eth1
127.0.0.0*255.0.0.0U000lo
default192.168.10.10.0.0.0UG000eth0

例 1:发送数据包的目的地址是 192.168.56.3

• 跟第一行的子网掩码做与运算得 到 192.168.56.0,与第一行的目的网络地址不符
再跟第二行的子网掩码做与运算得到 192.168.56.0,正是第二行的目的网络地址,因此从 eth1 接口发送出去;
由于 192.168.56.0/24 正是与 eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;

例 2:要发送的数据包的目的地址是 202.10.1.2

依次和路由表前几项进行对比, 发现都不匹配;
按缺省路由条目, 从 eth0 接口发出去, 发往 192.168.10.1 路由器;
由 192.168.10.1 路由器根据它的路由表决定下一跳地址;

11分片

a为什么会分片

在数据链路层(下篇讲)里规定:MTU(Maximum Transmission Unit)为1500字节,报文大小超过1500字节便不能发出(通过网络给接收方);决定报文大小的不是网络层,而是传输层;所以在传输层中填写报文时尽量不要超过MTU:但这时传输层非要发送2000字节报文,到达网络层,网络层知道如果继续往下交付报文是不会发送成功的,所以将报文进行分片成2个1000字节报文发出;到达对方的网络层时将报文进行组装成一个往上交付:这样在接收方传输层看来接收到的报文与发出的报文是相同的!

网络层进行分片组装的过程传输层与数据链路层是毫不知情的,所以说在网络世界里只有IP报文

b为什么不想分片

如果分片发送出去的两个报文中有一个丢了,在接收方网络层是不会再往上交付了:在分片中,一片丢失,则报文丢失

所以到底是1个报文还是10个报文丢失概率高?当然是10个报文,那也就是说分片会提高丢包概率,对传输层也会受影响(进行补发报文)不应该(不能)成为网络的主流的!(传输层是TCP还好,如果是UDP的话丢包了就真的丢包了!)

c如何做到不分片

既然进行分片后对双方都有影响,这时网络层就对传输层说了:数据链路层规定给我MTU是1500字节,减去20字节报文,你给我发送的报文大小尽量不要超过1480字节,不然对双方都不好!传输层一听觉得是有点道理,也掰起自己的手指头算:只要应用层给我发的报文不超过1460自己就能保证网络层不分片了!(传输层是tcp)这不就是通过滑动窗口来实现吗!

12组装 

a如何区分收到的报文分片了

16 位标识: 唯一的标识主机发送的报文;报文被分片则16为标识时相同的
3 位标志: 第一位保留,第二位置为 1 表示禁止分片,第三位表示"更多分片":如果分片了, 最后一个分片置为 0, 其他是 1
13位片偏移: 是分片相对于原始 IP 报文开始处的偏移.其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移是这个片偏移值 <<3(乘8) 得到的. 因此, 除了最后一个报文之外(之前如果都是 8 的整数倍,最后一片的偏移量也一定是 8 的整数倍), 其他报文的长度必须是 8 的整数倍(否则报文就不连续了)

我们可以通过报头来区分报文分片

第一片:3位标记的更多分片为1 片偏移为0

中间片:3位标记的更多分片为1 片偏移大于0

最后片:3位标记的更多分片为片偏移一定大于0

也就是:if(更多分片 == 1 || 片偏移 > 0 ) 我们就说报文分片了

如果没分片:if(更多分片 == 0 && 片偏移 == 0)

b如何保证收齐了

没有头:找不到偏移量为0的报文

没有尾:找不到3位标记的更多分片为0

没有中间:按照片偏移进行升序排序片偏移 + 有效载荷 = 下一个偏移量)  不等于就说明中间片丢了!

13分片组装的场景

以上便是网络层相关的内容,有错误欢迎指正,感谢你的观看~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件数据安全评估

简介 SQLmap是一款「自动化」SQL注入 工具&#xff0c;kali自带。 可以自己手动安装 地址 源码 源码汉化版kali自带 开启 python 自己直接编译运行 kali 使用方法 1 Options&#xff08;选项&#xff09; -h,--help 显示帮助消息 -hh 显示详细帮助 -version -v…

【JavaScript】网页交互的灵魂舞者

我的主页&#xff1a;2的n次方_ 1. JavaScript 的三种引入方式 引⼊⽅式 语法描述 ⽰例 ⾏内样式 直接嵌⼊到 html 元素内部 <input type"button" value"点我⼀下" οnclick"alert(haha)"> 内部样式 定义<script>标签&a…

云计算第四阶段: cloud二周目 07-08

cloud 07 一、k8s服务管理 创建服务 # 资源清单文件 [rootmaster ~]# kubectl create service clusterip websvc --tcp80:80 --dry-runclient -o yaml [rootmaster ~]# vim websvc.yaml --- kind: Service apiVersion: v1 metadata:name: websvc spec:type: ClusterIPselector…

IGFBP7:免疫治疗新靶点

前 言 胰岛素样生长因子结合蛋白7&#xff08;IGFBP7&#xff09;是胰岛素超家族的生长促进肽成员&#xff0c;可与胰岛素和IGF结合&#xff0c;调控细胞生长和分化。IGFBP7在不同的肿瘤类型中表现出抑制或促进肿瘤生长的“自相矛盾”活性。研究发现IGFBP7可增强治疗性单克隆…

C语言 | Leetcode C语言题解之第491题非递减子序列

题目&#xff1a; 题解&#xff1a; int** ans; int ansSize; int* temp; int tempSize;void dfs(int cur, int last, int* nums, int numsSize, int** returnColumnSizes) {if (cur numsSize) {if (tempSize > 2) {ans[ansSize] malloc(sizeof(int) * tempSize);memcpy(…

HDLBits中文版,标准参考答案 | 5 Verification: Writing Testbenches | 验证:编写测试平台

关注 望森FPGA 查看更多FPGA资讯 这是望森的第 24 期分享 作者 | 望森 来源 | 望森FPGA 目录 1 Clock 2 Testbench1 3 AND gate 4 Testbench2 5 T flip-fop 本文中的代码都能够正常运行&#xff0c;请放心食用&#x1f60b;~ 练习的官方网站是&#xff1a;https://hdlbi…

Hi3061M——VL53L0X激光测距(IIC)(同样适用于其他MCU)

这里写目录标题 前言VL53L0X的简介VL53L0X的初始化和效准过程的相关APIVL53L0X开始测量和获取测量值VL53L0X移植配置结语 前言 手头正好有一个空闲的激光测距模块VL53L0X&#xff0c;想在Hi3061M上跑一下测距&#xff0c;以前并没有用过VL53L0X&#xff0c;想着以为还是向以前…

浅谈针对Nor flash状态寄存器保护位修改方法

浅谈针对Nor flash状态寄存器保护位修改 ✨最近在写QSPI驱动Nor flash过程中&#xff0c;在操作芯片的状态寄存器的时候&#xff0c;遇到的一些问题和解决办法。 &#x1f52c;操作Nor flash测试芯片&#xff1a;GD25Q64&#x1f516;以QSPI测试为例&#xff0c;SPI方式修改没有…

集成电路学习:什么是WLAN无线局域网

WLAN&#xff1a;无线局域网 WLAN&#xff0c;即无线局域网&#xff08;Wireless Local Area Network&#xff09;&#xff0c;是一种通过无线技术构建的局域网络&#xff0c;它使用无线信号传输数据&#xff0c;取代了传统有线网络中的网线连接。以下是关于WLAN的详细解释&…

Lumerical学习——优化和参数扫描(Optimization and parameter sweeps)

一、概要介绍 这部分介绍优化和参数扫描项目设定的方法。在有大量数据模拟计算过程中这个特性允许用户使处理方法自动地查找期望的参数值。 ① 创建一个参数扫描任务 ② 创建一个优化任务 ③ 创建一个良率分析任务 ⑤ 打开所选择项目的编辑窗口&#xff0c;编辑其属性…

stm32 bootloader写法

bootloader写法&#xff1a; 假设app的起始地址&#xff1a;0x08020000&#xff0c;则bootloader的范围是0x0800,0000~0x0801,FFFF。 #define APP_ADDR 0x08020000 // 应用程序首地址定义 typedef void (*APP_FUNC)(void); // 函数指针类型定义 /*main函数中调用rum_app&#x…

【Unity】Unity Shader学习笔记(八)基础纹理2:高度纹理、法线纹理、模型空间下的法线纹理、切线空间下的法线纹理光照计算

文章目录 凹凸映射法线纹理设置高度纹理&#xff08;Height Map&#xff09;法线纹理&#xff08;Normal Map&#xff09;模型空间的法线纹理切线空间的法线纹理优劣对比 切线空间下的法线纹理光照计算最终效果完整代码TANGENT语义内置宏 TANGENT_SPACE_ROTATIONObjSpaceLightD…

前缀和--一维和二维模板

前缀和 【模板】前缀和 描述 给定一个长度为n的数组a1,a2,…ana1,a2,…a**n. 接下来有q次查询, 每次查询有两个参数l, r. 对于每个询问, 请输出alal1…ara**la**l1…a**r 输入描述&#xff1a; 第一行包含两个整数n和q. 第二行包含n个整数, 表示a1,a2,…ana1,a2,…a**n.…

JavaWeb——Maven(4/8):Maven坐标,idea集成-导入maven项目(两种方式)

目录 Maven坐标 导入Maven项目 第一种方式 第二种方式 Maven坐标 Maven 坐标 是 Maven 当中资源的唯一标识。通过这个坐标&#xff0c;我们就能够唯一定位资源的位置。 Maven 坐标主要用在两个地方。第一个地方&#xff1a;我们可以使用坐标来定义项目。第二个地方&#…

CLANet:基于明场图像的跨批次细胞系识别综合框架|文献速递-基于深度学习的医学影像分类,分割与多模态应用

Title 题目 CLANet: A comprehensive framework for cross-batch cell line identificationusing brightfield images CLANet&#xff1a;基于明场图像的跨批次细胞系识别综合框架 01 文献速递介绍 细胞系鉴定&#xff08;Cell Line Authentication&#xff0c;CLA&#x…

英飞达医学影像存档与通信系统 WebUserLogin.asmx 信息泄露漏洞复现

0x01 产品简介 英飞达医学影像存档与通信系统 Picture Archiving and Communication System,它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声,各种X光机,各种红外仪、显微仪等设备产生的图像)通过各种接口(模拟,DICOM,网络…

二叉树与堆讲解

目录 1.树的概念及结构 1.树的概念 2.树的相关概念 3.树的表示 2.二叉树 1.概念 2.特殊的二叉树 1.满二叉树 2.完全二叉树 3.二叉树的性质 4.二叉树的存储结构 1.顺序结构 2.链式存储 3.堆 1.堆的概念及结构 2.堆的实现 1.堆的创建 2.堆的初始化&#xff08;H…

力扣力扣力:206. 反转链表

leetcode链接&#xff1a;206. 反转链表 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5]输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1…

手写Spring IOC-简易版

目录 项目结构entitydaoIUserDaoUserDaoImpl serviceIUserServiceUserServiceImpl ApplicationContext 配置文件初始化 IOC 容器RunApplication 注解初始化 IOC 容器BeanAutowired Reference 项目结构 entity User Data NoArgsConstructor AllArgsConstructor Accessors(chai…

面试八股(自用)

什么是java序列化&#xff0c;什么时候需要序列化? 序列化是指将java对象转化成字节流的过程&#xff0c;反序列化是指将字节流转化成java对象的过程。 当java对象需要在网络上传输 或者 持久化到存储文件中&#xff0c;就需要对java对象进行序列化处理。 JVM的主要组成部分…