javaEE 初阶 — 网络层中 IP 协议 的报文结构

news2024/9/23 13:27:34

文章目录

  • IP 协议报文
    • 4位版本号
    • 4位首部长度
    • 8位服务类型
    • 16位总长度(字节数)
    • 8位生存时间(TTL)与 8位协议
    • 16位首部校验和
    • 32位源 IP 地址与32位目标 IP 地址
      • 动态分配的 IP 地址
      • NAT 网络地址转换
      • IPv6

IP 协议报文


4位版本号


这里的 IP 协议是 IPV4 协议。(V4是版本号的意思)

此处的取值只有 4 和 6 ,当前介绍的是 IPV4 版本的。

4位首部长度


这里描述了 IP 报头多长。(IP报头是可变的)
报头中有一个选项部分,这是可变长的,也是可有可无的,此处的单位是 4 字节。

8位服务类型


这里说是 8 位,实际上只有 4 位有效,这 4 位中只有 1 位可以是 1 ,其他的都是 0 。
4 位 就表示 IP 协议的四种形态(四种工作模式


这里的四种形态就好比游戏中的角色根据不同的战斗,来改变形态以发挥到最大的战斗力。

四种工作模式:

最小延时、最大吞吐、最高可靠性、最小成本

实际开发中的时候就可以根据需要,来切换 IP 的模式已达到最优的效果。(其实实际上,开发中很少真的这样来设定)

主要是是因为这些东西是站在技术角度来处理的,而实际上技术上的定西一般都比较好解决,不好解决的是业务上的东西。
因为性能瓶颈往往是业务带来的。

16位总长度(字节数)


16 为总长度描述了了一个 IP 数据报的长度。(头+载荷)
这个长度减去前面的 IP 报头长度,剩下的就是载荷长度,也就是一个完整的 TCP/UDP 数据报长度。


这里的 16 位总长度是不是意味着一个 IP 数据报最大只能支持 64 KB?
是不是就相当于快递公司一次只能给你运 64 KG 的快递。

确实是有这个功能的,但是 IP 自身就支持对包的 拆分组装
比如说,在网上买了一个书架,快递公司会把书架给拆成多个部件,等到我收到所有部件后就会把它给组装出来。

一个 IP 数据报携带的数据载荷太长了,超过了 64 KB,就会在网络层针对数据进行拆分,把一个数据拆分成多个 IP 数据报,
再分别发送,接收方再重新拼装。

8位生存时间(TTL)与 8位协议


8 位生存空间指的是一个数据报在网络上能够传输的最大时间。

这个时间的单位不是 “秒”,而是 “次数”。
一个数据报构造出来会有一个初始的 TTL 数值(比如 32 或者 64 或者 128)
这个报每次经过一个路由器转发,TTL 的值就减一个。

如果一直减到 0 了,还没有到达目标,此时就认为这个包永远也到不了了,就可以丢弃了。

比如说寄快递的时候,如果这个收件地址压根不存在呢?

8位协议 描述了当前载荷部分内容是属于哪个协议的。

16位首部校验和


此处只需要针对首部进行校验,载荷部分(TCP/UDP数据报)自身已经有校验和了。

如果校验和不一样会直接丢弃, IP 不会负责重传,如果上层使用了 TCP ,TCP 就会在没收到 ACK 之后重传。

32位源 IP 地址与32位目标 IP 地址

此处看到的 IP 地址是 32 位的整数,而日常生活中见到的 IP 则是一串数字。

例如日常生活中看到的是:192.168.10.10

IP 地址我们期望的是每个设备都是不同的,但是 32 位数字只能表示 42亿9千多万个数字。
所以要使用这些数字表示全世界上所有的上网设备。比如智能手机、计算机、路由器…

采取 IPv4 版本,是无法表示世界上所有的网络设备的。

为了解决 IP 地址不够用的问题,想了很多办法:

1、动态分配的 IP 地址

2、NAT 网络地址转换

3、IPV6

动态分配的 IP 地址


动态分配 IP 地址,就是在网络设备使用的时候再分配 IP 地址,不使用的时候就不分配。
这样不仅提高了 IP 地址的利用率,还可以节约有限的资源。

但是这个方案没有从根本上增加 IP 地址,只是提高了利用率,属于治标不治本。

NAT 网络地址转换


这个方案的本质是使用一个 IP 代表一批设备,也是可以提高 IP 地址的利用率,只不过要使用端口号来区分不同的设备。


在 NAT 背景下,就把所有的 IP 地址分为两个大类:

1、内网 IP(私有 IP) :以 10.* 、172.16.* ~ 172.31.* 、192.168.* 开头的都是属于私网

例如:我的笔记本的 IPV4 地址是 192.168.21.1,这就是一个私网 IP。



2、外网 IP (公网 IP):除了私网剩下的都是公网。

NAT 要求公网 IP 必须是唯一的,而私网 IP 可以在不同的局域网中重复出现。

如果某个私网里的设备想要访问公网的设备,就需要对应的 NAT 设备(路由器),把 IP 地址进行映射,从而完成网络访问。
反之,公网的设备无法直接访问私网的设备,不同的局域网的私网设备无法直接访问相互访问。


举个例子


每个人相当于是一个独立的 IP 地址,快递员必须要知道这个人的 IP 地址,才能找到这个人。


NAT 技术就是把每个 IP 地址变成一个小区,快递员只需要把包裹交给门卫(相当于是 NAT),
门卫再将包裹交给住户。小区之内就是私网,小区之外就是公网


打开自己电脑的 cmd 键入 ipconfig,就可以看到自己电脑的 IP 地址,而且这个 IP 地址基本上都是私有 IP。

内网 IP 只要在局域网内部不重复即可,而不同局域网中则是允许重复的。




源 IP 地址就是 192.168.21.2目的 IP 就是 1.2.3.4
我的 IP 数据报经过 NAT(运营商路由器)设备之后,此时就会把我的 源 IP 给改了。

此时源 IP 就是 NAT 设备的 IP,61.185.187.142,而目的 IP 还是 1.2.3.4。
站在服务器的视角,看到的我的电脑的 IP 地址就是这个运营商路由器的地址。

当有其他的电脑接入运营商路由器的时候,去访问外部服务器都会被路由器替换成路由器自己的 外网 IP。


因此服务器只能拿到路由器的 IP ,不能拿到我的电脑的内网 IP 。
如果我的电脑不主动和服务器联系,服务器也就不知道我的端口,从而就无法主动找到我的电脑。


只要电脑是经过运营商路由器转发给服务器的,服务器看到的源 IP 就都一样。

如果是多个电脑同时访问同一个服务器,服务器的响应就会先发给路由器,路由器根据这些电脑不同的端口号来区分,决定先发给哪个设备。

NAT 机制能够有效地解决 IP 地址不够用的问题,但是带来的副作用就是网络环境更加的复杂了。

IPv6


IPV6 从根本上解决了 IP 不够用的问题,是使用 16 字节来表示的。

和 IPV4 不同,IPV6 的地址长度扩张到了 128 位,是前者的 4 倍。



上述图片就是一串 IPV6 的地址。

长度增加后原有的点分十进制也不够用了,于是 IPV6 改用十六进制表示。



上述图片就是改用的十六进制表示的。

IPv4 有 43 亿的地址,IPv6 的长度是它的 4 倍,是不是意味着 IPv6 的地址个数也是它的 4 倍,也就是 172 个地址?

答案是不是,IPv6 的地址空间是 2^128-1,IP地址 总数为 3402823… 总之是很多的。
多到可以给地球上的每粒沙子都分配一个 IP 地址。


IPV6 虽然地址个数足够使用,但是当前世界上仍然是 NAT + IPV4 + 动态分配 来进行网络组建的,
真正使用 IPV6 的地方非常少。


这主要是因为 IPV6 不是 IPV4 协议的升级,而是一个全新的协议。
两个协议之间无法兼容,如果要使用 IPV6 ,那全世界的互联网设备都要同步更换硬件设备,更换硬件设备需要花更多的资金。

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

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

相关文章

图表示学习+对比学习入门必看:DGI

来源:投稿 作者:kon 编辑:学姐 前言 众所周知,火热的对比学习不仅在CV取得了很多成果,也在NLP、推荐等领域大放异彩。自然的,有人将对比学习引入了图表示学习领域,利用图本身的结构与结点自身的…

14.微服务SpringCloud

一、基本概念 Spring Cloud 被称为构建分布式微服务系统的“全家桶”,它并不是某一门技术,而是一系列微服务解决方案或框架的有序集合。它将市面上成熟的、经过验证的微服务框架整合起来,并通过 Spring Boot 的思想进行再封装,屏蔽…

【Servlet篇】Response对象详细解读

文章目录Response 继承体系Response 设置响应数据设置响应行数据设置响应头数据设置响应体数据Response 重定向Response 响应字符数据Response 响应字节数据Response 继承体系 前面说到,我们使用 Request 对象来获取请求数据,使用 Response 对象来设置响…

Pyinstaller 打包EXE(七) 百篇文章学PyQT

本文章是百篇文章学PyQT6的第七篇,本文讲述如何使用Pyinstaller打包UI界面和代码,将程序打包成EXE来更为方便的进行部署,在写博客和学习的过程中会遇到很多问题,例如:PyQT6在网上很多博客都是PyQT5、或者PyQT4大部分都…

Could not extract response: no suitable HttpMessageConverter

版本:spring-cloud-openfeign-core-2.1.1.RELEASE.jar,spring-webmvc-5.1.14.RELEASE.jar,jetty-server-9.4.41.v20210516.jar,tomcat-embed-core-9.0.48.jar 问题背景 生产服务请求下游服务时偶发抛出下面的异常,下…

git入门

目录 1. git简介 1.1 git是什么 1.2 git与svn的区别 2. github 2.1 创建仓库 2.2 删除仓库 2.3 新建文件及文件夹 3. git的基本操作 3.1 配置账户及邮箱 3.2 git文件状态与工作区域 3.3 常用命令 3.4 克隆(clone) 3.5 查看git仓库的状态 3.…

[音视频] BMP 图片格式分析

BMP 格式是什么 BMP(Bitmap)是一种常见的无损位图图像文件格式,是Windows操作系统中最早使用的图像格式之一,也是目前很多应用程序所使用的标准图像格式之一。 整体结构图,如下图所示 格式 BMP文件格式有多个版本&a…

QT中级(5)多线程读取一个文件,并在另一个文件夹中合成这个文件(1)

1 先实现一个简单程序 1.1 功能 用户可以输入一个源文件的路径和目标路径点击开始,程序启动读取和合成合成进度可见、合成步骤可见 1.2 思路 一个线程顺序读取文件,达到设定的缓存块就发给另一个合成线程,主线程用来进行数据传递、显示进…

电子技术——A类输出阶

电子技术——A类输出阶 因为射极跟随器具有较低的输出阻抗,射极跟随器是A类输出阶的典型代表。我们之前已经学习过射极跟随器的小信号模型,本节我们讨论其大信号模型。 传输特性 下图展示了一个射极跟随器的原理图: 其中 Q1Q_1Q1​ 为射极…

并发编程-学习总结(下)

目录 1、Future 1.1、Callable和Runnable的不同 1.2、Future的主要功能 1.3、常用方法 1.4、Future使用注意事项 1.5、CompletableFuture(旅游平台问题) 1.5.1、需求 1.5.2、解决方案1:串行 1.5.3、解决方案2:线程池 1.5.4、解决方案3&#xf…

Prometheus本地存储和VictoriaMetrics远端存储

文章目录Prometheus本地存储简介blockWAL本地存储配置参数VictoriaMetrics简介单机版部署使用安装VictoriaMetrics配置Prometheus使用Victoriametrics配置Grafana以Victoriametrics作为数据源集群版部署使用部署vmstorage部署vmselect部署vminsert配置Prometheus使用vminsert配…

LearnOpenGL-入门-你好,三角形

本人刚学OpenGL不久且自学,文中定有代码、术语等错误,欢迎指正 我写的项目地址:https://github.com/liujianjie/LearnOpenGLProject LearnOpenGL中文官网:https://learnopengl-cn.github.io/ 文章目录图形渲染管线基本介绍着色器…

文献计量三大定律之一---洛特卡定律及普赖斯定律

科学生产率是洛特卡定律的基础,科学生产率”(Scientific Productivity))是指科学家(科研人员)在科学上所表现出的能力和工作效率,通常用其生产的科学文献的数量来衡量。 1926年,洛特卡在一篇论文中提出了科…

Windows作为操作系统的典型特征和主要功能

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Windows这个我们熟悉的不能再熟悉的系统。我们每天都在用Windows操作系统,但是其实我们每天直接在打交道的并不是Windows操作系统的内核,而是Windows操作系统的…

Docker部署Springboot项目(含MySQL+Redis)

使用Docker部署之前写的一个博客项目,主要用到了MySQL和Redis,Redis作网站访问量统计。下面会对具体的部署方式作详细讲解 一、服务器安装Docker 1、删除docker旧版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \…

(三十五)大白话MySQL一个事务多次查询一条数据读到的都是不同的值,这就是不可重复读?

上一讲我们说完了多个事务并发执行时候,对MySQL的缓存页里的同一行数据同时进行更新或者查询的时候,可能发生的脏写和脏读的问题 我们也都理解了,之所以会发生脏写和脏读,最关键的,其实是因为你一个事务写或者查的是人…

黑盒测试的常用方法

这里我们先设置一个示例,后面的文章中会根据示例来进行讲解 假设有一个程序是判断一个整形数字是否属于1-100 目录 1.等价类法 2.边界值法 3.判定表法 4.场景设计法 5.错误猜测法 6.正交法 1.等价类法 概念:系统性的确定要输入的测试条件的方法可以看出概念非常抽象,那…

命令执行漏洞 | iwebsec

文章目录1 靶场环境2 命令执行漏洞介绍3 靶场练习01-命令执行漏洞02-命令执行漏洞空格绕过03-命令执行漏洞关键命令绕过04-命令执行漏洞通配符绕过05-命令执行漏洞base64编码绕过4 命令执行漏洞危害01-读写系统文件02-执行系统命令03-种植恶意木马04-反弹shellpython反弹shellp…

Android 基础知识4-3.4 ImageView(图像视图)详解

一、ImageView简介 ImageView是Android开发中最常用的组件之一,主要用于显示图片,但是它不只是能显示图片,任何Drawable对象都可以使用它来显示。 二、ImageView 的继承关系 ImageView的继承关系 如下: java.lang.Object 《-- …

生成式语言大模型压缩技术思考——以ChatGPT为例

ChatGPT引领了生成式语言大模型的应用与技术热潮,首先简单回顾ChatGPT应用范式:将其应用于指定的下游任务时(如知识问答、翻译、编码),ChatGPT需要经历三个阶段的训练(增强人类语境的猜想)&…