网络原理———TCP/IP—网络层IP协议

在这里插入图片描述

T04BF

👋专栏: 算法|JAVA|MySQL|C语言

🫵 今天你敲代码了吗

目录

      • 网络层IP协议
        • 4位版本号
        • 4位首部长度
        • 8位服务类型
        • 16位总长度
        • 16位标识 3位标志 13位片偏移
        • 8位生存时间
        • 8位协议
        • 16位首部校验和
        • 32位源IP地址 和 32位目的IP地址
          • 方案1:动态分配IP地址
          • 方案2:NAT机制
          • 方案3:IPV6(终极方案)
        • IP地址的基本规则
          • 网段划分
          • 特殊的IP地址
          • 3.10.2 特殊的Ip
            • 主机号全是0(二进制)
            • 主机号全是1(二进制):
            • 127.* 环回Ip(loopback)
        • 路由选择

网络层IP协议

网络层主要做的事情就是,路径规划以及地址管理,这就涉及IP协议的规则和特点

我们研究一下IP协议的报头
在这里插入图片描述

4位版本号

指的是IP协议的版本号,主要IPV4和IPV6

上述报文的结构就是 IPV4的结构

4位首部长度

这里的首部长度和 TCP 协议的一样,也是以4字节为单位的

同时由于选项的存在,IP报头的最长就是 60个字节
最短就是原本的20个字节

8位服务类型

说是8位,但是实际上只有4位有效
并且这4位彼此之间是互斥的

3位优先权字段(已经弃用)
1位保留位(必须为0)
4位TOS字段

4位TOS分别表示:最小延时.最大吐量,最高可靠性.最小成本

这四者之间互相冲突,只能选择一个

其中,最小延时实现的效果就是 传输过程中,消耗的时间最短

最大吞吐量,实现的效果就是 单位时间内,传输的数据尽可能毒多

最高可靠性,就是实现降低丢包概率

最小成本,就是实现节省系统来开销

16位总长度

指的是整个IP数据报的长度(包括报头)

那么此时如果载荷部分是 TCP数据报,那么就可以根据这个算出TCP载荷的长度了

ip数据包的总长度,减去首部长度,剩下的就是TCP数据报的长度,再减去TCP报头长度,剩下的就是TCP载荷的长度了

16位标识 3位标志 13位片偏移

那么按照我们上面所说的16位总长度,那么是不是就表明 IP数据报最长就是 64kb??

实际上,这里虽然限制了IP数据报的长度
但是,IP协议自身实现了拆包组包这样的概念

如果携带的载荷 超出了长度的限制,IP数据报就会自动拆分成多个数据报,每个数据报携带载荷的一部分
当发送到对方之后,再拼接好
在这里插入图片描述
假设这组数据很长,超出了64kb的上限,此时就会将上述的数据拆成多个部分,使用多个Ip数据包来进行发送

在这里插入图片描述
那么接收方是怎么知道.收到的这些IP数据报是怎么拼接起来的??
在这里插入图片描述
这三个属性即使用来实现 IP协议的拆包组包的

其中,16位标识就是用来区分,哪些数据包是需要合并的

13位片偏移就是表示,若干个要拼接的数据包的先后顺序

而3位标识,实际上只有两位有效,其中一个用来表示,该数据包是否触发了拆包的效果(是否需要组包)

另一个标志位是结束标志,表示当前这个包就是最后一个要组包的部分

上述组包的过程完全是Ip本身负责的,与载荷中保存的是什么数据,就没有任何关系了

那么既然这样的话,IP协议都能组包了,为什么UDP还有64KB的限制??
实际上,从直观上来说.把上述数据拆成多份,分成多个IP数据包发送,好像也是OK

但是拆出来的数据传输过去之后,也是要还原成原来的摸样,这里还原出来的数据还是要交给UDP使用

在UDP这一层就需要对上述数据进行解析,就会取出8个字节作为报头,剩下的就是载荷,但是载荷具体多长??

还是会尝试从报头里面读出来长度,这时候,最长还是64kb

8位生存时间

IP数据报要在网络上转发,这个属性就是用来限制一个数据在网络上转发的最大次数

一个IP数据报,初始情况下,就会有 一个TTL的值(32 / 64)
这个整数每经过一个路由器的转发,就要 -1,减到0的时候,这个数据报就要丢掉了(这个初始值实际上也是可以设置的)

的)

关键是,32 / 64这样的数值是否够用??

通常情况下是够用的

这里背后实际上涉及到一个来自于社会科学的理论 => "六度空间"理论

如果我只是一个普通人,想认识某一个人,那么我就可以发动我身边的朋友(假设一个人有150 - 200个朋友)

那么我联系我的朋友,我的朋友练习他们的朋友,那么最多经过6层朋友,就能够联系到世界上所有的人

对于路由器来说,路由器转发IP数据包的时候,每个路由器其实是不了解网络的全貌的,但是它能够知道相邻的设备有哪些(就类似于朋友)

所有,即使是经过少数的几次跳转,也是能够涵盖到大量的设备的,因此通常来说64这样的整数是够用的

限制生存时间(TTL)的主要目的是防止数据包在网络中无限循环或长时间滞留,从而避免网络中的数据包传输出现异常情况并提高网络的稳定性和效率。以下是限制生存时间的几个原因:

  1. 防止数据包循环: 如果网络中存在路由环路(即数据包在网络中无限循环),数据包就会在网络中不断地转发而无法到达目的地。通过限制生存时间,当数据包经过一定数量的路由器后,即使出现了环路,TTL字段也会减为0,数据包会被丢弃,从而避免了无限循环的问题。
  2. 防止数据包长时间滞留: 在网络中,可能会发生某些异常情况导致数据包无法正常到达目的地,比如路由器故障、网络拥堵等。如果没有TTL的限制,数据包可能会长时间滞留在网络中,占用网络资源并导致传输延迟增加。通过限制生存时间,即使数据包无法正常到达目的地,也能够在一定时间后被丢弃,释放网络资源。
  3. 网络拓扑变化: 网络拓扑结构可能会发生变化,比如路由器之间的连接关系发生改变或者路由器故障。限制生存时间可以确保数据包不会永远地在网络中传输,从而适应网络拓扑结构的变化。

    综上所述,限制生存时间有助于防止网络中的异常情况,保障数据包的正常传输,提高网络的稳定性和效率。
8位协议

这里就哈斯用来描述 载荷部分是哪种协议的数据报
是交给TCP协议还是UDP协议

16位首部校验和

为什么是首部校验和
就是只是针对IP报头进行校验

载荷部分不关心(无论是UDP协议还是TCP,都是自己有校验和的)

32位源IP地址 和 32位目的IP地址

我们之前说过,一个IP地址实际上就是一个32位的整数
为了让人更加容易的观察,通常表示为"点分十进制的形式"

那么既然是32位,就说明IP地址的数量就是 42亿九千万
原则上来说,每一台上网设备都要有唯一的IP地址,是不能重复的

但是这个数量在当前世界,是不够用的.尤其是移动设备的发展,极大的增加了上网设备的数量

那么IP地址不够用怎么办??

方案1:动态分配IP地址

即某个设备如果上网的话,才给他分配IP地址,不上网就不分配

但是实际上这样的机制,只能够做到缓解,不能解决
没法从根本上解决IP地址不够用的问题

方案2:NAT机制

首先,将IP地址分成两大类

(1)私网IP (局域网内部使用的IP)
以以下数字开头的都是 私网IP

10.*
172.16* ~ 172.31*
192.168.*

(2) 公网IP(广域网使用)

此时就约定好,公网IP必须是唯一的,私网IP在同一个局域网内不允许重复,但是在不同的局域网内允许重复

当前的上网设备虽然非常多,但是实际上大部分的设备都是在局域网内部上网的,此时就极大的缓解了IP地址不够用的问题

那么如果引入上面的模型,如何进行通信呢???

(1)同一个局域网内的设备之间进行通信

由于在同一个局域网内的设备IP是唯一的
因此此时这些设备之间是可以直接进行通信的

(2)广域网和广域网设备之间进行通信
本来就是要求广域网设备的IP要是唯一的
因此此时还是可以直接进行通信

(3)局域网1内的设备尝试访问局域网2之内的设备
这种情况是不允许的

(4) 广域网是设备主动访问局域网设备
这种情况也是不允许的

(5)局域网设备访问广域网设备
此时NAT机制就开始作用了

我们现在主要是 认识 ,私网IP是如何访问公网IP的

假设我们现在在家里,主动访问百度的服务器
在这里插入图片描述
大概的路径就是这样子
为了方便讨论,我们简化一下模型
在这里插入图片描述
此时我的电脑要发送一个数据报给百度的服务器,就会构造出来一个IP数据报
在这里插入图片描述
当此时的数据报到达运营商路由器的时候,运营商路由器实际上就是一个NAT设备,就会对中间经过的数据报进行 网络地址的转换

这种转换就是 ,当内网数据报经过外网的设备的时候,就会将IP数据报里面的源IP 换成路由器自己的IP

进行上述的转换,就是为了用自己的公网IP取代原来的私网IP

在这里插入图片描述
当我这个数据包到达百度服务器之后,百度服务器就会看到有一个5.6.7.8这样的设备给它发了个请求
但是百度服务器对我的电脑的真实私网Ip是一无所知的

实际上,我这个局域网中的其他电脑,也是通过运营商路由器来访问公网的,所有的这个局域网中的几千台几万台设备.都是通过同一个路由器的Ip来访问公网Ip的
在这里插入图片描述
这个就是我这台设备,对应的运营商路由器的公网Ip

此时百度服务器也会给我返回一个数据报
但是由于百度服务器只能看到 5.6.7.8这样的IP,那么形成的IP数据报如图所示
在这里插入图片描述
这个数据报就会返回给 运营商路由器
那么运营商路由器就要将数据报返回给我电脑
但是运营商路由器是怎么知道,要返回给哪个主机???

实际上,在运营商路由器内部,维护了一个"映射表"
这个映射表就会当前的这个当前来自于百度服务器的响应对应的 请求 是从哪个内网设备发过来的
就会根据这个记录的IP将IP替换为最初的IP
这种映射关系是通过"端口号"来实现的

在这里插入图片描述
如果在同一时刻,我这个局域网内也有别的主机访问百度,那么运营商路由器就是根据端口号来区分是哪台主机发送的请求

此时就会出现一种极端情况:

如果我这个局域网两台不同的主机,端口号恰好一样呢??

实际上也是通过端口号来区分的,即使端口号一样,到运营商路由器的时候,给这两个一样端口号的主机分配不一样的新端口号即可

在这里插入图片描述

那么我们再次回到我们一开始画的图
在这里插入图片描述
实际上,运营商路由器对应的图应该是这样的

在这里插入图片描述
此时,我的电脑/其他人的设备 与 运营商路由器之间的路由器设备,虽然没有公网Ip,但是也是一个NAT设备,

而运营商路由器与 中间路由器之间,又构成了局域网…相当于一个"套娃"的过程

我们当前的网络世界,就是通过动态分配 + NAT解决的IP不够用的问题

但是这样的方案给网络的复杂程度增加了不少,而且也没有从根本上解决问题

方案3:IPV6(终极方案)

就是引入了更长的字节数来表示 IP地址

IPV6拿16个字节来表示IP地址,就是128位,就是一共有 2 ^ 32 ^ 4这么多个Ip号,足以给地球上每一粒沙子都分配一个唯一的IP

但是实际上现在世界上还是以IPV4为主,这是因为IPV4和IPV6不兼容

最开始使用IPV4的时候,大家用的路由器,交换机 网卡 等各种设备,都是支持IPv4的设备

如果换成IpV6,就要换设备

但是实际上这两种的效率并不会相差很大,而换设备需要较大的成本

至于比较火的NAT,是纯软件的方案,只是需要更新一下路由器上面的程序(固件),成本非常低

IP地址的基本规则
网段划分

同一个局域网的主机,要按照一定的规则来分配IP地址

将IP地址(IPV4)分成两部分,前半部分是 网络号,后半部分是 主机号

网络号是用来标识局域网的,主机号是用来标识同一个局域网内的不同主机的

在同一个局域网内部,主机之间的IP,网络号是一样的,但是主机号不一样

但是我们不能说,网络号一样就是在同一个局域网内

因为在局域网之间,网络号是可以相同的,只是两个相邻的局域网 (比如同一个路由器的WAN口和LAN口),就不能相同

一旦相邻的局域网网络号相同了,就不能上网了

那么一个32位的IP地址,具体哪些是网络号,哪些是主机号??

此时就引入了一个新的概念:子网掩码
子网掩码也是一个32位的整数,左半部分都是1,右半部分都是0
在这里插入图片描述

此处的255就是1111 1111

那么此时假设我的Ip号:10.203.183.167, 前面的10.203就是网络号,183.167就是主机号

至于子网掩码,一般不需要我们设置,都是路由器插上就自动分配的

而学校 ,公司 等特殊场景,会有专门的人来配置

那么为啥说相邻的局域网网络号不能相同??

在这里插入图片描述
上述两个方框就是两个相邻的局域网(同一个路由器连接的)

此时网络号一旦相同,就会产生冲突

我们在前面说的搭配子网掩码的网段划分,是现在的方法

实际上在以前还流传着另一种方法,分成ABCDE 5类
在这里插入图片描述
但是实际上这个规则现在已经不用了

在这个体系下,不存在子网掩码,具体多少位是网络号,多少位是主机号,都是写死的,是硬性规定

这种做法就会浪费大量的IP

假设是A类的Ip,那么就说明,后面24位都是主机号,但是实际上,一个局域网里面并没有那么多主机

特殊的IP地址
3.10.2 特殊的Ip
主机号全是0(二进制)

这样的IP就表示网段,不应该分配给具体的主机,而是代表这个局域网

主机号全是1(二进制):

这样的IP代表广播Ip,往广播Ip上发送数据,就会发送给局域网中的所有设备

广播的一个应用场景就是,手机投屏,当我们点击投屏按钮的时候,就会弹出一个列表,让你选择投在哪个设备上,此时你的手机就是通过局域网广播地址,发送一个探测数据包,局域网内部支持投屏的设备就会给出相应,告知一些相关信息

实际上,TCP是不支持广播的,只有UDP才支持广播

这是因为TCP是有连接的 此时你按照广播地址来尝试建立连接,就代表每个设备都要进行3次握手??这是很不科学的

127.* 环回Ip(loopback)

往这个Ip中发送数据,就是自己来接收

此时即使你的电脑没联网,也是可以使用的

路由选择

所谓路由选择,就是"找路"

在这里插入图片描述

我们常见的高德地图,是立足于全局的数据,给你得到一个最优解

最优解不是说只有一种,而是按照不同的角度,得到最优解

比如路线最短,时间最短,少换乘,只坐地铁

但是在网络里面,路由器的寻找,则无法做到"最优解",只能做到"较优解"

因为每一台路由器无法知道整个网络的"全貌",但是可以知道它附近的网络设备情况是什么样的

对于路由器来说,在进行数据转发的时候,是无法一下就知道,目的Ip所对应的设备该如何到达,只能通过"启发式":探索性的方式,逐渐找到最终的目标

实际上,在路由器里面,维护了一个数据结构,这个数据结构记录了路由器周围的"朋友"是什么样的

当路由器收到数据的时候,就会根据目的Ip查询路由表,.看看这个Ip在路由表是否存在

如果存在,那就直接按照目标的位置进行转发即可

如果不存在,就会在"朋友"里面找到一个"最神通广大"的,把这个数据交给这个"朋友",让它想办法

至于这个"神通广大",指的就是路由器的下一跳表项,就牵扯到"路由器生成算法"

比较简单的情况就是,家里的路由器的下一跳表项就是 wan口连接的运营商的路由器

感谢您的访问!!期待您的关注!!!

在这里插入图片描述

T04BF

🫵 今天记得敲代码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ怎么保证可靠性

RabbitMQ怎么保证可靠性 前言生产端问题解决方案代码验证 RabbitMQ问题消费端问题解决方案代码验证 总结 前言 RabbitMQ相信大家都非常熟悉了,今天咱们来聊聊怎么保证RabbitMQ的可靠性。 那什么时候会出现问题呢? 第一种是生产端出现的问题。我们向队…

[数据集][目标检测]手枪检测数据集VOC+YOLO格式3000张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3000 标注数量(xml文件个数):3000 标注数量(txt文件个数):3000 标注…

IP代理池是什么?

从事跨境行业的朋友们总会有一个疑问,为什么自己所合作的IP代理商的IP在使用的过程中账号会有莫名封禁的问题,会不会是自己在使用的过程中错误的操作违反了平台的规则,其实不然有可能会是IP代理池纯净度不高的问题,有可能自己在使…

[个人总结]-java常用方法

1.获取项目根路径 user.dir是一个系统属性,表示用户当前的工作目录,大多数情况下,用户的当前工作目录就是java项目的根目录(src文件的同级路径) System.getProperty("user.dir") 结果:D:\code…

智能报警器——物联网应用创新

一、项目的目的、意义 我国自2020年至11月起共接报火灾23.3万起,亡1335人,伤837人,直接财产损失36.12亿元,其中,因电线短路、过负荷及电气设备故障等电气原因引起的火灾共40481起,占火灾总数的30.7%&#…

【面试经典150题】合并两个有序数组

目录 一.利用库函数sort二.逆双指针 一.利用库函数sort 首先我们先来看下题目的描述: 两个非递减的数组重新排列成非递减顺序到第一个数组中,并且第一个数组已经提前开好了空间。我们完全可以将nums2数组先放进nums1数组后面,然后整体对num…

ChatGPT制作一个简单的客服机器人

包含功能: MVP(最简可行产品)版本的客服机器人应该聚焦于核心功能,以快速上线和测试用户反馈为目标。以下是一个简化的版本: 自动问答(FAQ)功能: 支持回答常见问题,例如…

[数据集][目标检测]数据集VOC格式岸边垂钓钓鱼fishing目标检测数据集-4330张

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):4330 标注数量(xml文件个数):4330 标注类别数:1 标注类别名称:["fishing"] 每…

禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》Chapter 6插图

禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》 Chapter 6插图

Spring:数据校验(Validation)

1. 概述 在开发中,我们经常遇到参数校验的需求,比如用户注册的时候,要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式,我们会把校验的代码和真正的业务处理逻辑耦合在一起&#…

如何使用Dora SDK完成Fragment流式切换和非流式切换

我想大家对Fragment都不陌生,它作为界面碎片被使用在Activity中,如果只是更换Activity中的一小部分界面,是没有必要再重新打开一个新的Activity的。有时,即使要更换完整的UI布局,也可以使用Fragment来切换界面。 何…

ISCC2024之Misc方向WP

目录 FunZip Magic_Keyboard Number_is_the_key RSA_KU 成语学习 钢铁侠在解密 工业互联网模拟仿真数据分析 精装四合一 时间刺客 有人让我给你带个话 FunZip 题目给了一个txt,内容如下 一眼丁真,base隐写,使用工具即可得到flag Fl…

functional函数对象库学习

类模板 std::function 是一种通用多态函数包装器。std::function 的实例能存储、复制及调用任何可复制构造 (CopyConstructible) 的可调用 (Callable) 目标——函数(通过其指针)、lambda 表达式、bind 表达式或其他函数对象,以及成员函数指针…

Java进阶学习笔记31——日期时间

Date: 代表的是日期和时间。 分配Date对象并初始化它以表示自标准基准时间(称为纪元)以来的指定毫秒数,即1970年1月1日00:00:00。 有参构造器。 package cn.ensource.d3_time;import java.util.Date;public class Test1Date {pu…

Tomcat安装和配置(图文详解)_tomcat安装及配置教程

Tomcat是一个开源的Web应用服务器,它是Apache软件基金会的一个项目。Tomcat被广泛用作Java Servlet和JavaServer Pages(JSP)技术构建的Web应用程序的运行环境。 它是轻量级的,适合中小型系统和并发访问用户不是很多的场合&#x…

FPGA基于DE2-115开发板驱动HC_SR04超声波测距模块|集成蜂鸣器,led和vga提示功能

文章目录 前言一、实验原理二、Verilog文件2.1 时钟分频2.2 超声波测距2.3 超声波驱动 三、实现过程3.1 模块说明3.2 引脚分配 三、演示视频总结参考 前言 环境 硬件 DE2-115 HC-SR04超声波传感器 软件 Quartus 18.1 目标结果 使用DE2-115开发板驱动HC-SR04模块&#xff0…

力扣刷题--2085. 统计出现过一次的公共字符串【简单】

题目描述 给你两个字符串数组 words1 和 words2 ,请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。 示例 1: 输入:words1 [“leetcode”,“is”,“amazing”,“as”,“is”], words2 [“amazing”,“leetcode”,“is”] 输出…

万字详解 MySQL MGR 高可用集群搭建

文章目录 1、MGR 前置介绍1.1、什么是 MGR1.2、MGR 优点1.3、MGR 缺点1.4、MGR 适用场景 2、MySQL MGR 搭建流程2.1、环境准备2.2、搭建流程2.2.1、配置系统环境2.2.2、安装 MySQL2.2.3、配置启动 MySQL2.2.4、修改密码、设置主从同步2.2.5、安装 MGR 插件 3、MySQL MGR 故障转…

QT之动态加载树节点(QTreeWidget)

之前写过一篇动态加载ComboBox,可参见下面这篇文章 QT之动态加载下拉框(QComboBox) 同理QTreeWidget也可以实现动态加载,在一些异步加载数据,并且数据加载比较耗时,非常实用。 效果 原理分析 要实现此类效…

[数据集][图像分类]骨关节炎严重程度分类数据集14038张4分类

数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):14038 分类类别数:4 类别名称:[“grade0”,“grade2”,“grade3…