IP报文详解

IP的作用

上一篇文章提到TCP的可靠传输机制,那么TCP有把数据从主机A到主机B的能力吗?答案是没有。而IP有这个能力,IP能够将数据从主机A跨网络传输到主机B的能力。那么一定能传输成功吗?答案肯定是否定的,会因为各种原因导致传输失败。而这就又要依赖到TCP的可靠性,一旦发生丢包变会进行重传(网络正常的情况)。 所以,IP有把把数据从主机A到主机B的能力,而TCP则是保证IP一定能传输成功。

打个比方,张三是校长的儿子,校长说张三每次考试都必须考100分。而张三大部分考试也都是考100分,可是有一次却突然考了99。这时候校长就不乐意了,校长要求必须每次考100分,所以就让考试重考。如果还没拿到100分就继续重考!直到张三拿到100分为止! 这里面的校长冲当的就是TCP的角色,进行决策。而张三冲当IP的角色,进行行动。重考这个过程对应的是TCP的可靠机制。校长要确保张三每次都能考到100分,而TCP也要确保IP的数据一定能传输成功。 所以TCP和IP合起来,就能保证数据从一台主机到另一台主机!这也就是为什么叫做TCP/IP网络模型的原因。

而在传输数据的过程中,目标IP也非常重要,决定了我们的路径如何走。而IP也分为2部分,前面部分是网络号,后面部分是主机号。

**IP = 网络号 + 主机号 **

IP的报头

介绍了IP之后,我们再来看看IP的报头。

在这里插入图片描述

4位版本: IP协议版本,IPV4或者IPV6,两者不兼容。

4位首部长度: 和TCP报头的四位首部长度一致,4位首部长度 * 4 = 报头总大小。报头基础长度20字节,所以四位首部长度默认为5。

**8位服务类型:**3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位 TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于 ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要.

16位总长度: IP报文整体占多少字节。

第二行下面再说,关于IP的分片和组装。

8位生存时间: 报文跳转次数,达到一定次数后对报文直接丢弃。

8位协议: 报文需要向上交付,需要知道交付给哪一层协议,UDP还是TCP还是?

16位首部校验和: 检验报头字段是否正确。

32位源IP地址: 发送端的IP地址,该地址是会变化的。

32位目的IP地址: 接收端的IP地址,该地址一样会发生变化。

IP的分片与组装

根据数据链路层的MAC帧协议,自己的报头 + 有效载荷是不能超过1500字节的(MTU,可以随意修改)。

但是IP能决定单个报文的大小吗?答案是不能!因为单个报文的大小的是由TCP决定的!因为发送多少数据是由TCP决定的!一般来说,TCP报文是不会超过1500字节的。但是为了以防万一,IP层还是出了一个分片与组装的策略。用来解决万一TCP层发送的数据超了的问题。

如何分片 && 如何组装

分片分片,就是把报文分成多个去发送,要理解如何分片,我们可以从下面几个角度去理解。不过在此之前,我们需要先将IP报文中第二行未讲解的部分进行补充。

3位标志位,这个3位标志位中的第一个比特位是保留位。第二个比特位则是是否禁止分片,为1则是禁止分片,如果此时报文大小超过1500则直接丢弃报文。第三个比特位则是"更多分片"位,为1则说明后面还有分片,为0则说明后面没有分片了。

16位标识则是标识报文的唯一性。

13位片偏移则是当前报文的有效载荷在原报文的偏移量是多少。

1. 你怎么知道一个报文被分片了?

很简单,如果13位片偏移量 = 0 , 并且给更多分片标志位被置为0。则说明这是一个完整的报文,否则则是被分片过。

2. 如何识别同一个报文的所有分片?

16位标识是标识报文的唯一性,而报文被分片后,16位标识都是一样的。所以通过找到相同的16位标识的报文就相当于找到了该报文的分片。

3. 哪一个分片是第一个分片,哪一个分片是最后一个分片,有没有收全或者丢失?

当片偏移量为0的时候,那么可以说明这是第一个报文,如果此时的"更多分片"标志位为1,则说明后面还有分片,那么当前分片就是第一个分片。 最后一个分片报文因为后面没有分片了,所以它的"更多分片"标志位为0,并且片偏移量一定大于0。那么此时这个分片报文就是最后一个分片。

有没有收全或者丢失?

我们只需要把这些分片报文根据片偏移排序,然后根据当前报文的有效载荷 + 自己的片偏移量 = 下一个分片的片偏移。 来判断是否有分片丢失

在这里插入图片描述

4. 哪一个在前,哪一个在后,如何按正确顺序进行组装

我们的分片是在IP层进行的,那么对端收到分片后组装,也一定是在IP层进行的!这是网络分层的特点!谁分片谁就来组装。 在第3点我们提到过如何判断分片是否丢失,也对所有分片进行了排序。而接下来把所有分片的IP报头取出来接在前一个报文后面即可。因为已经排好序了,所以可以直接接在后面进行组装。

IP分片全过程

首先我们的IP原报文总共大小3000字节,有效载荷为2980字节。

在这里插入图片描述

随后进行第一次分片,我们只需要把前1500字节取出即可。并设置片偏移为0,更多分片标志位为1。

在这里插入图片描述

随后我们对1500字节加上20的IP报头,因为分片报文每次发送时也必须携带IP报头。加上报头后总大小1520字节,继续取1500字节。并设置片偏移为1500,更多分片标志位为1。

在这里插入图片描述

随后我们对剩余的20字节有效载荷继续加上一个IP报文,最后总大小40字节。因为后面没有分片了,所以该IP报文的更多分片标志位为0,片偏移为2980(上一个分片的有效载荷 + 上一个分片的片偏移)。

在这里插入图片描述

至此我们的IP分片就完成了。组装只需要把所有16位标识相同的报文进行升序排序,随后去掉IP报头拼接即可。如果中间有分片缺失则直接丢弃所有分片。

不建议使用分片

为什么不建议使用分片?有以下几点。

1. 提高了丢包率

假如我们1个报文的丢包率是99%, 那么我们分片成10份发送,那么我们的丢包率将近10%。丢失一个分片,就相当于整个报文丢失。

2. 效率问题

每次分片都要进行分片和组装的过程,尤其是组装的过程,还需要对分片报文进行排序。所以效率也会受到一定影响。

网段划分

IP地址分为两部分,网络号 + 主机号。

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

主机号: 同一网段内的主机必须要有不同的主机号。

为什么要有子网划分?

举个例子:

你们学校有个校学生会的群,里面有计算机学院学生会主席,法学院学生会主席…等其他学院的学生会主席。这时候你捡到了一个钱包,钱包里面有1W大洋。但是只有失主的学号信息,这时候你捡到了这个钱包。你能否根据学号判断失主是否是你们计算机学院的?当然可以!但如果不是计算机学院的,你就不知道失主是哪个学院的了。所以这时候你把钱包交给了你们计算机学院的主席。这个计算机学院主席一看这个学号,这不是经管学院的人吗?于是在校学生会的群里艾特经管学院的学生会主席,说他们学院XXX学号的学生钱包掉了。让他赶紧联系一下失主。于是经管学院拿到学号一看,还真是经管学院的。然后再看后面的编号,这不是李四的学号吗?(实际上可能还要专业,班级…继续划分,这里简略一下。)于是就去联系李四。

所以,每一个学号其实就是一个IP地址!每个学生被归类到一个学院。这个学院就是网络号!

每一个学生隶属于一个学院,而每一台主机也一定隶属于一个子网!

为什么要隶属于每一个子网?

我们可以通过学号快速定位到一个学生,所以隶属到每一个子网,也是为了快速定位到这台主机!这样排除效率非常的高。

如何进行子网划分

我们都知道IP地址是一个32位比特位,我们可以用前8位来表示国家,次八位表示省份…。直到最后的主机号

在这里插入图片描述

当然,思想是这么个思想,但是方案绝对不是这种方案,因为这样划分IP地址是不够用的!

在这里插入图片描述

所以,我们使用的IP地址是被设计过的

上面说的只是一个理念版的网络划分,而具体的网络划分会在下面讲解。

DHCP技术(网段划分)

路由器至少要桥接两个子网,所以路由器是被桥接的所有子网所共享的。而因为路由器自己本身也是一台主机,所以路由器也要有自己的IP地址,一般路由器的IP通常是网络标识.1

在一个子网中,管理子网内IP的设备就是路由器!在我们的手机或者电脑没有联网时,其实是没有IP地址的。而当我们连上WIFI时,就自动有了IP地址。这个地址是由路由器动态分配的,这种技术就是DHCP。

特殊的IP地址

将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;

将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数 据包;

127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1

NAT技术(网段划分)

我们都知道IP地址其实是不够用的,因为IP地址是一个32位的无符号整数。也就是最多也只有42亿多。如果每台主机都要安排一个IP地址,那么IP地址是远远不够的。为了解决IP地址不够用的情况,就有了NAT技术的诞生。当然该技术也是治标不治本,真正治本的还得是普及IPV6协议。

而路由器不仅仅可以进行数据包转发,还可以自建局域网(动态分配的IP就是在该局域网内)。而局域网内的地址是不直接连接到公网的。理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组件局域网的私有IP地址。

10.*,前8位是网络号,共16,777,216个地址 *

172.16.到172.31.,前12位是网络号,共1,048,576个地址

192.168.,前16位是网络号,共65,536个地址 包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);

这也就是为什么我们经常查自己的IP时,都是这三个开头的原因了。因为我们的主机其实是处于在一个局域网中,此时我们的IP地址也被称为内网IP(私网IP)。在不同局域网内,内网IP是可以相同的。

在这里插入图片描述

一般来说,一个路由器都会配置2个IP地址,一个是WAN口IP(对外),一个是LAN口IP(对内,子网IP)。当我们要发送的数据报不在当前居于内时,会把数据报内的源IP地址替换成当前路由器的WAN口IP 。 然后交付给上一层路由器,因为你当前的路由器也可能是另一个路由器的子网。直到有一个路由器的WAN口IP为公网IP,此时这个路由器也被称之为公网入口。此时报文的源目的IP就是这个公网入口的WAN口IP,随后就是上面学生会的那一套逻辑,找到报文中目的IP所处的公网IP地址处。这就是我们的私网IP -> 目的IP的过程。那么目的的公网IP,怎么回到你这个私网IP呢?这个后面再说。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Python构建 Windows 进程管理器应用程序

在这篇博客中,我们将探讨如何使用 wxPython 构建一个简单的 Windows 进程管理器应用程序。这个应用程序允许用户列出当前系统上的所有进程,选择和终止进程,并将特定进程保存到文件中以供将来加载。 C:\pythoncode\new\manageprocess.py 全部…

普元EOS-数据实体运行时动态增加property

1 前言 在Java开发读取数据的时候,一般都采用ORM方式将数据表的字段映射到实体对象中。 数据表中有一个字段,实体对象就有一个字段。 但很多时候,我们在读取的数据和显示的数据不同,比如,读取的是部门id&#xff0c…

探索数据结构:图(一)之邻接矩阵与邻接表

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 图的定义 **图(Graph)**是数学和计算机科学中…

这周末,除非外面下钞票,否则谁也拦不住我玩《黑神话悟空》(附:两款可以玩转悟空的显卡推荐)

主播说联播 | 从“十分之三”到“悟空”,国潮有何出圈密码? 《黑神话:悟空》里的中国古建取景地,在这里! 这周末,除非外面下钞票,否则谁也拦不住我玩《黑神话悟空》(附:两款可以玩转悟空的显卡推荐) 原创 IPBrain平台君 集成电路大数据平台 2024年08月22日 17:28 …

gif图片怎么压缩大小?深度测评7款动图压缩工具(内含教程)

gif图片在社交媒体和网络上非常流行,深受大家喜爱,因为它可以呈现生动的动画效果。gif动图之所以受到欢迎,主要因为其出色的压缩算法,能有效存储多个帧,从而实现流畅的动画。 然而,大多数社交媒体平台对gi…

[数据集][目标检测]集装箱缺陷检测数据集VOC+YOLO格式4127张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4127 标注数量(xml文件个数):4127 标注数量(txt文件个数):4127 标注…

全新分支版本!微软推出Windows 11 Canary Build 27686版

已经很久没有看到 Windows 11 全新的分支版本了,今天微软发布 Windows 11 Canary 新版本,此次版本号已经转移到 Build 27xxx,首发版本为 Build 27686 版。 此次更新带来了多项改进,包括 Windows Sandbox 沙盒功能切换到 Microsof…

关于智能编码助手【通义灵码】,开发者们这么说...

自通义灵码发布以来,不停地有开发者朋友为我们送上通义灵码的测评反馈。 关于通义灵码,开发者这样说 墨问西东 CEO 池建强&墨问研发团队 “通义灵码有一个强大的功能就是企业知识库检索增强,我们只需要上传团队的代码规范,…

[数据集][目标检测]快递包裹检测数据集VOC+YOLO格式5382张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):5382 标注数量(xml文件个数):5382 标注数量(txt文件个数):5382 标注…

【C语言小项目】五子棋游戏

目录 前言 一、游戏规则 1.功能分析 2.玩法分析 3.胜负判定条件 二、游戏实现思路 三、代码实现与函数封装 1.项目文件创建 2.头文件说明 3.函数封装 1)菜单实现 2)进度条实现 3)main函数实现 4)Game函数 5&#xff0…

TIM输出比较之PWM驱动LED呼吸灯应用案例

文章目录 前言一、应用案例演示二、电路接线图三、应用案例代码四、应用案例分析4.1 基本思路4.2 相关库函数介绍4.3 初始化PWM模块4.3.1 RCC开启时钟4.3.2 配置时基单元4.3.3 配置输出比较单元4.3.4 配置GPIO4.3.5 运行控制 4.4 PWM输出模块4.5 主程序 前言 提示:…

[数据集][目标检测]竹子甘蔗发芽缺陷检测数据集VOC+YOLO格式2953张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2953 标注数量(xml文件个数):2953 标注数量(txt文件个数):2953 标注…

电脑录屏高清视频制作:如何选择适合的分辨率和参数

在当今数字化时代,无论是教学、演示还是游戏直播,电脑录屏已经成为了一个不可或缺的工具。然而画质往往是录屏质量的关键因素,许多用户在追求高清录屏体验时,常常面临选择1080p还是4K分辨率的困惑。本文将深入探讨如何优化电脑录屏…

SpringBoot自动配置

一、Condition条件判断功能 Condition 是在Spring 4.0 增加的条件判断功能,其主要作用是判断条件是否满足,从而决定是否初始化并向容器注入Bean对象。通过Conditional注解及其一系列的其他相关注解实现。 在Spring Boot中,条件匹配&#xf…

性能优化理论篇 | swap area是个什么东西

我们知道每台计算机的内存(RAM)都是有限的,而我们的应用程序需要加载到内存才能被运行,如果一台机器运行多个应用程序时,内存可能会耗尽。Linux 系统中的“交换空间(也称为交换分区)”可以帮助缓…

使用AWS Lambda轻松开启Amazon Rekognition之旅

这是本系列文章的第一篇,旨在通过动手实践,帮助大家学习亚马逊云科技的生成式AI相关技能。通过这些文章,大家将掌握如何利用亚马逊云科技的各类服务来应用AI技术。 那么让我们开始今天的内容吧! 介绍 什么是Amazon Rekognition&…

微软的免费“后悔药“-Windows File Recovery (WinFR)

微软的免费"后悔药"-Windows File Recovery (WinFR) 当你不小心误删除了文件或因各种意外情况导致数据丢失,可以使用 EasyRecovery、Disk Drill、DiskGenius、Recuva 等“上古”软件,也可以交由专业机构进行恢复。微软(Microsoft&…

揭秘!移动安全管理系统是什么?有什么功能?(从小白到精通一文揭晓!)

在2024年,移动终端管控软件在企业和组织中的应用日益广泛。 移动安全管理系统不仅提高了管理效率,还增强了数据安全性和移动办公的便捷性。 以下是六款值得推荐的移动终端管控软件: 1. 安企神 特点:作为行业领头羊,…

框架漏洞大全【万字总结】

文章目录 常见语言开发框架:Thinkphp远程代码执行5.0.23 rce介绍影响版本复现 CNVD-2018-24942介绍影响版本复现 任意文件包含包含日志-3.2x介绍影响版本复现 包含语言(QVD-2022-46174)介绍影响版本复现 sql注入漏洞(5.0.x)介绍影响版本复现 …

(26)微信检查联系人和清粉(针对删除和拉黑)-微信UI自动化(.Net+C#)

整理 | 小耕家的喵大仙 出品 | CSDN(ID:lichao19897314) Q Q | 978124155 往期知识回顾 (1)开启探索微信自动化之路-微信UI自动化(.NetC#) (2)初始化微信窗体UI自动化实例-微信UI自动化(.NetC#) (3)采用热键终止微信采集任务-微信UI自动…