ip-协议
文章目录
- 1. 网络层
- 2. `ip`协议
- 2.1 `ip`协议格式
- 2.2 网段划分
- 基本概念
- 网段划分的两种方式
- 为什么要网段划分?
- 特殊的IP地址
- IP地址数量不足
- 2.3 私有IP与公网IP
- 2.4 路由
- 3. IP的分片与组装
- 为什么要分片与组装?
- 如何分片?
- 如何组装?
1. 网络层
IP地址是一个32位的整数,再细致一点,它是由若干位网络号 + 主机号构成,IP = 网络号 + 主机号
一台主机发出的报文,经过多重路由,为什么就能到达指定的主机?这是因为报文中填写了目的IP地址,有了IP地址,报文就能到达目的地址
这表明IP真正的意义在于提供了一种"能力":将报文跨网络送至另一台主机的能力
所谓具有某种能力,指的是有很大概率做成某件事,但不一定百分百做成,也就是不一定"可靠",我们需要的是不仅仅具有将报文跨网络送至另一台主机的能力,还要"可靠"的送至,谁提供可靠呢?---- tcp协议
因此,tcp协议提供报文传输的策略,ip协议提供报文传输的能力、具体的执行,两者合作,我们的主机就具有将报文可靠的跨网络送至另一台主机的能力
2. ip协议
2.1 ip协议格式

-
如何将报头与有效载荷分离?
同
tcp类似,ip协议的报头也有4位首部长度,每1bit位代表4字节,可表示范围[0, 60]字节;减去固定的20字节,就是选项,剩余的就是数据 -
如何分用?
封装时,网络层知道上层是
tcp/udp向下交付的,在8位协议字段中填入,解包时读取,就得知应该交给上层哪个协议了
其他字段:
- 4位版本:通常是ipv4或者ipv6
- 8位服务类型(TOS):从最小延迟、最大吞吐量、最高可靠性、最小成本中选取一个,报文传输时会根据要求选择不同的路线,一般
telnet/ssh选择最小延迟,ftp选择最大吞吐量 - 16位总长度:
ip协议不仅有4位首部长度,还有自身的总长度字段 - 8位生存时间(TTL):网络是一个相当复杂的结构,难免有时会出现漏洞,报文在传输时可以会路由循环,每当报文经过一个路由,TTL–,如果路由器收到TTL为0的报文,就直接丢弃
我们通常用源端口、目的端口、源IP、目的IP、协议号这样的五元组,来标识一个网络通信
2.2 网段划分
基本概念
IP地址是一种有用且有限的资源,不同国家、组织、地区拿到IP地址后,就需要对它进行合理的划分;因此,我们所见的IP地址都是被精心设计过的
IP地址 = 网络号 + 主机号,处在同一网络的IP主机,它们IP地址的网络号一定相同
路由器是一种设备,通常跨两个网络,也就意味着它最少有两张网卡,也就有两个IP地址
它不仅仅能对报文进行路由,还能构建子网,给每台连接到自身子网中的主机动态分配IP地址(DHCP技术)
网段划分的两种方式
第一种是将IP地址分为5类

不同类别的网段容纳主机数不同,A类容纳的主机数过多,导致大部分可能没有使用,被浪费了
大部分人都申请B类,随着互联网的发展,IP地址又逐渐够用了,因此,这种网段划分的方式不常用了
第二种是CIDR方案
引入子网掩码,是一个32位的整数,通常前面若干bit位全1,代表网络号,后面全0~全1代表主机号
将IP地址 & 子网掩码 = 网络号

为什么要网段划分?
在学校中,我们的学号也是被划分过的,比如前几位代表院号,后几位代表学号,接下来以一种简化的模型来帮助理解

其中,正方形代表每个院的负责人,它们之间一定处在一个群,且互相知道对方的院号
此时你走在路上,捡到一张学生证,上面的学号是0100 0011,你非常热心,想要归还这张卡给本人,无奈整个学校人太多,总不可能找人一一匹对
于是,你将学号与你们的院号进行按位与,得到0100 0000,由此你能知道,该学生一定不是你们院的,具体是哪个院的,你也不知道,你只能把学生证给你们院的负责人
负责人一定知道每个院的负责人是谁,也知道每个院的院号,根据按位与的结果,判断学生一定是计院的,于是就交给计院的负责人,计院的负责人在它们的计院群通知,于是,学生证也就物归原主了
在整个过程中,每个院就是一台路由器,学生证就是要发送的报文
如果没有对每个院进行合理的划分,我就需要找遍学校里的所有人,才能将学生证物归原主;有了划分之后,只要进行一次按位与操作,就能排除其他所有院,只剩一个院,大大提高了查找的效率
因此,网段划分的真正意义:网段划分后,未来就能提高报文查找到目标主机的效率
特殊的IP地址
- 主机地址全为0,表示网络号,代表整个局域网
- 主机地址全为1,表示广播地址,用于向同一局域网内的所有主机发送报文
IP地址数量不足
随着互联网的发展,目前IP地址的数量早已严重不够用了,虽然使用子网掩码的划分方案(CIDR)缓解了IP地址不足的现状,但并没有提高IP地址的数量上限,不过也出现了解决方案
- 动态IP地址分配(DHCP):路由器能为接入到自身构建子网的主机动态分配IP地址,也就是说不同时间段接入同一局域网的主机IP地址可能相同
- NAT技术
- ipv6
2.3 私有IP与公网IP
想要上网,得先有网,也就是得先组建网络,而组建网络离不开各种网络基础设施的建设:将光纤入户、站台建设等等,所有的这些我们貌似不需要做,我们好像只需要买台路由器就有网络了,这是因为这些工作已经有人帮我们做了
早在几十年前,我们国家政府就开始网络基础设施的建设了,也就有了三大运营商,它们帮我们做好了建好了基础设施;基础设施做好了,家家户户才能上网,各种互联网公司才有了生存的土壤
根据RFC 1918的规定,组建局域网的IP地址只能是这3种:
- 10.*(前8位是网络号)
- 172.16.* ~ 172.31.*(前12位是网络号)
- 192.168.*(前16位是网络号)
其余的IP地址都是公网IP地址
- 私有IP地址不能出现在公网中
- 不同私网(子网/局域网/内网)中,私有IP地址可以重复
- 虽然存在公网,但我们都必须先接入到指定的私网中
- 我们每个人都处于私网中
网络世界 = 私网 + 公网

每台路由器能构建子网,路由器本身通常是该子网中第一个主机,因此它有一个LAN口IP地址;同时,路由器又在其他路由器构建的子网中,在该子网中,它是一台主机,因此它也有一个WAN口IP地址
假设报文由私网上的一台主机发出,主机一定知道自身的网络号,发现目的地址不是自己处在的网络,将报文交给家用路由器,由于私有IP地址不能出现在公网中,因此会将源IP地址替换为家用路由器的WAN口IP地址
家用路由器查自身路由表,发现没有与之对应的网络号,交给运营商路由器,同时将源IP地址替换为运营商路由器的WAN口IP地址
运营商路由器处于公网中,能直接发送报文到目标主机

上述过程中,源IP地址的替换称为NAT转换,只在进出私网时才会做转换
直接与公网相连的路由器也称为出入口路由器
可以看到,报文都是交给运营商进行转发的,这也是为什么我们手机欠费就没网络的原因,运营商能直接将你的报文丢弃,不做NAT转换和转发
私网我们很好理解,但对于公网,上面只是简单带过,究竟什么是公网呢?下面以一种简化的模型举例

在上述模型中,国家之间的网络、省份之间的网络、市之间的网络、市内各种公司之间的网络就是公网
2.4 路由

每个工作在网络层的设备都有一张路由表,每台主机也不例外,这是云服务器上的路由表
当报文转交给路由器时,路由器会根据路由表来查询报文应该往哪走
上述例子中,一共有3个条目,从下往上看,将报文中的目的IP地址与条目中的genmask做&运算,如果与destination相同,则交给gateway地址的主机
其中flags如果有G,则表示下一跳的地址是某个路由器的地址(gateway),如果没有G,则表示目的地址与本机接口相连,直接向Iface的接口发送报文即可
如果都匹对完了,还是没有,则进行缺省路由,将报文送至上层路由器
3. IP的分片与组装
ip协议的报头字段中,我们还剩三个字段没讲,它们主要用来进行IP的分片和组装

为什么要分片与组装?

对于传输层,它将数据交给网络层,要求网络层将数据送至对方主机,网络层的确有这个能力,但数据链路层具有MTU的限制,那只好由网络层自己将报文进行分片,到达对方主机再进行组装
需要注意的是,报文被分片后,如果在传输过程中丢失了任意一个分片,则认为整个报文丢失,对方的网络层收到分片后不会将剩余的向上交付,而是等待tcp超时重传,IP再进行分片
那么问题来了,一个报文分成多片发送,丢包概率高,还是作为一个整体发送,丢包概率高?答案肯定是前者,也就是说分片后,报文的丢包概率更高;因此,IP分片不应该称为主流做法,应当避免分片
这时,网络层就对传输层说了,如果你给我交付的数据过大,我必须得进行分片,这样会导致丢包概率变大,从而你就要超时重传,对双方都是不利的;传输层听完后,细想好像确实如此,于是制定了策略,控制一个报文的大小
,该策略是什么呢?滑动窗口,在很多场景下,我们看到tcp滑动窗口内的数据都是被分成一块一块的,为什么不合并起来,一并发送呢?原因就是为了减少IP的分片
上面解释了三个问题:为什么要分片?为什么不想分片?如何做到不分片?
如何分片?

-
16位标识:标识IP报文的唯一性,如果报文被分片了,则该报文的每片16位标识都相同
-
3位标志:
第一位保留(保留的意思是当前不用,但不代表之后不会用)
第二位为1表示禁止分片,此时如果报文超过MTU,IP层就会直接丢弃该报文、
第三位表示更多分片,如果报文进行了分片,则最后一片该位为0,其他片该位为1
-
13位偏移量:
如果每分片,为0
如果分片了,则为当前分片的有效载荷在整个报文有效载荷中的偏移量,必须为8的倍数
IP报文的总长度可能16位的,最大可能2^16字节,此时用13位偏移量来表示后面分片的偏移量,是存不下的,因此,13位偏移量真实存的值是偏移量 >> 3,这也是为什么偏移量必须是8的倍数
如果报文长度超过MTU,IP进行分片,每个分片最多1500字节,这里拿总的报文长度为3000字节举例

如何组装?
-
如何判断收到的报文是否分片?
假设报文时分片的,则

于是,如果 (更多分片为0 && 片偏移量为0) ----> 没有分片的报文
更多分片为1 || 片偏移量不为0 ----> 分片报文的其中一片
-
如何判断分片的报文收全了?
将报文按片偏移量升序排序,下个分片中的片偏移量 = 当前报文的片偏移量 + 有效载荷的长度,逐次检查,直到确认有更多分片为0的分片
-
确认收全后,将每个分片中的报头去掉,只留下一个报头,逐次组装起来,交付给上层

相关文章:
ip-协议
文章目录 1. 网络层2. ip协议2.1 ip协议格式2.2 网段划分基本概念网段划分的两种方式为什么要网段划分?特殊的IP地址IP地址数量不足 2.3 私有IP与公网IP2.4 路由 3. IP的分片与组装为什么要分片与组装?如何分片?如何组装? 1. 网络…...
Git(11)之log显示支持中文
Git(11)之log显示支持中文 Author:Once Day Date:2024年12月21日 漫漫长路有人对你微笑过嘛… 参考文档:GIT使用log命令显示中文乱码_gitlab的log在matlab里显示中文乱码-CSDN博客 全系列文章可查看专栏: Git使用记录_Once_day的博客-CSD…...
oneflow深度学习框架使用问题总结(Windows/Linux)
目录 1.简述 2.在Windows下使用Oneflow深度学习框架(错误记录,谨慎,官方不支持,需要WSL) 2.1安装Anaconda 2.1创建虚拟环境 2.2安装Pytorch 2.3安装Pycharm 2.4 安装Oneflow 3.在Linux下使用Oneflow深度学习框…...
论文研读:AnimateDiff—通过微调SD,用图片生成动画
1.概述 AnimateDiff 设计了3个模块来微调通用的文生图Stable Diffusion预训练模型, 以较低的消耗实现图片到动画生成。 论文名:AnimateDiff: Animate Your Personalized Text-to-Image Diffusion Models without Specific Tuning 三大模块: 视频域适应…...
SQLAlchemy示例(连接数据库插入表数据)
背景需求 连接数据库,插入表中一些数据。 其用户是新建用户,所以只能插入,不能更新。 再次输入数据则使用更新数据语法,这个没调试。 #! /usr/bin/env python # -*- coding: utf-8 -*-from sqlalchemy import create_engine, …...
Springboot3国际化
国际化实现步骤 Spring Boot 3 提供了强大的国际化支持,使得应用程序可以根据用户的语言和区域偏好适配不同的语言和地区需求。 添加国际化资源文件: 国际化资源文件通常放在 src/main/resources 目录下,并按照不同的语言和地区命名…...
阿尔萨斯(JVisualVM)JVM监控工具
文章目录 前言阿尔萨斯(JVisualVM)JVM监控工具1. 阿尔萨斯的功能2. JVisualVM启动3. 使用 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。 而且听说点赞的人每天的运气都不会太差ÿ…...
框架专题:反射
1. 什么是反射? 简单来说,反射是一种程序自省的能力,即在程序运行时动态地获取其结构信息或操作其行为。这包括类、方法、属性等元信息。反射的核心在于让代码变得更加动态化,从而突破静态语言的限制。 以Java为例,反…...
【Go】context标准库
文章目录 1. 概述1.1 什么是 Context1.2 设计原理1.3 使用场景源码分析核心:Context接口4个实现6个方法TODO 和 BackgroundWithCancelcancelpropagateCancel 绑定父对象WithTimeout 和 WithDeadlineWithValue总结参考1. 概述 基于版本: go1.22.3/src/context/context.go 1.1…...
LLMs之o3:《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读
LLMs之o3:《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读 导读:2024年12月,这篇论文提出了一种名为“审慎式对齐 (Deliberative Alignment)”的新方法,旨在提高大型语言模型 (LLM) 的安全性。论…...
git设置项目远程仓库指向github的一个仓库
要将你的Git项目设置为指向GitHub上的远程仓库,你需要执行以下步骤: 创建GitHub仓库: 登录到你的GitHub账户。点击右上角的 “” 号,选择 “New repository” 创建一个新的仓库。填写仓库的名称,可以添加描述ÿ…...
实战演练JDK的模块化机制
实战演练JDK的模块化机制--楼兰 带你聊最纯粹的Java 你发任你发,我用Java8。你用的JDK到什么版本了?很多开源框架都已经开始陆续升级JDK版本了。你对于JDK8往后陆陆续续更新的这些版本有什么感觉吗? 很多人会说其实并没有太多的感觉。JDK的新版本不断推出一些不痛不痒…...
jdk17+springboot3项目加密部署
最近项目需要在第三方服务器部署,由于没有交付源码。所以需要将项目加密后再部署。 网上找了一圈,发现xjar这个开源项目,可以将代码加密后进行部署。看了下正是我需要的。 于是按照文档打包加密,但启动的时候居然报错。 这个结…...
rm -rf 删除/下bin lib lib64 sbin软链接系统恢复
背景 不小心删除了/bin、/lib、/lib64和/sbin这些目录的软链接,导致系统中的各种命令都无法正常使用。在尝试多种方法后,包括添加环境变量和使用绝对路径执行命令无法恢复,最终不重装完美解决。 [rootcentos-8 /]# ll 总用量 36 drwxr-xr-x …...
并发与竞争
并发与竞争 并发与竞争的产生 Linux是一个多任务操作系统,肯定会存在多个任务共同操作同一段内存或者设备的情况,多个任务甚至中断都能访问的资源叫做共享资源,就和共享单车一样。在驱动开发中要注意对共享资源的保护,也就是要处…...
Java后端开发 ”Bug“ 分享——订单与优惠卷
“优惠券风波”:一段代码引发的线上事故 起因:优惠券功能上线 故事的开始源于公司新上线的一项促销活动——在用户未使用优惠券时,系统会自动赠送一张优惠券。这个功能不仅能提升用户体验,还能拉动平台的销售额。为了赶上活动上…...
Linux系统之tee命令的基本使用
Linux系统之tee命令的基本使用 一、tee命令介绍二、tee命令的使用帮助2.1 tee命令的help帮助2.2 tee命令帮助解释 三、tee命令的基本使用3.1 写入文件3.2 追加文件3.3 结合sudo命令3.4 结合EOF使用 四、注意事项 一、tee命令介绍 tee 是 Linux 和 Unix 系统中的一个命令&#x…...
idea 8年使用整理
文章目录 前言idea 8年使用整理1. 覆盖application配置2. 启动的时候设置编辑空间大小,并忽略最大空间3. 查询类的关系4. 查看这个方法的引用关系5. 查看方法的调用关系5.1. 查看被调用关系5.2. 查看调用关系 6. 方法分隔线7. 选择快捷键类型8. 代码预览插件9. JReb…...
多个微服务 Mybatis 过程中出现了Invalid bound statement (not found)的特殊问题
针对多个微服务的场景,记录一下这个特殊问题: 如果启动类上用了这个MapperScan注解 在resource 目录下必须建相同的 com.demo.biz.mapper 目录结构,否则会加载不到XML资源文件 。 并且切记是com/demo/biz 这样的格式创建,不要使用…...
k8s,service如何找到容器
Kubernetes之所以需要Service,一方面是因为Pod的IP不是固定的,另一方面则是因为一组Pod实例之间总会有负载均衡的需求 被selector选中的Pod,就称为Service的Endpoints,查看方式: kubectl get endpoints hostnames需要…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
