当前位置: 首页 > news >正文

网络层IP协议报头字段的认识

认识IP协议

IP协议(Internet Protocol),又称网际协议,是整个TCP/IP协议栈中的核心协议之一,位于网络层。IP协议是互联网中最基础的网络协议之一,负责在网络中传输数据包。它定义了数据包的格式、地址分配和路由选择等功能。IP协议通过使用IP地址作为唯一识别码,将数据报从源主机发送到目标主机,为数据包的传输提供了地址分配、路由选择、分片与重组等功能,使得不同主机之间的通信成为可能。tcp协议为数据传输提供了方法,而ip协议提供了数据传输的能力

IP报头字段的认识

  •  4位版本号(version): 指定IP协议的版本, 对于IPv4来说,就是4
  • 4位首部长度:表示的就是IP报文除去有效载荷的长度,而四位表示的正好是[0,15],而字节单位是四字节,所以四位首部长度所表示的范围就是[0,60]字节,减去20字节就是选项长度。
  • 十六位总长度:表示范围就是[0,2^16 - 1]字节,减去四位首部长度*4就是有效载荷的数据长度。
  • 八位上层协议:表示的就是上层传输层所用到的协议,主要让接收方可以读取到,能够用相同的协议进行接收读取报文。
  • 8位服务类型(Type Of Service): 3位优先权字段(已经弃用),4位TOS字段, 和1位保留字段(必须置为0)。4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要。
  • 8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数。一般是64。 每次经过一个路由,TTL -= 1,一直减到0还没到达, 那么就丢弃了。 这个字段主要是用来防止出现路由循环。
  • 16位头部校验和:使用CRC进行校验, 来鉴别头部是否损坏。
  • 32位源地址和32位目标地址:表示发送端和接收端 

对于IP报头的第二行字段的作用其实就是用来控制,数据从应用层到数据链路层时的数据报文要小于MTU(Maximum Transmission Unit,最大传输单元)一般默认通常是1500字节,也就是数据帧要小于1500字节,如果IP层发送到数据链路层的报文大小超过MTU值,那么数据在发送到数据链路层之前将被分割成较小的数据包。也就是IP层的分片与组装:

IP层的分片与组装

  • 16位标识(id):唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个标识id都是相同的。
  • 3位标志字段:第一位保留(保留的意思是现在不用, 也就是还没想好,说不定以后要用到)。 第二位置为1表示禁止分片(一般都是0),这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示“更多分片”, 如果分片了的话,最后一个分片置为0(如果没分片也是0),其它是1。类似于一个结束标记。
  • 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(因为总长度是16位,而片偏移是13位,而恰好8=2^3),否则报文就不连续了。

 而我们在每一次分片的时候都需要重新添加IP报头到新分片的报文前面(需要报头中的分片属性来进行组装)。而报头的长度一般都是和分片前是一样的,只不过3位标志字段可能会改变,而且13位分片偏移的数值不一样。

分片过程:

组装过程:

  1. 根据3位标志如果为0,并且13位片偏移也为0的话就表明没分片。否则就表明分片了。
  2. 根据16位标识id进行收集所有分片的报文。
  3. 报文收取顺序:根据当前报文的13位片偏移的大小+当前报文长度就是下一个报文的片偏移值。开头报文,13位片偏移为1,而最后一个分片的3位标志为0。

 

 网络中数据从上向下交付的过程理解

我们的数据从应用层向下传输的过程中其实就是sk_buff缓冲区的数据进行向下交付。也就是说:当发送数据报时,Linux内核的网络模块会建立一个包含要传输数据的sk_buff的缓冲区,然后将它传递给下一层,每层在sk_buff中添加不同的协议头,直到交给网络设备发送

当数据包被接收时,网络设备将接收到的数据转换为sk_buff,并传递给上层,每层剥去(解析)相应的协议头后直到将有效载荷数据内容交给用户。

网段划分

网络号:保证相互连接的两个网段具有不同的标识。

主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。

而路由器就是至少要连接两个子网,才能进行跨网络进行数据发送。路由器是可以构建子网的,当计算机发送申请然后连接到路由器的无线网络的时候就可以进行上网,这是因为,路由器还在该网段内为你的计算机分配一个同网络号不同主机号的IP地址,也就是管理局域网下的IP地址。

也就是DHCP应用层协议:是一个局域网的网络协议,用于集中管理和自动分配IP地址等网络配置信息给网络中新增的的主机。

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

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

例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多。然而实际网络架设中, 不会存在一个子网内有这么多的情况。因此大量的IP地址都被浪费掉了。


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

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

 子网划分的好处:

  • 提高定位和查找主机的效率。
  • 提高管理性和IP地址利用率。

公网IP和私有IP

私有IP地址

私有IP地址是指仅在局域网(LAN)内部使用的IP地址,这些地址在Internet上是不可见的,也不会被路由到公网上。它们主要用于内部网络设备的互连,以便在不需要公网访问的情况下,设备之间可以相互通信。

  • 范围:常见的私有IP地址范围包括三个主要块:
    • 10.0.0.0 到 10.255.255.255(10.0.0.0/8)
    • 172.16.0.0 到 172.31.255.255(172.16.0.0/12)
    • 192.168.0.0 到 192.168.255.255(192.168.0.0/16)
  • 特点
    • 只能在内部网络中使用。
    • 无需向任何机构申请,可自由分配。
    • 提高了内部网络的安全性,因为外部设备无法直接访问这些地址。
    • 需要通过NAT(网络地址转换)等技术来实现内部网络与公网的通信。

公网IP地址

公网IP地址是指可以直接在Internet上被访问和路由的IP地址。这些地址由Internet服务提供商(ISP)或其他相关机构分配给组织或个人,以便他们能够与其他Internet上的设备进行通信。

  • 特点
    • 可以在全球范围内唯一标识一台设备。
    • 需要向ISP或其他相关机构申请并支付费用(在某些情况下可能是免费的)。
    • 可用于远程访问内部网络资源,如远程桌面、VPN服务等。
    • 安全性较低,因为直接暴露在Internet上,容易受到攻击。

总结:私有IP地址主要用于内部网络的互连和通信,而公网IP地址则用于设备在Internet上的唯一标识和通信。在实际应用中,通常会通过NAT等技术将内部网络的私有IP地址转换为公网IP地址,以实现内部设备与Internet的通信

内网IP不能出现在公网中

从以上图中不难看出每个路由都是配置了两个IP,一个是子网(LAN口)IP一个是WAN口IP。

路由器LAN口连接的主机都是从属于当前路由器的子网中。不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1)。子网内的主机IP地址不能重复。 但是子网之间的IP地址就可以重复了。如图的六台主机都是三三相同的IP地址,所以私有IP地址在Internet上不是唯一的。

每一个家用路由器,其实又作为运营商路由器的子网中的一个节点。 所以说WAN口IP是指连接外部网络(如互联网)的接口(WAN口)所使用的IP地址。这样的运营商路由器可能会有很多级,最外层的运营商路由器, WAN口IP就是一个公网IP了

子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP。 这种技术称为NAT(Network Address Translation,网络地址转换)。而NAT技术就是:任何一个内网路由器在转发报文的时候,都要将榜文中的源IP替换成路由器的WAN口IP。

所以内网IP不能出现在公网中的原因:因为它们是私有IP地址,不是全球唯一的,无法在Internet上进行路由和寻址。

IP地址数量有限与解决

我们知道, IP地址(IPv4)是一个4字节32位的正整数。 那么一共只有 2的32次方 个IP地址,大概是43亿左右。而TCP/IP协议规定,每个主机都需要有一个IP地址。这意味着, 一共只有43亿台主机能接入网络实际上,由于一些特殊的IP地址的存在,数量远不足43亿;另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址。

CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用。这时候有三种方式来解决:

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

IP的路由过程

IP数据包的传输过程也和问路一样:

当IP数据包到达路由器时,路由器会先查看目的IP,通过目的IP和子网掩码按位与得到网络号,根据网络号路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器,依次反复,一直到达目标IP地址。

而如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表

主要就是判断目的IP是否命中了路由表中其中行IP,从而决定是转发到主机还是就按缺省路由条目规定的接口发送到下一跳地址。

相关文章:

网络层IP协议报头字段的认识

认识IP协议 IP协议(Internet Protocol),又称网际协议,是整个TCP/IP协议栈中的核心协议之一,位于网络层。IP协议是互联网中最基础的网络协议之一,负责在网络中传输数据包。它定义了数据包的格式、地址分配和…...

Linux部署MySQL8.0

目录 一、部署前准备1.1、查看系统版本和位数(32位或64位)1.2、下载对应安装包 二、开始部署1、将安装包解压并且移动到目标安装目录2、准备MySQL数据和日志等存储文件夹3、准备MySQL配置文件 my.cnf4、创建mysql单独用户组和用户,将安装目录…...

二叉树中的深搜

🎥 个人主页:Dikz12🔥个人专栏:算法(Java)📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 1. 计算布尔二叉树的值 1.1 题目描述 1.2 题解 1.3 代码实现 2. 求根节…...

固态继电器行业知识详解

固态继电器(SSR)是一种通过电子元件来实现开关功能的器件,与传统的电磁继电器相比,它具有更高的可靠性、耐用性和响应速度,广泛应用于工业自动化、家用电器和各种电子控制系统中。本文将详细探讨固态继电器的工作原理、…...

【practise】数组中出现次数超过一半的数字

关于我: 睡觉待开机:个人主页 个人专栏: 《优选算法》《C语言》《CPP》 生活的理想,就是为了理想的生活! 作者留言 PDF版免费提供:倘若有需要,想拿我写的博客进行学习和交流,可以私信我将免费提供PDF版。…...

RAGFlow v0.9 重磅升级,支持 GraphRAG,开启下一代 RAG 之旅!

一、引言 前面我们介绍过很多的关于大模型和RAG相关的技术,通过其关注程度足以看到市场上对RAG框架和成熟产品的迫切需求,因为想要个人独立从0开始实现一个RAG产品并非易事,虽然有相当多的RAG或者知识库开源产品,大部分其实很难应…...

MySQL的InnoDB的页里面存了些什么

文章目录 创建新表页的信息新增一条数据根据页号找数据信息脚本代码py_innodb_page_info根据地址计算页号根据页号计算起始地址 主要介绍数据页里面有哪些内容,一行数据在文件里面是怎么组织的 创建新表页的信息 CREATE TABLE test8 (id bigint(20) NOT NULL AUTO…...

SQL Server 事务

1. 什么是事务 SQL Server 事务是数据库操作的一个基本特性,它允许你将一系列数据库操作组合成一个原子单元,这个单元中的所有操作要么全部成功,要么全部失败。事务具有以下四个重要的属性,通常被称为ACID属性。 2、事务的特性 原…...

qt quick实现的水波纹特效:横向波纹、纵向波纹效果

qml实现的水波纹特效 1.横向波纹效果2.另一种效果(纵向波纹) 一直以来使用c qt如果要实现一些高级特效比如水波纹效果都难度比较大,但是使用qt quick难度就会小很多。这里借鉴一些网友的思路简单实现一下水波纹效果。主要思路就是波浪的形成是…...

释放数据要素价值,FISCO BCOS 2024 应用案例征集

2024年,国家数据局等17部门联合印发《“数据要素”三年行动计划(2024—2026年)》,《行动计划》指出,发挥数据要素的放大、叠加、倍增作用,构建以数据为关键要素的数字经济,是推动高质量发展的必…...

日撸Java三百行(day18:循环队列)

目录 一、顺序队列与循环队列 二、代码实现 1.循环队列创建 2.循环队列遍历 3.循环队列入队 4.循环队列出队 5.数据测试 6.完整的程序代码 总结 一、顺序队列与循环队列 在昨天,我们提到队列实现除了采用链式存储结构,还可以采用顺序存储结构&…...

论文精读1

Equivariant Pretrained Transformer for Unified Geometric Learning on Multi-Domain 3D Molecules 核心公式: 论文导图 创新在统一分子建模和块级去噪预训练。...

uniapp免费申请苹果证书教程每次7天可用于测试

准备一个苹果账号没有加入过任何组织的 然后下载appuploader下载链接 登录上去切记勾选上未付苹果688 然后点击苹果证书创建p12证书 创建描述文件 uniapp打包自定义基座 这就打包好了可以愉快地开发了,但每次生成只有7天,设备限制3个&#xff0c…...

【优秀python大屏】基于python flask的广州历史天气数据应用与可视化大屏

摘要 气象数据分析在各行各业中扮演着重要的角色,尤其对于农业、航空、海洋、军事、资源环境等领域。在这些领域中,准确的气象数据可以对预测未来的自然环境变化和采取行动来减轻负面影响的决策起到至关重要的作用。 本系统基于Python Flask框架&#…...

eBPF编程指南(一):eBPF初体验

1 什么是EBPF? EBPF是一种可以让程序员在内核态执行自己的程序的机制,但是,为了安全起见,无法像内核模块一样随意调用内核的函数,只能调用一些bpf提前定义好的函数。为了让内核执行程序员自己的代码,需要指…...

pip笔记

pip介绍 pip的全称:package installer for python,也就是Python包管理工具。 配置镜像源 镜像列表 阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/豆瓣 http://pypi.douban.com/simple/清华大…...

centos安装postgresql-12

安装pg文件 sudo curl -o /etc/yum.repos.d/pgdg-redhat-all.repo https://mirrors.aliyun.com/postgresql/repos/yum/12/redhat/rhel-7-x86_64/pgdg-redhat-all.repo 清楚缓存重新安装 sudo yum clean all sudo yum makecache 如果报错 删除现有的文件 sudo rm /etc/yum.r…...

Npm使用教程

Npm使用教程 Npm(Node Package Manager)是Node.js的包管理工具和软件包管理系统,广泛用于JavaScript项目的依赖管理和包发布。本文将为你提供一份详细的Npm使用教程,从安装、基本命令、包管理到高级用法,帮助你全面掌…...

【Android Studio】修改项目名称can‘t rename root module解决办法

文章目录 问题现象解决办法 问题现象 修改项目名称 但是直接rename 又会出现 can‘t rename root module 的警告 下图方式只适合修改除项目级别以外的,直接修改项目名称则会报错 解决办法 此时我们只要两步就可以成功修改项目名称了 关闭项目修改其文件夹名称…...

豆瓣Top250电影数据分析可视化系统(Flask+Mysql+Pyecharts)

爬取目标网址:豆瓣Top250 可以看到进入每条电影的详细链接后,显示的内容会更加详细一点 因此我们需要先利用爬虫技术从主页爬取到每条电影的链接,再分别遍历每条电影的链接,获取它的详细内容,这里仅展示一部分代码 利…...

【SSM】SpringMVC学习笔记7:前后端数据传输协议和异常处理

这篇学习笔记是Spring系列笔记的第7篇,该笔记是笔者在学习黑马程序员SSM框架教程课程期间的笔记,供自己和他人参考。 Spring学习笔记目录 笔记1:【SSM】Spring基础: IoC配置学习笔记-CSDN博客 对应黑马课程P1~P20的内容。 笔记2…...

TI德州仪器TPS3103K33DBVR低功耗电压监控器IC电源管理芯片详细解析

1. 基本介绍 TPS3103K33DBVR 是 德州仪器(Texas Instruments, TI) 推出的一款 低功耗电压监控器(Supervisor IC),属于 电源管理芯片(PMIC) 类别,主要用于 系统复位和电压监测。 2. …...

ubuntu自定义服务自动启动

自定义服务 在路径 /etc/systemd/system/ 下 定义example.service [Unit] DescriptionMy Custom Script[Service] ExecStart/root/exe_start.sh Typeoneshot RemainAfterExityes[Install] WantedBymulti-user.target在/root/ 路径下执行 vi exe_start.shcd /root/mes_server/…...

js 比较两个对象的值,不相等就push对象的key

在JavaScript中,比较两个对象(object)的值并找出不相等的key,可以通过多种方法实现。下面是一些常用的方法: 方法1:使用JSON.stringify 这种方法适用于简单的对象,其中对象的值是基本类型或可…...

简约商务年终工作总结报告PPT模版分享

简约精致扁平化商务通用动画PPT模版,简约大气素雅商务PPT模版,商务PPT模版,商业计划书PPT模版,IOS风商务通用PPT模版,公司介绍企业宣传PPT模版,创业融资PPT模版,创意低多边形PPT模版&#xff0c…...

JVM内存区域与溢出异常详解

当然可以。以下是结合了程序计数器和Java内存区域以及内存溢出异常的详细解释: JVM内存区域与内存溢出异常 Java虚拟机(JVM)管理着不同类型的内存区域,每个区域都有其特定的功能和可能导致的内存溢出异常。 程序计数器&#xff…...

leetcode sql50题

在中文站没找到对应的集合,想来自己动手拷贝过来,方便大家面试复习用,对应英文站点: https://leetcode.com/studyplan/top-sql-50/ Select #1757. 可回收且低脂的产品 链接: https://leetcode.cn/problems/recyclable-and-low-fa…...

Ubuntu挂载本地镜像源(像CentOS 一样挂载本地镜像源)

1.挂载 ISO 镜像 sudo mount -o loop /ubuntu-22.04.5-desktop-amd64.iso /mnt/iso 2.备份现有的软件源配置文件: sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 3.编辑软件源配置文件 编辑 /etc/apt/sources.list sudo nano /etc/apt/sources.l…...

uni-app学习笔记二十四--showLoading和showModal的用法

showLoading(OBJECT) 显示 loading 提示框, 需主动调用 uni.hideLoading 才能关闭提示框。 OBJECT参数说明 参数类型必填说明平台差异说明titleString是提示的文字内容,显示在loading的下方maskBoolean否是否显示透明蒙层,防止触摸穿透,默…...

QT进阶之路:带命名空间的自定义控件在Qt设计器与qss中的使用技巧

文章目录 0.前言1.带命名空间Qt自定义类在QT设计器中的使用技巧1.1 定义一个带命令空间QLabel自定义类1.2 在QT设计器中引入自定义控件类 2.带命名空间Qt自定义类在qss中的使用技巧2.1 命名空间在 QSS 中的特殊语法2.1 在QSS中定义带命名空间的样式 3.在项目中使用带命名空间的…...