当前位置: 首页 > news >正文

网络层--IP协议

引入:

IP协议主要解决什么问题呢?

IP协议提供一种将数据从主机A 发送到 主机B的能力。(有能力不一定能做到,比如小明很聪明,可以考100分,但是他也不是每次搜能考100分,可靠性由传输层来解决)

IP协议基本概念

主机  : 配有IP地址, 但是不进行路由控制的设备;

路由器: 即配有IP地址, 又能进行路由控制;

节点  : 主机和路由器的统称。

IP协议头格式

  1. 如何封装和解包呢?

        定长报头+自描述字段(4位首部长度)

  2. 如何交付?(如何确定交付的协议)

        8位协议:标识UDP还是TCP

4位版本:

确定是IPv6还是IPv4

4位首部长度

IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. (基本单位是4字节)4bit表示最大
的数字是15, 因此IP头部最大长度是60字节. 当4位首部长度值为 0101 时表示没有选项(20字节)

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

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

16位总长度(total length):

IP数据报整体占多少个字节.

16位标识(id):

唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个
id都是相同的.

3位标志:

第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁
止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为1, 其他是0. 类似于一个结束标记

13位分片偏移(framegament offset):

是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).

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

数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环。

8位协议:

表示上层协议的类型

16位头部校验和:

使用CRC进行校验, 来鉴别头部是否损坏.出错就会丢弃报文。

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

表示发送端和接收端.

选项字段(不定长, 最多40字节): 

分片:

链路层因为其物理特性的原因,一般不会一次性转发太大的数据==>也就是说:

链路层有一次可以转发到网络中的报文大小的限制,一般是1500(MTU),所以网络层需要将一个较大的ip报文拆分成多个小的,符合条件的报文,这就是分片。

分片的行为是网络层完成的,上层的传输层和应用层并不知道,(这在一定程度上埋下隐患),同样组装的行为也必须由对方的网络层完成。

   为什么呢?

原因可以分为2个:

  1 、 对方给自己的是一个完整的TCP报文,那我自己上传输层交付时也必须是一个完整TCP报文;

        2 、 协议具有一致性,IP协议负责分片和组装不会影响其他层的服务。

分片决定了网络层IP协议具有3种能力

1. 具有区分不同报文的能力      ----16位标识符

2. 具有判断报文是不是分片的能力   ----“更多分片”

3. 异常处理             ---- 任何一个分片丢失,都可以识别出来

  怎么做到分片的呢?

3位标志中有一位是保留的,第2位为1时表示禁止分片,如果报文长度超过MTC,IP就会丢弃报文。第3位 表示 “ 更多分片 ” ,如果分片了的化,最后一个分片置为 0, 其他是 1,类似一个结束标记。

认识偏移量

开始: 更多分片 1 ,片偏移 = 0

结尾: 更多分片 0 ,片偏移 ≠ 0

中间: 更多分片 1 ,片偏移 ≠ 0

  中间那么多的分片,如何确定所有分片都收到了呢?

根据偏移量进行升序排序,结合偏移量+自身大小=下一个报文的偏移量,通过扫描整个报文,来进行判断,如果不匹配,则说明报文出现了丢失,需要重新发送,如果成功遍历到结尾,则表明收取到了完整的报文。

分片之前,报文一定是一个完整的报文分片之后,每一个分片也有单独的IP报头

下面简单分析一下分片过程

假设MTC=1500

原本的整个报文数据大小是 3000 ,(注意: IP报文=IP报头+有效载荷)

第一步,先分一个1500的数据块,直接拿走原本的报头(实际可能更复杂哈) ,

剩下的1500的数据并不是可以直接就成为一个分片,还要添加报头信息(20字节)为了支持未来的组装,每一个分片都必须有IP报头,所有分割1480的大小,再添加20字节的报头,最后一个分片包含20字节的报头和20字节的有效载荷。

我们再来分析一下这三个报文

报文编号123
16位标识123412341234
3位标志“更多分片”110
13位片偏移015002980
总长度1500150040

分片的坏处

之前我们提到在网络层进行分片和组装,上层是不知道的,同时,我们也应该有这个常识:

丢包是有概率的,分包会增加报文个数,在一定程度上增加了丢包的概率。,要彻底解决丢包问题,还得依靠 传输层。当然这也决定了分片不是主流

网段划分

IP 地址分为两个部分 , 网络号和主机号
        网络号: 保证相互连接的两个网段具有不同的标识 ;
        主机号: 同一网段内 , 主机之间具有相同的网络号 , 但是必须有不同的主机号 ;
不同的子网其实就是把网络号相同的主机放到一起. 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复.
通过合理设置主机号和网络号 , 就可以保证在相互连接的网络中 , 每台主机的 IP 地址都不相同 .
那么问题来了 , 手动管理子网内的 IP, 是一个相当麻烦的事情 .
有一种技术叫做 DHCP , 能够自动的给子网内新增主机节点分配 IP 地址 , 避免了手动管理 IP 的不便 . 一般的路由器都带有DHCP 功能 . 因此路由器也可以看做一个 DHCP 服务器 .
过去曾经提出一种划分网络号和主机号的方案 , 把所有 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
随着 Internet 的飞速发展 , 这种划分方案的局限性很快显现出来 , 大多数组织都申请 B 类网络地址 , 导致 B 类地址很快就
分配完了 , A 类却浪费了大量地址 ;
例如 , 申请了一个 B 类地址 , 理论上一个子网内能允许 6 5 千多个主机 . A 类地址的子网内的主机数更多 . 然而实际网络架设中, 不会存在一个子网内有这么多的情况 . 因此大量的 IP 地址都被浪费掉了 .
针对这种情况提出了新的划分方案 , 称为 CIDR(Classless Interdomain Routing):
引入一个额外的子网掩码 (subnet mask) 来区分网络号和主机号 ;
子网掩码也是一个32 位的正整数 . 通常用一串 "0" 来结尾 ;
IP 地址和子网掩码进行 " 按位与 " 操作 , 得到的结果就是网络号 ;
网络号和主机号的划分与这个 IP 地址是 A 类、 B 类还是 C 类无关 ;
示例1
可见 ,IP 地址与子网掩码做与运算可以得到网络号 , 主机号从全 0 到全 1 就是子网的地址范围 ;
IP 地址和子网掩码还有一种更简洁的表示方法 , 例如 140.252.20.68/24, 表示 IP 地址为 140.252.20.68, 子网掩码的高24位是 1, 也就是 255.255.255.0

特殊的IP地址

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

相关文章:

网络层--IP协议

引入: IP协议主要解决什么问题呢? IP协议提供一种将数据从主机A 发送到 主机B的能力。(有能力不一定能做到,比如小明很聪明,可以考100分,但是他也不是每次搜能考100分&#xff0…...

Vue2 | Vant uploader实现上传文件和图片

需求&#xff1a; 实现图片和文件的上传&#xff0c;单个图片超过1M则压缩&#xff0c;全部文件加起来不得超过10M。 效果&#xff1a; 1. html <van-form ref"form"><van-field name"uploader" label"佐证材料" required><t…...

第二十一章 Classes

文章目录 第二十一章 ClassesClasses类名和包类定义的基本内容 第二十一章 Classes Classes 类定义并不是 ObjectScript 的正式组成部分。相反&#xff0c;可以在类定义的特定部分中使用 ObjectScript&#xff08;特别是在方法定义中&#xff0c;可以在其中使用其他实现语言&…...

Ubuntu不能上网解决办法

问题及现象 Ubuntu的虚拟机&#xff08;18.04&#xff09;总是莫名就不能上网了。 使用ifconfig -a 查看&#xff0c;ensxx&#xff08;xx为虚拟机分配的id号&#xff09;对应的网卡有mac地址&#xff0c;但是没有分配ip地址。 Network中也没有Wired的选项。 临时解决方案 使…...

百度飞浆OCR识别表格入门python实践

1. 百度飞桨&#xff08;PaddlePaddle&#xff09; 百度飞桨&#xff08;PaddlePaddle&#xff09;是百度推出的一款深度学习平台&#xff0c;旨在为开发者提供强大的深度学习框架和工具。飞桨提供了包括OCR&#xff08;光学字符识别&#xff09;在内的多种功能&#xff0c;可…...

直接插入排序、希尔排序详解。及性能比较

直接插入排序、希尔排序详解。及性能比较 一、 直接插入排序1.1 插入排序原理1.2 代码实现1.3 直接插入排序特点总结 二、希尔排序 ( 缩小增量排序 )2.1 希尔排序原理2.2 代码实现2.3 希尔排序特点总结 三、直接插入排序和希尔排序性能大比拼 !!!3.1 如何对比性能&#xff1f;准…...

2023备战秋招Java面试八股文合集

Java就业大环境仍然根基稳定&#xff0c;市场上有很多机会&#xff0c;技术好的人前景就好&#xff0c;就看你有多大本事了。小编得到了一份很不错的资源&#xff0c;建议大家可以认真地来看看以下的资料&#xff0c;来提升一下自己的核心竞争力&#xff0c;在面试中轻松应对面…...

SLAM中的二进制词袋生成过程和工作原理

长期视觉SLAM (Simultaneous Localization and Mapping)最重要的要求之一是鲁棒的位置识别。经过一段探索期后&#xff0c;当长时间未观测到的区域重新观测时&#xff0c;标准匹配算法失效。 当它们被健壮地检测到时&#xff0c;回环检测提供正确的数据关联以获得一致的地图。…...

算法训练第五十九天

503. 下一个更大元素 II - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> nums1(nums.begin(), nums.end());nums.insert(nums.end(), nums1.beg…...

二叉树oj题

目录 层序遍历(一) 题目 思路 代码 层序遍历(二) 题目 思路 代码 根据二叉树创建字符串 题目 思路 代码 二叉树的最近公共祖先 题目 思路 代码 暴力版 队列版 栈版 bs树和双向链表 题目 思路 代码 前序中序序列构建二叉树 题目 思路 代码 中序后序…...

华为数通方向HCIP-DataCom H12-831题库(单选题:1-20)

第1题 关于IPSG下列说法错误的是? A、IPSG可以防范IP地址欺骗攻击 B、IPSG是一种基于三层接口的源IP地址过滤技术 C、IPSG可以开启IP报文检查告警功能,联动网管进行告警 D、可以通过IPSG防止主机私自更改IP地址 答案: B 解析: IPSG(入侵防护系统)并不是基于三层接口的源I…...

TableConvert-免费在线表格转工具 让表格转换变得更容易

在线表格转工具TableConvert TableConvert 是一个基于web的免费且强大在线表格转换工具&#xff0c;它可以在 Excel、CSV、LaTeX 表格、HTML、JSON 数组、insert SQL、Markdown 表格 和 MediaWiki 表格等之间进行互相转换&#xff0c;也可以通过在线表格编辑器轻松的创建和生成…...

伦敦金实时行情中的震荡

不知道各位伦敦金投资者&#xff0c;曾经花过多长的时间来观察行情走势的表现&#xff0c;不知道大家是否有统计过&#xff0c;其实行情有60%-70%的时间&#xff0c;都会处于没有明显方向的震荡行情之中呢&#xff1f;面对长期的震荡行情&#xff0c;伦敦金投资者道理应该如何应…...

蓝桥杯打卡Day7

文章目录 阶乘的末尾0整除问题 一、阶乘的末尾0IO链接 本题思路&#xff1a;由于本题需要求阶乘的末尾0&#xff0c;由于我们知道2*510可以得到一个0&#xff0c;那么我们就可以找出2的数和5的数&#xff0c;但是由于是阶乘&#xff0c;所以5的数量肯定是小于2的数量&#xf…...

Mobile Vision Transformer-based Visual Object Tracking

论文作者&#xff1a;Goutam Yelluru Gopal,Maria A. Amer 作者单位&#xff1a;Concordia University 论文链接&#xff1a;https://arxiv.org/pdf/2309.05829v1.pdf 项目链接&#xff1a;https://github.com/goutamyg/MVT 内容简介&#xff1a; 1&#xff09;方向&#…...

HTTP反爬困境

尊敬的程序员朋友们&#xff0c;大家好&#xff01;今天我要和您分享一篇关于解决反爬困境的文章。在网络爬虫的时代&#xff0c;许多网站采取了反爬措施来保护自己的数据资源。然而&#xff0c;作为程序员&#xff0c;我们有着聪明才智和技术能力&#xff0c;可以应对这些困境…...

从零开始探索C语言(九)----函数指针与回调函数

函数指针 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量&#xff0c;而函数指针是指向函数。 函数指针可以像一般函数一样&#xff0c;用于调用函数、传递参数。 函数指针变量的声明&#xff1a; typedef int (*fun_ptr)(int,i…...

智慧工厂的基础是什么?功能有哪些?

关键词&#xff1a;智慧工厂、智慧工厂数字化、设备设施数字化、智能运维、工业互联网 1.智慧工厂的定义 智慧工厂是以数字化信息形式的工厂模型为基础&#xff0c;以实现制造系统离线分析设计和实际生产系统运行状态在线监控的新型工厂。智慧工厂的建设在于以高度集成的信息化…...

LeetCode 238. 除自身以外数组的乘积

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 使用前缀和进行解决该题&#xff0c;只不过与之前前缀和不同的是这个题目计算前缀和的时候不需要计算当前元素&#xff0c;也就是当前位置前缀和的值其实是不包含当前元素的前缀和。…...

点击劫持概念及解决办法

1.点击劫持的概念 点击劫持 (Clickjacking) 技术又称为界面伪装攻击 (UI redress attack )&#xff0c;是一种视觉上的欺骗手段。攻击者使用一个或多个透明的 iframe 覆盖在一个正常的网页上&#xff0c;然后诱使用户在该网页上进行操作&#xff0c;当用户在不知情的情况下点击…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...