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

news2024/12/23 0:49:40

文章目录

  • 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.coloradmin.cn/o/1036597.html

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

相关文章

一文带你玩转logo:含义、获取、使用以及2000多知名logo大图资源

大家好!logo是我们非常熟悉的一种事物,但是我发现很多场合的logo使用并不规范、高效,所以今天六分成长来带着大家了解一下关于logo的方方面面。 一、什么是logo? logo不是某一些英文单词的缩写,是一个完整的单词&…

uniapp如何判断是哪个(微信/APP)平台

其实大家在开发uniapp项目的时候长长会遇到这样一个问题,就是针对某些小程序,没发去适配相关的功能,所以要针对不同的平台,进行不同的处理。 #ifdef : if defined 仅在某个平台编译 #ifndef : …

机器学习实验一:使用 Logistic 回归来预测患有疝病的马的存活问题

代码: import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report import matplotlib.pyplot as plt def train(): # …

机器学习---神经元模型

1. 生物学的启示 神经元在结构上由细胞体、树突、轴突和突触四部分组成。 细胞体是神经元的主体,由细胞核、细胞质和细胞膜3部分组成。细胞体的外部是细胞膜,将 膜内外细胞液分开。由于细胞膜对细胞液中的不同离子具有不同的通透性,这使得膜…

XXE 漏洞及案例实战

文章目录 XXE 漏洞1. 基础概念1.1 XML基础概念1.2 XML与HTML的主要差异1.3 xml示例 2. 演示案例2.1 pikachu靶场XML2.1.1 文件读取2.1.2 内网探针或者攻击内网应用(触发漏洞地址)2.1.4 RCE2.1.5 引入外部实体DTD2.1.6 无回显读取文件 3. XXE 绕过3.1 dat…

【操作系统】线程、多线程

为什么要引入线程? 传统的进程只能串行的执行一系列程序,线程增加并发度。同一个进程分为多个线程。 线程是调度的基本单元,程序执行流的最小单位,基本的CPU执行单元。 进程是资源分配的基本单位。 线程的实现方式 用户级线程 代…

Unity入门教程(上)

七、运行游戏 再次保存我们的项目文件(返回步骤四)。保存完成后,让我们把游戏运行起来。 1,确认游戏视图标签页右上方的Maximize on Play图标处于按下状态,然后点击画面上方的播放按钮(位于工具栏中间的播…

C++类模板学习

之前已经学习了函数模板,在这里, C函数模板Demo - win32 版_c编写的opc da demo_bcbobo21cn的博客-CSDN博客 下面学习类模板; VC6; 做一个星星类,Star; Star.h; #if !defined(AFX_STAR_H_…

(十二)VBA常用基础知识:worksheet的各种操作之sheet移动

当前sheet确认 把sheet1移动到sheet3前边 Sub Hello()10Worksheets("Sheet1").Move Before:Worksheets("Sheet3") End Sub3. 把sheet2移动到sheet1后边 Sub Hello()11Worksheets("Sheet2").Move after:Worksheets("Sheet1") End Sub…

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…

pymysql简介以及安装

视频版教程 Python操作Mysql数据库之pymysql模块技术 前面基础课程介绍了使用文件来保存数据,这种方式虽然简单、易用,但只适用于保存一些格式简单、数据量不太大的数据。对于数据量巨大且具有复杂关系的数据,当然还是推荐使用数据库进行保存…

79、SpringBoot 整合 R2DBC --- R2DBC 就是 JDBC 的 反应式版本, R2DBC 是 JDBC 的升级版。

★ 何谓R2DBC R2DBC 就是 JDBC 的 反应式版本, R2DBC 是 JDBC 的升级版。 R2DBC 是 Reactive Relational Database Connectivity (关系型数据库的响应式连接) 的缩写 反应式的就是类似于消息发布者和订阅者,有消息就进行推送。R2DBC中DAO接口中方法的…

Rust vs C++ 深度比较

Rust由于其强大的安全性受到大量关注,被认为C在系统编程领域最强大的挑战者。本文从语言、框架等方面比较了两者的优缺点。原文: Rust vs C: An in-depth language comparison Rust和C的比较是开发人员最近的热门话题,两者之间有许多相似之处&#xff0c…

Linux复习-安装与熟悉环境(一)

这里写目录标题 虚拟机ubuntu系统配置镜像Linux命令vi编辑器3个模式光标命令vi模式切换命令vi拷贝与粘贴命令vi保存和退出命令vi的查找命令vi替换命令 末行模式复制、粘贴、剪切gcc编译器 虚拟机 VMware16 官网下载:vmware官网 网盘下载: 链接&#xff…

共享文件夹设置密码怎么做?3招轻松为文件上锁!

“我们小组里建了一个共享文件夹,为了安全起见,想给文件夹设置一个密码,但是不知道应该怎么操作,有没有大佬可以教教我呀!” 在我们的工作中,经常都会用到共享文件,这样可以让我们的工作方便快捷…

Jmeter接口测试

前言: 本文主要针对http接口进行测试,使用Jmeter工具实现。 Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对Http接口的测试。 1.介绍什么是…

负载均衡技术全景:理论、实践与案例研究

在当今的互联网时代,随着用户数量的增长和业务规模的扩大,单一的服务器已经无法满足高并发、大流量的需求。为了解决这个问题,负载均衡技术应运而生。负载均衡可以将大量的网络请求分发到多个服务器上进行处理,从而提高系统的处理…

Qt-双链表的插入及排序

输入一个二维链表将其排序后转化成一维链表 要求:链表自定义不得使用模板库 链接:私信

Spring Cloud Gateway快速入门(一)——网关简介

文章目录 前言一、什么是网关1.1 gateway的特点1.2 为什么要使用gateway 二、使用 Nginx 实现网关服务什么是网关服务?为什么选择 Nginx 作为网关服务?如何使用 Nginx 实现网关服务?1. 安装 Nginx2. 配置 Nginx3. 启动 Nginx4. 测试网关服务 …

八大排序(二)快速排序

一、快速排序的思想 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右…