IP协议介绍
文章目录
- 一、IP协议的基本认识
- 二、IP的协议头格式
- 三、网段划分
- 四、特殊的IP地址
- 五、IP地址的数量限制
- 六、私有IP地址和公网IP地址
一、IP协议的基本认识
IP在网络分层中属于网络层协议,传输层协议里的TCP协议解决的是可靠性问题,网络层协议里的IP协议能让主机拥有将数据从本地发送到远端主机的能力。但这个能力并不一定是可靠的,也就是说有可能会出现发送失败的情况,所以我们可以结合TCP协议,也就是说,TCP/IP协议能让主机拥有将数据从本地可靠地发送到远端主机的能力。
主机指的是配有IP地址的一台独立计算机,单个主机只要它具有对应的网络层,它就具有路由控制的能力。
路由器是配有IP地址,可以进行路由控制的设备,它主要功能是在网络传输路上对数据包进行转发。
路由器和主机统称为节点。
二、IP的协议头格式
IP的协议头格式与TCP的协议头格式非常像,下面将分别介绍IP协议的协议头格式中各个字段所代表的含义。
4位版本
该字段代表的是IP协议的版本号,一般填的都是IPV4,虽然也有IPV6的IP协议,但是IPV6和IPV4是不兼容的,所以这里的四位版本字段一般填充的都是IPV4,如果是IPV6,那就是另外一套策略了。
4位首部长度
该字段代表的就是整个IP报文的长度,这里和TCP协议中的4位首部长度是一样的,理论上它的取值范围是0000~1111
,单位是4个字节,但事实上IP协议的协议报头标准长度是20个字节,所以4位首部长度的实际取值范围应该是0101~1111
。
8位服务类型(TOS)
该字段一般很少去使用,这8位中其中3位是优先权字段(已经弃用),4位是TOS字段,1位是保留字段(必须置为0)。其中4位TOS字段(Type Of Service),分别表示最小延时、最大吞吐量、最高可靠性、最小成本。这四者相互冲突,在使用时只能选择一个。比如我们将来写一些应用程序,该程序想要尽快地将数据推送到对端,比如ssh/telnet这样的程序,最小延迟比较重要。比如我们将来要写一些文件传输类的程序,比如ftp这种程序,最大吞吐量比较重要。
16位总长度(字节数)
该字段代表IP数据报整体占多少个字节。
8位协议
该字段代表上一层的协议是什么类型。
8位生存时间(TTL,Time To Live)
当数据在网络传输的过程中,由于网络出现BUG或者对端主机不可达等不可控因素的存在,有可能会导致IP报文在网络中长时间游离,而不消失,这种游离的报文到达不了对端主机,属于没有任何意义的报文了,再怎么转发也到达不了对端主机,反而还要占用网络带宽的资源。所以我们必须给IP报文设置生命周期,8位的生存时间就是IP报文的生命周期。比如把该字段设置为X,当IP报文在网络中每经过一个路由器,就将X的值减一,当X的值减到0时,就代表该报文的生命周期到了,直接可以将该报文丢弃。
32位源IP地址和32位目的IP地址
这两个字段顾名思义,分别代表的是源IP地址和目的IP地址。
16位标识、3位标志和13位片偏移
16位标识、3位标志和13位片偏移这三个字段位于IP协议报头中的第二行,这三个字段都与IP报文分片和组装有关。
数据链路层有发送单个数据帧的最大值约束,所以我们不能发送太大的IP报文。但是如果我们的IP报文很大,就需要对IP报文进行分片。这就好比寄快递的时候,有些快递公司可能规定单个包裹最大重要是多少,如果我们要寄的东西超过了这个最大重量,就没办法按单个包裹进行寄送了,只能将其进行拆分,拆分成多个包裹一起寄送。
但是分片也会出现丢包问题,如果一个IP报文被分成多个报文发出,只要其中有一个报文丢包了,在对端的网络层都不会将这个不完整的IP报文交付给传输层,而是认为该IP报文整体丢包了。显而易见的是,分片之后丢包的概率是变得更大了,所以网络层进行分片并不是主流手段,所以一般在发报文时,尽量避免IP报文分片。
下面介绍如何对IP报文进行分片。IP报文的报头中都有一个16位标识字段,这里填的是IP的序号,当对IP进行分片时,分出来的每一份IP报文都要填充原IP报文的标识。
当接收端的网络层拿到IP报文时,要进行IP报文进行组装,首先要识别哪些报文是被分片过的,然后将被分片的报文中序号相同的报文集合在一起。接收端识别报文是否是被分片的,就需要用到IP报文中的3位标志字段。3位标志字段是3个比特位,第一个比特位保留,保留的意思是现在不用,但是还没想好说不定以后要用到。第二个比特位如果被设置为1则代表禁止分片,禁止分片时如果报文的长度超过数据链路层一次能接受的最大长度,IP模块就会丢弃该报文。第三位如果被设置为1则代表更多分片,如果该IP报文被分片了,前面的所有分片报文这个第三位都设置为1,只有最后一个分片报文中这个第三位被设置为0,类似于一个结束标记。
接收端将被分片过的报文中序号相同的报文集合起来以后,就需要对报文进行组装了。这里就需要用到IP协议报头中的13位片偏移字段,该字段是分片相对于原始IP报文开始处的偏移量,其实就是表示当前分片在原报文中处在哪个位置。
接收端是如何判断接收到的IP报文哪些是被分片的呢?
首先看该报文的三位标志字段中第三位是否是1,如果是的话则代表该报文是被分片的,如果第三位是0,再看该报文的片偏移字段是否为0,如果片偏移字段不为0,则代表该报文是被分片的,并且是最后一个分片。如果片偏移字段为0,那就代表该报文不是被分片的。
接收端如何确定收集起来的相同序号的分片报文是否是完整的呢?
判断第一片分片报文是否丢了,只需要让所有的相同序号的分片报文按照片偏移量进行排序,如果排好序之后片偏移量最小的报文不是0,那么就代表第一片分片丢了。
判断最后一片报文是否丢了,只需要查看这些报文中是否没有3位标志位中第三位为0的报文,如果是的话,则代表最后一片报文丢了。
判断中间的报文是否丢了,只需要让所有的相同序号的分片报文按照片偏移量进行排序,然后从头开始遍历确认,如果片偏移量加上报文自身长度不等于下一个报文的片偏移量,则代表中间有报文丢了。
IP分片会影响传输层的TCP和UDP吗?
答案是当然会的,因为分片提高了丢包的概率,对TCP的影响可能相对少一点,因为TCP是可靠性传输,就算丢包了可以超时重传等等。但是UDP是不可靠传输的,所以对UDP影响是会比较大的。
三、网段划分
IP地址是由目的网络
+目的主机
构成的,目的网络即网络号,它保证相互连接的两个网段具有不同的标识。目的主机即主机号,在同一网段内,主机之间具有相同的网络号,但是它们的主机号必须不相同,主机号就是用来在同一网段内标识唯一主机的。IP报文在网络传输的时候,先根据IP地址的目的网络进行路由,找到目标网络。然后再根据目的主机的主机号进行数据转发。
不同的子网其实就是把网络号相同的主机放到一起,如果子网中新增了一台主机,则这台主机的网络号和这个子网的网络号必须一致,但是主机号必须不能和子网中的其它主机重复。
全球每一台电脑主机都有自己唯一的IP地址,我们的IP地址都是被划分成不同的网段的。过去曾经提出一种划分网络号和主机号的方案,把所有的IP地址分为5类,如下图所示:
这种方法叫作分类划分法,最后IP地址经过划分,这五类就有自己的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
随着互联网的高速发展,这种划分方案的局限性很快显现出来了,大多数组织机构都申请B类网络地址,导致B类地址很快就分配完了,例如一个机构申请了一个B类地址,理论上一个子网可以允许有2^16次方,也就是65536台主机,但该机构只有2万个主机使用,就会导致有4万个主机名额的浪费。
针对这种情况我们又提出了新的划分方案,称为CIDR(Classless Interdomain Routing):它引入了一个额外的子网掩码,让每一个子网都配上一个子网掩码,用子网掩码来区分网络号和主机号。举个例子,假设我们的IP地址是八位的,该IP地址会配上一个也是八位的子网掩码,我们将IP地址与子网掩码进行按位与,就可以提取出该IP地址对应的网络号。
IP地址的划分可以将世界上所有的主机划分成不同的网段,通过网段的划分就可以快速地查找到该IP地址对应的主机。比如我们拿到一个需要发送的IP报文,看一看目的IP地址是什么,先从该IP地址中判断它是属于哪一个国家的,比如说判断出来是属于中国的IP地址,然后再看该IP地址属于哪个省的,再看属于哪个市的,最后一直向下定位直到找到这一台主机。网段划分就是分配IP地址资源的一种策略。
四、特殊的IP地址
- 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个子网(局域网)
- 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包
- 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
五、IP地址的数量限制
IP地址(IPV4)是一个4字节32位的正整数,那么一共只有2^32个IP地址,大概就是43亿左右。而TCP/IP协议规定,每个主机都需要有一个IP地址,并且由于一些特殊的IP地址的存在,IP地址的数量可用的远远不足43亿。另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址,比如说路由器。所以IP地址的数量是不够使用的。
CIDR在一定程度上缓解了IP地址不够用的问题,但它只是提高了IP地址的利用率,减少了浪费,并没有增加IP地址的绝对上限,所以IP地址仍然不是很够用,这时候就有三种方式来解决这个问题:
- 动态分配IP地址,只给接入网络的设备分配IP地址,不上网的设备就不给它分配IP地址,最典型的就是我们连接WIFI,只要我们一连接就会分配给我们一个IP地址,不连接的话就不会分配。但这种方法推广到公网上就不是特别适用了,因为公网上一般都是路由器或者服务器,这些都是要一直提供网络服务的。
- 使用IPV6的技术,IPV6并不是IPV4的简单升级版,这是两个互相相干的协议,彼此并不兼容。IPV6用16个字节128个比特位来表示一个IP地址,但是目前IPV6还没有完全普及。
- NAT技术
六、私有IP地址和公网IP地址
如果一个组织内部组建局域网,IP地址只用于局域网内通信,而不直接连到Internet上,理论上使用任意的IP地址都是可以的,但是RFC 1918规定了用于组建局域网的私有IP地址:
- 10.*,前8位是网络号,共16777216个地址
- 172.16.到172.31.,前12位是网络号,共1048576个地址
- 192.168.*,前16位是网络号,共65536个地址
包含在这个范围中的,都称为私有IP,其余的则称为全局IP,也叫作公网IP。
我们家里拉过网线的话应该都知道,拉网线是需要找三大运营商帮我们拉的,运营商会给我们配置好一个局域网并给我们一个路由器,每个人家里应该都有这个路由器,这个路由器就是你们家里局域网的一号主机。未来我们想通过网络访问公网服务器的时候,我们家里的路由器是不能直接将数据转发到公网的,而是要先将我们的数据转发到运营商的路由器上,运营商的路由器再帮我们把数据转发到公网上。我们不能绕过运营商,这也是为什么我们上网要给运营商交费,因为是运营商为我们搭建好的上网渠道。
- 一个路由器可以配置两个IP地址,一个是WAN口IP,一个是LAN口IP(也叫子网IP)。
- 路由器LAN口连接主机,都从属于当前这个路由器的子网中。
- 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了。
- 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN口IP就是一个公网IP了。
如果我们此时通过运营商给家里连上网络了,我们想在网络上浏览别人服务器的内容,比如想上网看个抖音,这个时候我们的请求会从主机发送到我们家里的家用路由器,源IP地址就是我们主机在局域网内的IP地址,目的IP地址就是我们要访问的服务器在公网上的IP地址。
当我们的数据转发到家用路由器之后,家用路由器需要将我们的数据进一步转发给运营商路由器,但此时我们处在的就是运营商路由器下的局域网了,如果还用我们主机在家用局域网内的IP地址的话,可能就会与其它家用局域网内的IP地址重复了,所以家用路由器会帮我们将源IP地址替换,替换成WAN口IP地址。
数据转发到了运营商的路由器,也要同样地进行这种源IP地址的替换,同样是替换成运营商路由器的WAN口IP地址,最终数据包就这样被转发到了公网中的服务器上。
这种技术称为NAT(Network Address Translation,网络地址转换)技术,这种方法可以隐性地增加IP地址的数量,因为局域网之间IP地址是可以重复的。
相关文章:

IP协议介绍
文章目录 一、IP协议的基本认识二、IP的协议头格式三、网段划分四、特殊的IP地址五、IP地址的数量限制六、私有IP地址和公网IP地址 一、IP协议的基本认识 IP在网络分层中属于网络层协议,传输层协议里的TCP协议解决的是可靠性问题,网络层协议里的IP协议能…...

将一个单体服务重构成微服务
将一个单体服务重构成微服务需要经过以下步骤: 1. 拆分服务:将单体服务拆分成多个小服务,每个服务只负责一个特定的功能。拆分的原则是将服务按照业务功能进行划分,每个服务都应该是相对独立的。 2. 设计API:为每个服务…...

SpringBoot项目如何打包成exe应用程序
准备 准备工作: 一个jar包,没有bug能正常启动的jar包 exe4j,一个将jar转换成exe的工具 链接: https://pan.baidu.com/s/1m1qA31Z8MEcWWkp9qe8AiA 提取码: f1wt inno setup,一个将依赖和exe一起打成一个安装程序的工具 链接:…...

一文读懂:客户管理系统平台是什么?有什么作用?
“客户管理系统平台是什么?” “客户管理系统平台有什么作用?在哪里可以应用?怎么用?” 经常可以听到企业内部关于客户管理系统平台的这些问题,本文将会为您一一解答: 一、客户管理系统平台是什么 顾名…...

Node.js 与 TypeScript
目录 1、什么是 TypeScript 2、运行TypeScript 3、TypeScript 在Node.js 生态中的情况 1、什么是 TypeScript TypeScript是一种流行的开源语言,由微软维护和开发。它受到了世界各地许多软件开发人员的喜爱和使用。 基本上,它是JavaScript的超集&…...

Python并发编程之进程理论
前言 本文将详细介绍进程相关概念。 进程和程序 计算机上的未运行的QQ、Wechat等都属于程序,但是一旦当这些程序运行起来的话,就可以被称为进程。因此可以如下定义程序和进程: 程序:就是存在硬盘上的一堆代码。 进程…...

超级详细的mysql数据库安装指南
MySql数据库 如果你的电脑是mac那么你看这位大佬的分享。 如果你的电脑是windows,参考下面的安装步骤。 一、下载mysql数据库? 进入MySQL官方网站(MySQL Community Downloads),按下图顺序点击 1、进入下载页面 2、…...

Java并发编程实践学习笔记(三)——共享对象之发布和异常
目录 1 公共静态变量逸出 2 非私有方法逸出私有变量 3 this引用逸出 4 构造函数中的可覆盖方法调用逸出 发布(publishing)一个对象的意思是:使对象能够在当前作用域之外的代码中使用。例如,将一个指向该对象的引用保存到其他代…...

Python学习之Image模块图片滤镜效果操作示例
前言 滤镜效果是图像处理中常用的一种技术,可以用来增强图像的视觉效果,实现不同的效果,比如增强对比度、饱和度、色彩等。滤镜效果可以帮助用户快速地调整图像的特性,从而使图像更加适合用户的需求。 Image模块对于图像处理的…...

Grafana 系列-统一展示-5-AWS Cloudwatch 仪表板
系列文章 Grafana 系列文章 👍️强烈推荐 强烈推荐使用 GitHub 上的 monitoringartist/grafana-aws-cloudwatch-dashboards 仪表板。该 repo 有一系列 AWS 资源的仪表板,包括但不限于: EC2EBSAPI GWAutoscalingBillingEKSLambdaLogsRDSS3…...

MySQL---控制流函数、窗口函数(序号函数、开窗聚合函数、分布函数、前后函数、头尾函数、其他函数)
1. 控制流函数 格式 解释 案例 IF(expr,v1,v2) 如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2。 SELECT IF(1 > 0,正确,错误) ->正确 IFNULL(v1,v2) 如果 v1 的值不为 NULL,则返回 v1ÿ…...

一心报国的西工大网安人走出新手村
大二下学期5月5日晚上,西工大长安校区教学西楼,作为一名网安专业本科生,从大一便立志学好网安知识,报效祖国,却苦于没有优秀学习资源,就把这事儿拖到了大二,最近上了一门专业课,如同…...

如何安装oracle的sample schema
首先从如下的地址选择合适的版本进行下载 https://github.com/oracle-samples/db-sample-schemas/releases 如果是rac环境,最好是将这个数据库停掉,然后只启动一个instance,然后再开始安装 [Tue May 09 20:26:34][377951][oraclenshqae01adm…...

ChatGPT :国内免费可用 ChatGPT +Midjourney绘图
前言 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序 ,于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具,它能够通过理解和学习人类的语言来…...

女孩子转数据分析难吗?难在哪里?
对于数据分析,很多人乍一听会觉得没啥技术难度,是个适合女孩子的专业。我们面对很多零基础小白也是用通俗的语言来形容这个专业:一般是通过Excel或者power BI工具对数据进行分析,制作成可视化的报表给领导层,为公司业务…...

基于常用设计模式的业务框架
前言 做开发也有好几年时间了,最近总结和梳理自己在工作中遇到的一些问题,工作中最容易写出BUG的需求就是改造需求了。一个成熟的业务系统是需要经过无数次迭代而成的,也意味着经过很多开发人员之手,最后到你这里,大部…...

ubuntu重启ssh服务
一、开启ssh服务首先需要安装打开ssh服务的库: sudo apt-get install openssh-server 二、检查当前的ssh开启情况: ps -e |grep ssh 三、如果有sshd,则ssh-server已经启动;若仅有agent,则尚未启动; 开启ssh…...

【19】SCI易中期刊推荐——计算机 | 人工智能领域(中科院2区)
💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…...

Vue.js条件、循环语句
文章目录 条件语句v-ifv-elsev-else-ifv-show 循环语句v-for 指令v-for 迭代对象valuevalue ,keyvalue ,key,index v-for 迭代整数 条件语句 v-if 在元素 和 template 中使用 v-if 指令 <div id"app"><p v-if"seen">现在你看到我…...

Go语言学习查缺补漏ing Day4
Go语言学习查缺补漏ing Day4 一、掌握iota的使用 请看下面这段代码: package mainimport "fmt"const (a iota_bc "ReganYue"dd1e iotaf iota )func main() {fmt.Println(a, b, c, d, d1, e, f) }思考一下输出结果会是什么? …...

说服审稿人,只需牢记这 8 大返修套路!
本文作者:雁门飞雪 如果说科研是一场修炼,那么学术界就是江湖,投稿就是作者与审稿人或编辑之间的高手博弈。 在这一轮轮的对决中,有时靠的是实力,有时靠的是技巧,然而只有实力和技巧双加持的作者才能长久立…...

Java 责任链模式详解
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它用于将请求的发送者和接收者解耦,使得多个对象都有机会处理这个请求。在责任链模式中,有一个请求处理链条,每个处理请求的对象都是一个…...

使用MASA全家桶从零开始搭建IoT平台(三)管理设备的连接状态
文章目录 前言分析方案1:遗嘱消息演示遗嘱消息的使用实施流程 方案2:使用WebHook开启WebHook演示Webhook编写代码 前言 获取一个设备的在线和离线状态,是一个很关键的功能。我们对设备下发的控制指令,设备处于在线状态才能及时给我们反馈。这里的在线和…...

我的新书上架了!
talk is cheap,show you my book! 新书《从0开始学ARM》终于在各大平台上架了!! 一、关于本书 1. 本书主要内容 ARM体系架构是目前市面上的主流处理器体系架构,在手机芯片和嵌入式芯片领域,ARM体系架构…...

语言与专业的奇迹:如何利用ChatGPT优化跨国贸易
贸易公司,在进行跨国贸易时,往往需要面对不同国家的甲方或者乙方,在与之沟通的过程中,语言和专业是必须要过的一关,顺畅的交流,往往会带来更好的收益。 今天以“茶”为例,给大家介绍一“知否AI…...

云服务器安装宝塔Linux面板命令脚本大全
阿里云服务器安装宝塔Linux面板,操作系统不同安装命令脚本也不同,支持CentOS、Alibaba Cloud Linux、Ubuntu/Deepin等Linux系统,阿里云服务器网分享阿里云服务器安装宝塔Linux面板命令脚本大全: 云服务器安装宝塔Linux面板命令 …...

zed2i相机中imu内参的标定及外参标定
zed2i中imu内参的标定 参考: https://blog.csdn.net/weixin_42681311/article/details/126109617 https://blog.csdn.net/weixin_43135184/article/details/123444090 值得注意,imu内参的标定其实不是那么重要,大致上给一个值应该影响不大…...

Java中的JUnit是什么?如何使用JUnit进行单元测试
JUnit是Java中最流行的单元测试框架之一。它可以帮助开发人员在代码编写过程中检测出错误和异常,从而提高代码的质量和可靠性。 什么是JUnit? JUnit是一个由Kent Beck和Erich Gamma创建的开源Java单元测试框架,它已经成为Java开发中最常用的…...

【seata的部署和集成】
seata的部署和集成 seata的部署和集成一、部署Seata的tc-server1.下载2.解压3.修改配置4.在nacos添加配置5.创建数据库表6.启动TC服务 二、微服务集成seata1.引入依赖2.修改配置文件 三、TC服务的高可用和异地容灾1.模拟异地容灾的TC集群2.将事务组映射配置到nacos3.微服务读取…...

uniapp学习日记之request自定义请求头
uniapp学习日记之request自定义请求头 在学习uniapp的过程中,由于笔者是从Vue项目转来学习uniapp,在使用uni.request时,发现在浏览器调试时,无法在请求头header中添加token字段,愤而弃之,便开始使用axios组…...