【JavaEE初阶】IP协议

news2024/11/15 14:09:46

目录

📕引言

🌴IP协议的概念

🌳IP数据报

🚩IPv4协议头格式

🚩IPv6的诞生

🏀拓展

🎄IP地址

🚩IP地址的格式:

🚩IP地址的分类

🏀网段划分

🏀网络号与主机号的划分

🚩特殊的IP地址

🚩子网掩码

🏀计算方式


📕引言

IP协议是网络层重点协议,其重要作用是:在复杂的网络环境中确定一个合适的路径。

下面只对该协议简单介绍

🌴IP协议的概念

IP指网际互连协议,Internet Protocol的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。

🌳IP数据报

🚩IPv4协议头格式

  • 4位版本号(version)

指定IP协议的版本,对于IPv4来说,就是4。如果是6,就是IPv6(上述是IPv4的报头结构)

  • 4位头部长度(header length)

IP头部的长度是多少个32bit,也就是 length * 4 的字节数。4bit表示最大的数字是15,因此IP头部最大长度是60字节,最短20个字节(选项)。

  • 8位服务类型(Type Of Service)

3位优先权字段(已经弃用),4位TOS字段,和1位保留 字段(必须置为0)
4位TOS分别表示:最小延时(传输过程中消耗时间最短),最大吞吐量(单位时间内传输的数据尽可能多),最高可靠性(降低丢包的概率),最小成本(比较节省系统开销)。
这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对 于ftp这样的程序,最大吞吐量比较重要

  • 16位总长度(total length)

IP数据报整体占多少个字节(报头+载荷)

TCP中没有记录自身长度,可以通过IP的总长度,去掉IP首部长度,剩下的载荷就是TCP的总长度,去掉TCP的报头,剩下就是TCP载荷的长度

16位总长度是字节数,也就是前面说的UDP数据报最大64kb,那么这里也是IP数据包也不能超过64kb?

IP自身实现了拆包组包这样的功能,如果携带的载荷,超出长度上线,IP就会自动拆分成多个数据包,每个数据包携带一部分,发送到对方之后,在拼接好。

具体流程:

当前A给B传输一个数据,当前有一个TCP数据包,假设这个数据很长,超过了64kb

A这边再封装成IP数据包的时候,就会把TCP数据包拆成多分(假设3份),使用多个IP数据包进行发送

对于IP数据包来说,他并不关心所要传输的数据里面到底是什么样的,直接简单粗暴的把这个数据分成几份,每一份都装到IP的载荷里面,然后统一发送给B。

那么B是如何知道,收到的IP数据包如何合并?

IP报头中的16位标识,3位标志位,13位片偏移这三个属性就是用来实现IP的拆包组包的

  • 16位标识(id):

唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。就是用来区分哪些数据包要合并

  • 3位标志字段:

第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位用来表示,该数据包是否触发了拆包的效果(是否需要组包)。第三位是结束标记位,当前包就是最后一个需要组包的部分。

  • 13位分片偏移(framegament offset)

就是若干要拼接的数据包的先后顺序,根据片偏移来区分出谁在前,谁在后。

说到这里,就会有一个问题,TCP超过64kb了,IP就会进行拆包组包,那UDP超过64kb了,IP不能进行拆包组包吗?

假设有一个很长的UDP数据包:

直观上看起来,把上述数据拆分成多个IP数据包发送,好像也是ok的。我们拆分之后,传输过去上述数据也能还原成原始的模样。

但是呢,我们知道,在A和B进行通信的时候,这个中间要进行封装分用,当我们把数据进行组包完成之后,要交给传输层,也就是UDP进一步的进行使用,在UDP这一层,要对上述数据进行解析。也就是取出8个字节,作为报头,剩余部分作为载荷,剩下的载荷到底多长?就会尝试从报头中的报文长度字段来读取,读出来的数字最多还是64kb。

  • 8位生存时间(Time To Live,TTL)

一个IP数据包,在网络上有一个转发的过程,转发的数据是根据你设定好的目的IP来进行转发,但是给定目的IP有问题,用于到不了,所以这里的TTL就是限制一个数据包在网络上转发的最大次数。每经过一个路由器,次数就会消耗掉一次。次数是32/64,一般是64(通常情况下64就够用了,背后有一个理论"六度空间",比如我想认识美国的川普,大概率经过6层朋友的转发,就能够练联系到世界上任何一个人)。一旦达到0,这个数据包就会被丢弃掉。

当前此台电脑连的路由器,TTL为64就说明中间没有经常其他设备转发。

如果去ping一个比较远的服务器,TTL为53,就说明此台电脑到搜狗的服务器,这中间经过多次的路由器转发。

  • 8位协议:

描述了 载荷部分是哪种协议的数据包,也就是交给UDP还是TCP,表示上层协议的类型。一个数据包在分用的时候,要交给上层哪个协议,都是有明确声明的。

传输层=>应用层:通过端口号来区分

网络层=>传输层:报头中有这个8位协议字段

数据链路层=>网络层:报头中也有一个字段来区分是交给IP协议,还是其他协议

  • 16位头部校验和

使用CRC进行校验,只是针对IP首部进行校验,载荷部分不关系

  • 32位源地址和32位目标地址

表示发送端和接收端

讲述过,为了让人更方便的观察,把32位的整数通常用点分十进制方式来表达。那么32位也表示42亿9000万,原则上来说,不同设备,IP地址应该是唯一的,不重复,上述这个数字,在今天来说,显然是不够用的!!!当今社会,移动互联网的发展,一个人就可能两个手机。

IP地址不够用,还怎么办,共有三个方案。

方案一:动态分配IP地址(DHCP)

某个设备,上网路由器就分配,不上网就不分配(这样的机制只能缓解,不能从根本上解决)。

方案二:NAT机制网络地址转换(网络地址映射)

首先把IP地址分为两个大类

此时约定,公网IP唯一,私网IP允许在不同局域网中重复,虽然能上网的设备很多,绝大部分IP都在局域网内,也就是局域网1中的设备IP和局域网2中的设备IP可以重复。NAT机制也没有增加IP地址,但是极大的提高了IP地址的复用情况,使用一个公网IP,代表一组设备。

NAT机制下的几种情况:

简化:

发送给服务器:

服务器返回响应:

注意:我们的私网IP并不是运营商路由器提供的,上述只是简图,在这中间我的电脑是连的家里的路由器,即我的私网IP是有家里的路由器分配的。

问题

上述一个局域网下只是一台电脑访问,那如果同一局域网下是又有一台电脑访问cctalk服务器呢?

发送数据:

返回响应:

那么还有问题

那如果这两台主机的端口号碰巧是一样的(端口号碰巧一样,是小概率事件),现在我们这个数据,经过运营商路由器进行NAT的替换,注意,此时的映射表,旧端口的两台主机仍然是1234,但是第二台主机的新端口还是让他为5678。新端口和旧端口不一定要必须一样,是可以变化的,新端口都是由路由器自己分配的,他是可以很轻松的知道是不是已经重复了,只要分配出一个唯一的端口号出来即可。后序的转发过程和上述仍然一样。

问题

不同局域网的内网ip可以重复,那么同一个运营商路由器的不同局域网,运营商返回请求的时候是怎么分辨出是哪个局域网中的内网ip?

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

NAT机制确实能解决,但是这样的方案又给网络的复杂程度增加了不少,而且也没有重根本上的解决,如果随着设备进一步的增多,一个外网NAT设备上面最最多只能有6w多个表项,NAT也可能不够用了。

🚩IPv6的诞生

自从1970年代IPv4问世以来,数据通信技术日新月异有了很大发展。虽然IPv4设计得很好,但其缺点也逐渐显露出来:

  • 虽说借助子网化、无类寻址和NAT技术可以提高IP地址使用效率,因特网中IP地址的耗尽仍然是一个没有彻底解决的问题;
  • IPv4没有提供对实时音频和视频传输这种要求传输最小时延的策略和预留资源支持;
  • IPv4不能对某些有数据加密和鉴别要求的应用提供支持。

为了克服这些缺点,IPv6(Internet working Protocol version6)被提了出来。

IPv6拿16个字节表示IP地址,有128,这就是一个天文数字了,足以给地球上的每一粒沙子分配一个唯一的IP地址。

  • 在IPv6中,IP地址格式和分组长度以及分组的格式都改变了。IPv6每个分组由必须的基本头部和其后的有效载荷组成。
  • 有效载荷由可选的扩展头部和来自上层的数据组成。
  • 基本头部占用40字节,有效载荷可以包含65535字节数据

那为啥世界上还以IPv4为主呢?

🏀拓展

🎄IP地址

IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异

🚩IP地址的格式:

IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节),如:01100100.00000100.00000101.00000110。

通常用“点分十进制”的方式来表示,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的十进制整数)。如:100.4.5.6

🚩IP地址的分类

🏀网段划分

IP地址是用来识别网络上的设备,因此,IP地址是由网络地址与主机地址两部分所组成。

  • 网络地址

网络地址可用来识别设备所在的网络,网络地址位于IP地址的前段。当组织或企业申请IP地址时,所获得的并非IP地址,而是取得一个唯一的、能够识别的网络地址。同一网络上的所有设备,都有相同的网络地址。IP路由的功能是根据IP地址中的网络地址,决定要将IP信息包送至所指明的那个网络。

  • 主机地址

主机地址位于IP地址的后段,可用来识别网络上设备。同一网络上的设备都会有相同的网络地址,而各设备之间则是以主机地址来区别。同一个局域网内,网络号相同,主机号不同。

搭配子网掩码的网段划分是现在的方法,下面按照ABCDE类来划分仅存于教科书上。

🏀网络号与主机号的划分

过去曾经提出一种划分网络号和主机号的方案,把所有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

🚩特殊的IP地址

  • 将IP地址中的主机地址全部设为0,就成为了网络号,不应该分配给具体主机,即使分配了也上不了网(192.168.1.0);
  • 将IP地址中的主机地址全部设为1,就成为了广播地址(192.168.100.255 / 24),用于给同一个链路中相互连接的所有主机发送数据包;TCP不支持广播,UDP才支持

  • 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1                                          本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。 例如之前写的TCP服务器/UDP服务器,客户端和服务器在同一个主机上,此时就可以是有环回ip来进行发送与接收。可以不用进行连网。

🚩子网掩码

在上述的分类中,存在IP地址浪费的问题:

(1)单位一般会申请B类网络(C类连接主机数量有限),但实际网络架设时,连接的主机数量又常远小于65534(B类连接主机数),造成IP地址浪费;同理,A类网络的IP地址也会造成大量的浪费。

(2)当一个单位申请了一个网络号。他想将该网络能表示的IP地址再分给它下属的几个小单位时,如果在申请新的网络就会造成浪费。

为了解决以上问题,引入子网掩码来进行子网划分:

  • 子网掩码的格式:

子网掩码格式和IP地址一样,也是一个32位的二进制数。其中左边是网络位,用二进制数字“1”表示,1的数目等于网络位的长度;右边是主机位,用二进制数字“0”表示,0的数目等于主机位的长度。子网掩码也可以使用二进制所有高位1相加的数值来表示,如以上子网掩码也可以表示为24。

  • 子网掩码的作用

(1)划分A,B,C三类 IP 地址子网:如一个B类IP地址:191.100.0.0,按A ~ E类分类来说,网络号二进制数为16位网络号+16位主机号。假设使用子网掩码 255.255.128.0(即17) 来划分子网,意味着划分子网后,高17位都是网络位/网络号,也就是将原来16位主机号,划分为1位子网号+15位主机号

此时,IP地址组成为:网络号+子网号+主机号,网络号和子网号统一为网络标识(划分子网后的网络号/网段)

(2)网络通信时,子网掩码结合IP地址,可以计算获得网络号(划分子网后的网络号)及主机号(划分子网后的主机号)。一般用于判断目的IP与本IP是否为同一个网段

🏀计算方式

将 IP 地址和子网掩码进行“按位与”操作(二进制相同位,与操作,两个都是1结果为1,否则为0),得到的结果就是网络号。

将子网掩码二进制按位取反,再与 IP 地址位与计算,得到的就是主机号。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机三级-数据库技术】操作题大题(第七套)

第七套操作题 第46题 假定要建立一个关于篮球职业联盟的数据库,需管理如下信息: 每个球队有球队名称、所在城市; 每位球员有球员姓名、薪酬; 每场比赛有比赛编号、比赛时间、比赛结果、参加比赛的主场球队、参加比赛的客场球队。 其中带下划…

Redis—基础篇

Redis基础 1. Redis 简介2. Redis 应用3. Redis 数据结构3.1 String3.2 hash3.3 list3.4 set3.5 sorted set 4. Redis 为什么快?5. Redis I/O 多路复用6. Redis 6.0多线程 1. Redis 简介 Redis 是一种基于键值对的 NoSQL 数据库 Redis 中的 value 支持 string、ha…

关于jupyter notebook 的输出 (outputs )

jupyter notebook 的输出 (outputs )在元素达到一定的个数后,就会按一行一个元素进行展示,百来个还好,一旦过千,那滚轮势必撸冒烟,所以能不能解决呢? 先看个例子, 一个找质数、合数的函数 cal3&…

【Linux篇】vim编译器

1. 介绍 vi / vim是visual interface的简称,是Linux中最典型的文本编辑器。 同图形化界面中的文本编辑器一样,vi是命令行下对文本文件进行编辑的绝佳选择。 vim是vi的加强版本,兼容vi的所有指令,不仅能编译文本,而且…

排序补充之快排的三路划分法

排序补充之快排的三路划分法 快排性能的关键点分析: 决定快排性能的关键点是每次单趟排序后,key对数组的分割,如果每次选key基本⼆分居中,那么快 排的递归树就是颗均匀的满⼆叉树,性能最佳。但是实践中虽然不可能每次…

数学建模笔记(四):熵权

背景&基本思想介绍 在实际的评价类问题中,在前面所说的层次分析法以及Topsis法中,指标权重的确定往往是通过主观的评价得来的,如果在没有专家的情况下,我们自己的权重分配往往可能带有一定的主观性,有没有一种可以…

linux系统离线安装docker并配置阿里云镜像源

制作docker.service文件 创建docker.service文件 cd /etc/systemd/system/ touch docker.service编辑docker.service文件 vim docker.service// 注意,将其中的ip地址,改成您的服务器地址,其它参数不用改。 //--insecure-registry192.168.8…

代码随想录算法day22 | 回溯算法part04 | 491.递增子序列,46.全排列,47.全排列 II

491.递增子序列 本题和大家做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。 力扣题目链接(opens new window) 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。 示例: 输入: [4, 6, 7, 7]输出: [[4,…

【学习笔记】时间序列模型(ARIMA)

文章目录 前言一、时间序列时间序列数据 二、ARIMA 模型大纲模型前提平稳性检验 差分整合移动平均自回归模型 ARIMA(p,q,d)自回归模型 (AR( p ))移动平均模型 (MA( q ))自回归移动平均模型(ARMA(p,q))差分自回归移动平均模型 ARIMA(p,d,q) 确定 p,q结果分析和模型检…

SpringBoot集成kafka-消费者批量消费消息

SpringBoot集成kafka-消费者批量消费消息 1、消费者2、生产者3、application.yml配置文件4、实体类5、生产者发送消息测试类6、测试6.1、测试启动生产者6.2、测试启动消费者 1、消费者 设置批量接收消息 package com.power.consumer;import org.apache.kafka.clients.consume…

IC-Light容器构建详细指南

一、介绍 IC-Light 是一个操纵图像照明的项目,能够让一张普普通通的照片焕发光彩。 IC-Light,全称为“Imposing Consistent Light”,是一款由 AI 图像处理专家张吕敏(ControlNet 的作者)精心开发的创新工具。主要用于…

启用 UFW 防火墙后如何打开 80 和 443 端口?

UFW(Uncomplicated Firewall)是一款 Linux 系统上用户友好的管理防火墙规则的工具。它简化了控制网络流量的过程,使用户更容易开放或阻止端口。 本文将引导您使用 UFW 打开端口 80 (HTTP) 和 443 (HTTPS) 端口。您将了解如何启用这些端口&am…

uni-app项目搭建和模块介绍

工具:HuilderX noed版本:node-v17.3.1 npm版本:8.3.0 淘宝镜像:https://registry.npmmirror.com/ 未安装nodejs可以进入这里https://blog.csdn.net/a1241436267/article/details/141326585?spm1001.2014.3001.5501 目录 1.项目搭建​编辑 2.项目结构 3.使用浏览器运行…

华为Cloud连接配置

Cloud(云)连接意思为本地电脑和eNSP中的虚拟的VRP系统连接的 配置Cloud 先添加UDP 再添加需要使用的网卡 网卡建议使用虚拟机的网卡,如果没有虚拟机也可以使用其他网卡,自己设定一下IP就行 端口映射设置 配置R1 [R1]int e0/0/0 [R1-Ethernet0/0/0]ip …

B. 不知道该叫啥

题意:求长度为n的数列方案数,数列需满足两个条件:1.均为正整数。2.相邻两个数乘积不能超过m 思路:考虑dp。 设表示前i个点以j结尾的方案数,则有: 可以得出: 双指针数论分块解决。把每个m/i相…

一个下载镜像非常快的网站--华为云

1、镜像的下载飞速 链接:mirrors.huaweicloud.com/ubuntu-releases/24.04/ 下载一个的ubuntu24.04的镜像文件,5.7G的大文件,不到1分钟就下完毕了, 比起阿里云下载的速度600K/S,这个速度是100多倍。 非常的神速,非常…

如何选择高品质科研实验室用太阳光模拟器

概述 太阳光模拟器是一种能够模拟太阳光照射条件的设备,主要用于实验室环境中对太阳能相关材料和设备进行性能测试。这类模拟器能够提供与自然太阳光谱相似的光照,同时还能精确控制光照强度和照射角度,以满足不同测试需求。 对于被归类为太…

Leetcode 104. 二叉树的最大深度 C++实现

Leetcode 104. 二叉树的最大深度 问题:给定一个二叉树root,返回其最大深度。 二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

【Linux篇】Linux的用户和权限

目录 1. 认识Linux的root用户(超级管理员) 1.1 介绍 1.2 su命令和exit命令 1.3 sudo命令 为普通用户配置sudo认证 2. 用户与用户组 2.1 用户组管理 2.2 用户管理 2.3 getent命令 3. 查看权限控制信息 3.1 认知权限信息 3.2 rwx含义 r&#x…

巴恩斯利蕨数学公式及源码实现——JavaScript版

为什么要写这篇文章 本篇接《张侦毅:巴恩斯利蕨数学公式及源码实现》。之前文章中源码的编程语言用的是Java,JDK的版本为8,现在我的JDK版本已经升级到22了,在新版本JDK中,原来的JApplet方法已经被废弃,不能…