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需要…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...