【计算机网络】IP协议(下)

文章目录

  • 1. 特殊的IP地址
  • 2. IP地址的数量限制
  • 3. 私有IP地址和公网IP地址
    • 私有IP为什么不能出现在公网上?
    • 解决方案——NAT技术的使用
  • 4. 路由
  • 5. IP分片问题
    • 为什么要进行切片?
    • 如何做的分片和组装?
      • 16位标识
      • 3位标志
      • 13位片偏移
      • 例子
    • 细节问题
      • 如何区分不同的片?
      • 如何知道分片了?
      • 如何判断是开头报文 中间报文 结尾报文?
      • 如何保证把分片收全了?
      • 结论
  • 6. 自己做一次分片

1. 特殊的IP地址

将IP地址中的主机全部设为0,就成为网络号,代表整个局域网
将IP地址中的主机全部设为1,就成为广播地址,用于给同一个链路中相互连接的所有主机发送数据包
127.* 的IP地址 用于本机环回,通常是127.0.0.1


2. IP地址的数量限制

IP地址 是一个 4字节32位的正整数,共有2^32个IP地址
TCP/IP协议规定,每一个主机都需要IP地址
而由于特殊的IP地址的存在,数量不足43亿

为了解决IP地址不足的问题,有三种方案

方案一:动态分配IP地址
使用的是 DHCP 技术(子网是由路由器划分好的,局域网的所有主机的IP地址,都是从路由器中申请的)
假设在你家里面,手机连接上热点,当断开热点时,相当于在路由器层面上被回收了
(用的时候就给你,不用就回收)

方案二:NAT技术(后面会讲)

方案三:IPV6
IPV6 用16字节 128比特位来表示一个IP地址,但目前来没有普及

3. 私有IP地址和公网IP地址

IRFC 1918规定 用于组建局域网的私有IP地址

I10.* 前8位是网络号
I172.16. 到172.31. 前12位是网络号
192.168.* 前16位是网络号
包含这个范围中的,都成为 私有IP,其余都称为 全局IP(公网IP)

私有IP为什么不能出现在公网上?

家里的路由器是可以通过私有IP,去构建子网的
由于每个家用路由器都可以构建相同的子网,所以私有IP是可以重复存在的


src作为源IP地址,dst作为目的IP地址
想要从当前主机 发送到公网上


由于当前主机 并不认识 目的IP地址是谁 ,所以就会向上交付给 家用路由器
由于家用路由器 既属于你的设备,又属于运营商的设备,所以有两个IP
子网IP 又可称为 LAN口IP 表示 你家里的设备
WAN口IP 表示 运营商的设备


发现目的IP122…3 是一个 公网IP,所以就将其继续向上交付 运营商路由器


运营商路由器 继续向上交付 交给对应的 主机
服务器收到报文请求,做出响应 构建response 向下交付时,是没办法向下交付的
源IP地址(src) 是私有IP地址
子网中的私有IP地址是可以重复存在的,所以私有IP不能出现在公网上

解决方案——NAT技术的使用

从200的主机 交付给家用路由器, 家用路由器发现其目的地址是公网IP,则继续向上交付


在交付之前,需将 LAN 口 IP(子网IP) 转换成 WAN 口 IP


再次将LAN口 IP(子网IP) 替换成 WAN口 IP


主机收到报文后,构建响应,形成响应报文,就可以返回
由于目的IP地址(dst) 不是私有IP,所以可以向下交付了

将源IP在内网环境下不断被替换的技术 称为 NAT (地址转化)技术

4. 路由

假设 你坐火车 去上海同济大学报道,当下火车时,发现东西丢了,幸好身上还藏有20块钱
此时根本不知道在哪里,只知道在火车站,并不清楚 同济大学在哪里
所以只好找个大爷 问路,询问同济大学怎么走
在现实中可能大爷并不知道,或者直接拒绝回答你的问题

若在网络环境中,存在一个路由器也不知道这个报文去哪里,但它即便不知道,也会想办法帮助你

按照网络的情况,大爷虽然没去过,但是大概知道在那个路上,所以给你说了一个路线到附近

到了附近,你又不认识路了,又问了一个大爷,询问同济大学怎么走,最后到达同济大学

所以问别人路,一定要告诉别人你去哪里


结论:

1. 当一个报文到了某个路由器内部,询问路由器时,首先要告诉路由器自己要去哪里,所以IP报头中包含目的IP

2. 大爷思考路线时,并给出结果 相当于 查找路由表

3. 碰到大爷知道下一站该怎么走,或者 碰到 大爷并不知道怎么走,但不会拒绝你,会给你介绍知道路的人相当于 路由器并不知道你去哪里,但确定你当前不是要在 现在的网络里

4. 当到达同济大学保安处时,询问同济大学保安怎么走,大爷告诉你这里就是
相当于 到达目标子网的入口路由器处


实际上并不是去同济大学,而是去同济大学的11号宿舍楼找辅导员,但问路时,并不会问同济大学的11号宿舍楼在哪里
在路上时,只需问同济大学在哪里即可

当到达同济大学时,才会去问同济大学的11号宿舍楼怎么走
相当于 问路口路由器 要去的目标主机在哪里

整个报文转发的过程:
先根据路上网络进行路上转发,到了目标网络的路口路由器处,再根据目标主机进行交付

5. IP分片问题

为什么要进行切片?

数据链路层规定 所发出去的单个帧的有效载荷不能超过MTU(最大传送单元 1500字节)
IP报文送多大并不是由 IP说了算,真正由报文多少是由TCP决定的

若TCP给IP一个较大报文,而在数据链路层 又不给转,因为大小超过1500字节
所以IP只能 进行分片


分片只能由当前IP来做,组装也只能由对方的IP来做
因为分片的信息只有ip协议知道

如何做的分片和组装?

16位标识

所以IP报头 存在 16位标识
16位标识就是 16位整数,保证自己和其他的保文不重复


3位标志

3位标志 共有3个比特位
第一位 为保留位 这个位不用,后面需要的使用再用

第二位
若为1 表示禁止分片,若报文长度超过MTU,则IP模块会丢弃报文
若为0 表示 允许分片

第三位 表示更多分片
若分片了,则最后一个分片置为0,其他为1

(看不懂下面有例子进行理解)


13位片偏移

若不分片,对应的报文 在原始报文中 起始偏移量为0

例子

将一个字节为4500的报文,分片成三个1500字节的保文
所以三个1500字节的报文 16位标识相同,设置为1234

三位标志,若后面有报文就设为1,若后面没有保文 就设为0

第一个报文的片偏移为0,第二个报文的片偏移为1500,第三个报文的片偏移为3000

细节问题

如何区分不同的片?

假设为数据的接收方,不断收报文
若有两种客户端发送报文,第一种客户端的报文可能进行分片,第二种客户端的报文也可能进行分片,两者可能糅在一起
报文中携带源IP,可以通过源IP 区分不同的客户端的能力


如何知道分片了?

1. 只要片偏移不是0(说明分片过了),提取对应的标识
2. 若片偏移为0,再看更多分片为1(说明还有分片),则一定分片了


如何判断是开头报文 中间报文 结尾报文?

若更多分片为1,片偏移为0, 则为开头报文
若更多分片为1,片偏移不为0, 则为中间报文
若更多分片为0,片偏移不为0 ,则为 结尾报文
若更多分片为0,片偏移为0,则为独立报文


如何保证把分片收全了?

即如何保证 开始报文 中间报文 结尾报文 没有丢

若 开始报文或者结尾报文丢失,通过上述判断条件即可得知
通过偏移量 进行排序,每一个偏移量之间的差值应该是相同的,若差值不同,则中间报文丢失了


结论

1. 网络中分片,尽量让它成为少数情况

2. 为什么不太建议网络分片?
当IP进行切片时,丢失一部分,导致报文丢失

所以无论是TCP或者UDP,当IP丢失报文时,就真的丢了
但TCP可以进行超时重传,传给IP一份新的报文
而UDP什么都不干

过多的分片,容易增加丢包率


由数据链路层定制规则,数据不能超过1500字节
当来自TCP的报文数据过大时,IP会进行分片,但分片会导致增加丢包率
可IP也没办法,IP只是用来执行命令的

所以一切问题出在TCP上面
只有TCP每次将数据发送小一点,才能减少丢包率
所以滑动窗口的发送区域的报文 拆成多个报文 向下交付给IP


3. 怎么做到分片减少?
所以 TCP协议,尽量发送数据不要过大

MTU(最大传送单元 1500字节)
IP标准报头为20字节,有效载荷为1480
TCP标准报头为20字节,有效载荷为1460

把TCP传送的1460 这样的数字 称为 MSS (最大段尺寸)
TCP发送的报文数据 不要超过1460

6. 自己做一次分片

假设 一个已经被封装的IP报文 为3000字节

分片后,每一片都是IP报文,所以都要携带报头
所以应该分为3片


首先将前1500个字节作为开始报文,即 20+1480
其有效载荷为1480 ,没有超过1500
可以看作切片的第一片


将IP报文剩余的1500字节 拆分出 一个 20字节,在1480 前面重新加入一个 20字节的报头(未来要去掉)
可以看作切片的第二片


此时只剩下 20字节,在其前面重新加入一个 20字节的报头(未来要去掉)
可以看作切片的第三片


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

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

相关文章

基于springboot地方废物回收机构管理系统springboot11

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

智慧农业农场小程序源码 智慧农场系统源码

智慧农业农场小程序源码 智慧农场系统源码 一、 智慧农场系统的组成 智慧农场系统一般包括传感器、控制器、数据采集与处理平台、应用软件等组成部分。其中, 传感器主要用于采集土壤温度、湿度、光照强度等环境参数,以及作物生长状态、水肥情况等生产信息。控制器则根据传感器…

GLTF编辑器的另一个作用

1、GLB模型介绍 GLB(GLTF Binary)是一种用于表示三维模型和场景的文件格式。GLTF是"GL Transmission Format"的缩写,是一种开放的、跨平台的标准,旨在在各种3D图形应用程序和引擎之间进行交换和共享。 GLB文件是GLTF文件…

PyCharm 手动下载插件

插件模块一直加载失败,报错信息: Marketplace plugins are not loaded. Check the internet connection and refresh. 尝试了以下方法,均告失败: pip 换源Manage Plugin Repositories...HTTP 代理设置...关闭三个防火墙 最后选…

RK3568平台开发系列讲解(工具命令篇)ADB的安装

🚀返回专栏总目录 文章目录 一、ADB介绍二、Windows 下安装 adb 工具沉淀、分享、成长,让自己和他人都能有所收获!😄 一、ADB介绍 adb 全称 Android Debug Bridge,直译过来就是 Android 调试桥,它是一个通用的命令行工具。adb 做为 Android 设备与 PC 端连接的一个桥梁…

MissionPlanner编译过程

环境 windows 10 mission planner 1.3.80 visual studio 2022 git 2.22.0 下载源码 (已配置git和ssh) 从github上克隆源码 git clone gitgithub.com:ArduPilot/MissionPlanner.git进入根目录 cd MissionPlanner在根目录下的ExtLibs文件下是链接的其它github源码&#xff0…

MySQL 高级(进阶) SQL 语句(二) -----存储过程

目录 1 存储过程 1.1 创建存储过程​ 1.2 调用存储过程 1.3 查看存储过程 1.4 存储过程的参数 1.5 修改存储过程 1.6 删除存储过程 2 条件语句 3 循环语句 1 存储过程 存储过程是一组为了完成特定功能的SQL语句集合。 存储过程在使用过程中是将常用或者复杂的工作预…

ClickHouse分布式集群部署

目录 ​编辑 一、环境说明 二、安装部署 2.1 RPM方式安装 2.1.1 安装yum-utils 2.1.2 配置yum repo源 2.1.3 yum install 下载安装clickhouse 2.2 信息配置 2.2.1 配置外网可访问地址 2.2.2 修改存储路径 2.2.2.1 新建存储目录 2.2.2.2 授权 2.2.2.3 修改配置 2.…

单片机第三季-第三课:STM32开发板原理图、配置、浮点运算单元

目录 1,开发板原理图 2,浮点运算单元(FPU) 1,开发板原理图 课程视频比较早,介绍了三款开发板。观看视频时用的开发板说和51单片机共板的STM32核心板,将51单片机从底座拆下来后,安…

【从0学习Solidity】35. 荷兰拍卖

【从0学习Solidity】35. 荷兰拍卖 博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈…

黑马JVM总结(十四)

(1)分代回收_1 Java虚拟机都是结合前面几种算法,让他们协同工作,具体实现是虚拟机里面一个叫做分代的垃圾回收机制,把我们堆内存大的区域划分为两块新生代、老年代 新生代有划分为伊甸园、幸存区Form、幸存区To 为什…

ARMv8 cache的包含策略inclusive 和 exclusive之间的区别以及Cortex-A55示例详解

Inclusive 和 Exclusive 一, 什么是cache的inclusive 和 exclusive二,Inclusive 和 Exclusive cache示例2.1 Inclusive cache2.2 Exclusive cache 三, inclusive cache和 exclusive cache的比较3.1 cache coherency3.2 miss rate3.3 cache ca…

使用 Docker 安装 Elasticsearch (本地环境 M1 Mac)

Elasticsearchkibana下载安装 docker pull elasticsearch:7.16.2docker run --name es -d -e ES_JAVA_OPTS“-Xms512m -Xmx512m” -e “discovery.typesingle-node” -p 9200:9200 -p 9300:9300 elasticsearch:7.16.2docker pull kibana:7.16.2docker run --name kibana -e EL…

最频繁被问到的SQL面试题

面试感叹失败的原因可能有很多,而做成的道路只有⼀条,那就是不断积累。纯手工的8291字的SQL面试题总结分享给初学者,俗称八股文,期待对新手有所帮助。 窗口函数题 窗口函数其实就是根据当前数据, 计算其在所在的组中的统计数据。…

网工基础知识——以太网

1972年Bob Metcalfe“以太网之父”被Xerox雇佣为网络专家,Bob Metcalfe 来到Xerox公司的Palo Alto研究中心(PARC)的第一个任务是把Palo Alto的计算机连接到ARPANET(Internet的前身)上。1972年底Bob Metcalfe以ALOHA系统…

嵌入式开发笔记:STM32的外设GPIO知识学习

GPIO简介: • GPIO ( General Purpose Input Output )通用输入输出口 • 可配置为 8 种输入输出模式 • 引脚电平: 0V~3.3V ,部分引脚可容忍 5V (如舵机和驱动直流电机) • 输出模式下可控制端口…

机器学习 day35(决策树)

决策树 上图的数据集是一个特征值X采用分类值,即只取几个离散值,同时也是一个二元分类任务,即标签Y只有两个值 上图为之前数据集对应的决策树,最顶层的节点称为根节点,椭圆形节点称为决策节点,矩形节点称…

springboot整合返回数据统一封装

1、MagCode,错误码枚举类 package com.mgx.common.enums;import lombok.*; import lombok.extern.slf4j.Slf4j;/*** 错误码* author mgx*/ Slf4j NoArgsConstructor AllArgsConstructor public enum MsgCode {/*** 枚举标识,根据业务类型进行添加*/Code…

阻塞队列-生产者消费者模型

阻塞队列介绍标准库阻塞队列使用基于阻塞队列的简单生产者消费者模型。实现一个简单型阻塞队列 (基于数组实现) 阻塞队列介绍 不要和之前学多线程的就绪队列搞混; 阻塞队列:也是一个队列,先进先出。带有特殊的功能 &…

Learn Prompt-提供示例

目前我们与 ChatGPT 交流的主要形式是文字。提示除了指令问题的形式外,还可以包含例子。特别是当我们需要具体的输出时,提供例子可以省去我们对具体任务的解释,帮助ChatGPT更好地理解我们的确切需求,从而提供更准确,更…