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

【Linux】网络层协议——IP

一、IP协议

       在前面,我们学习了应用层和传输层,接下来,我们来学习网络层,网络层的主要功能是在复杂的网络环境中确定一个合适的路由。

1.1 IP协议的基本概念

  • 主机:配有IP地址,有可以进行路由控制的设备
  • 路由器:配有IP地址,又能进行路由控制
  • 节点:主机和路由器的统称

1.2 IP协议头的格式

  • 4位版本号:指定IP协议的版本,对于IPv4来说,就是4
  • 4位头部长度:IP头部的长度是多少个32bit,也就是4的字节数,4bit表示的最大数字是15,因此IP头部最大的长度是60字节
  • 8位服务类型:3位优先权字段(已经弃用),4位TOS字段和1位保留字段(必须置为0),4位TOS分别表示为:最小延时,最大吞吐量,最高可靠性,最小成本,这个四者相互冲突,只能选择一个,对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要
  • 16位总长度:IP数据报整体占多少个字节
  • 16位标识:唯一的标识主机发送的报文,如果IP报文在数据链路层中被分片了,那么每一个片里面的这个ID都是相同的
  • 3位标志字段:第一位保留(保留的意思是现在不同,但是还没想好,说不定在以后就要用到);第二位置为1表示禁止分片,这时候如果报文的长度超过MTU,IP模块就会丢弃报文;第三位表示“更多分片”,如果分片的话,最后一个分片置为0,其他都是1,类似于一个结束标记。
  • 13位分片偏移:是分片相对于原始IP报文开始处的偏移,其实就是在表示当前分片在源报文中处在哪个位置,实际偏移的字节数是这个值乘以8得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)
  • 8位生存时间:数据报达到目的地的最大报文跳数,一般都是64,每次经过一个路由,TTL -= 1,一直减到0还没有到达的话,就可以将其丢弃,这个字段主要是用来防止出现路由循环的
  • 8位协议:表示上层协议的类型
  • 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏
  • 32位源地址和32位目标地址:表示发送端和接收端
  • 选项字段(不定长,最多40字节)

二、网段划分

IP地址分为两个部分:网络号和主机号。

  • 网络号:保证相互连接的两个网段具有不同的标识
  • 主机号:用一个网段内,主机之间具有相同的网络号,但是必须要有不同的主机号
  • 不同的子网其实就是把网络号相同的主机放在一起
  • 如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复

       通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。那么问题来了,手动管理子网内的IP是一个相互麻烦的事情。

  • 有一种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便。
  • 一般的路由器都带有DHCP功能,因此路由器也可以看做一个DHCP服务器。

过去曾经提出一种划分网络号和主机号的方案,把所有IP地址分为五类,如下图所示,

       但是这种方式是比较浪费的,因为随着Internet的飞速发展,这种划分方案的局限性很快就显示出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量的地址。

  • 例如,申请了一个B类地址, 理论上一个子网内能允许6万5千多台个主机,A类地址的子网内的主机数更多。
  • 然而实际的网络架设中,不会存在一个子网内有那么多的情况,因此大量的IP地址都被浪费掉了。

针对这种情况提出了新的划分方案,称为CIDR:

  • 引入一个额外的子网掩码来区分网络号和主机号
  • 子网掩码也是一个32位的正整数,通常用一串“0”来结尾
  • 将IP地址和子网掩码进行按位与操作,得到的结果就是网络号
  • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关

三、特殊的IP地址

  • 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网
  • 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包
  • 127.* 的IP地址用于本地环回测试,通常是127.0.0.1,其不走到网络,在IP层直接走到上层交付

3.1 IP地址的数量限制

       我们知道,IPv4版本的IP地址是一个字节数为32位的正整数,那么一共有2的32次方个IP地址,大概是43亿左右,但是TCP/IP协议规定每一个主机都要有一个IP地址,这就意味着一共只有43亿台主机能介入网络中吗??

       实际上,由于一些特殊的IP地址的存在,数量远不足43亿,另外IP地址并非是按照主机台数来进行配置的,而是每一个网卡中都需要配置一个或者多个IP地址,CIDR(子网掩码)在一定程度上缓解了IP地址不够用的问题(提高了利用率,减少了浪费,但是IP地址的绝对上限数量没有增加),仍然是不够用的,现在有三种方式来解决这个问题:

  • 动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的。
  • NAT技术:后面再说
  • IPv6:IPv6并不是IPv4的简单升级版本,他们两个毫不相关,彼此并不兼容,IPv6使用16字节128位来表示一个IP地址,从源头上解决了IPv4数量不同的问题,但是目前IPv6还没有普及。

3.2 私有IP地址和公有IP地址

       如果一个组织内组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上,使用任意的IP地址都可以,但是RFC1918中规定了用于组建局域网的私有IP地址。

3.2.1 私有IP地址的范围

       私有IP地址的范围:(包含在这个范围中的地址都称为私有IP地址,其余的全部称为全局IP地址或者公网IP地址)

  • 10.* :前8位是网络号,一共有16777216个地址
  • 172.16. * 到 172.31. * :前12位是网络号,一共有1048576个地址
  • 192.168. *:前16位是网络号,一共有65536个地址

3.2.2 结合私有IP地址和公有IP地址

       我们来回顾一下之前的知识点:IP地址是给目标服务器提供最终的地址,主机定位和路由;IP地址等于目标网络 + 目标主机;网络是被运营商精心设计的;网段划分:分类划分法和子网掩码;为什么要进行网络划分,目的是为了给出子网地址,进行路由查找的功能,先查找子网,再查找目标主机。

运营商的工作是非常重要的。

  • 一个路由器中可以配置多个IP地址(至少两个以上),一个是WAN口IP,连接外部地址,一个是LAN口IP;我们在进行路由器的消息转发的时候,由于内网IP不能出现公网中,我们的报文在路由器中进行转发的时候,需要使用WAN口IP来替换报文中的源IP地址。
  • 路由器的LAN口连接的主机都从属于当前这个路由器的子网中
  • 不同的路由器中,子网IP地址其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP地址就可以进行重复
  • 每一个家用路由器,其实又作为了运营商路由器的子网的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器的WAN口IP就是一个公网IP
  • 子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成为WAN口IP地址),这样进行逐级替换,最终数据报中的IP地址成为一个公网IP地址,这种技术就称为NAT(网络地址转换)
  • 如果希望我们自己实现的服务器程序能够在公网上被访问,就需要把程序部署到一条具有外网IP地址的服务器上,这样的服务器可以在阿里云/腾讯云上进行购买

3.3 路由

基本概念:在复杂的网络结构中,找出一条通往终点的路线。

例子一:

       我们可以来举个例子,在最近《黑神话-悟空》比较火热,拿唐僧去西天取西经,唐僧在去往西天的途中,会经过不同的地方,每到一个地方都需要询问去西天怎么走,他的这个路由就是一跳一跳的问路的过程,所谓的这一跳就是数据链路层中的一个区间,具体在以太网中指的是从源MAC地址到目的MAC地址之间的帧传输区间。

       但是这里我们还没有学习MAC帧的概念,这里需要注意的是在数据链路层中每经过一个区间,我们都需要将源MAC地址和目的MAC地址进行改变。要区别IP和MAC帧

IP数据报的传输过程和这个问路相似:

  • 当IP数据报到达路由器时,路由器会先查看目的IP
  • 路由器决定将这个数据报是能直接发送给目标主机的,还是需要发送给下一个路由器
  • 依次反复,一直到达目标IP地址

       那么如何判断当前这个数据报应该发送到哪里呢??这个就依靠每一个节点内部维护一个路由表

例子二:

  • 路由表可以使用route命令查看
  • 如果目的IP命中了路由表,就直接转发即可
  • 路由表中的最后一行,主要由下一跳地址和发送接口两个部分组成,当目的地址与路由表中其他行都不匹配时,就按路由条目规定的接口发送到下一跳地址。

假设某主机上的网络接口配置和路由表如下:

四、报文分片

4.1 在接收方的角度来看待分片

我们在网络中会收到大量的IP报文,多个客户端发送的IP报文,有的报文分片了,有的报文没有分片。

4.1.1 如何确定该报文是否分片

报文没有进行分片:

       我们可以根据报文中的标志位来判断该报文是否分片了,更多分片 == 0 并且 片偏移 == 0

报文进行分片:

       当报文进行分片的话,报文一共有三种情况:第一片,中间片,最后一片。每一个报文分片都有一个标识,该标识是一样的。

  • 第一片:更多分片 == 1 并且 片偏移 == 0
  • 中间片:更多分片 == 1 并且 片偏移 != 0
  • 最后一片:更多分片 == 0 并且 片偏移 != 0

4.1.2 保证收到所有的分片

       我们可以根据片偏移来进行组装分片,因为片偏移是升序排序的。

4.1.3 分片进行组装交付

4.2 在发送方的角度来看待分片

       我们在进行分片的时候,不能简简单单地直接将报文直接进行分片,因为IP报文即使进行了分片,这个IP报文还是IP报文,所以这个IP报文还是要带上其报头。在进行计算分片报文的大小还是要加上报文的大小。

相关文章:

【Linux】网络层协议——IP

一、IP协议 在前面,我们学习了应用层和传输层,接下来,我们来学习网络层,网络层的主要功能是在复杂的网络环境中确定一个合适的路由。 1.1 IP协议的基本概念 主机:配有IP地址,有可以进行路由控制的设备路由…...

【Echarts】vue3打开echarts的正确方式

ECharts 是一个功能强大、灵活易用的数据可视化工具,适用于商业报表、数据分析、科研教育等多种场景。那么该如何优雅的使用Echarts呢? 这里以vue3为例。 安装echarts pnpm i echarts封装公用方法 // ts-nocheck import * as echarts from echarts; // 我们这里借…...

一些学习three的小记录

这篇主要用来记录我学习3d渲染相关的疑问记录,后续会持续的更新,如果我的理解不对欢迎评论区更正。 目录 1.WebGLRenderer和WebGPURenderer的区别 1.1 WebGLRenderer 1.2 WebGPURenderer 二、scene.background和renderer.setClearColor有什么区别 三、renderer.setAnimat…...

Porcupine - 语音关键词唤醒引擎

文章目录 一、关于 Porcupine特点用例尝试一下 语言支持性能 二、Demo1、Python Demo2、iOS DemoBackgroundService DemoForegroundApp Demo 3、网页 Demo3.1 Vanilla JavaScript 和 HTML3.2 Vue Demos 三、SDK - Python 一、关于 Porcupine Porcupine 是一个高度准确和轻量级…...

Golang | Leetcode Golang题解之第409题最长回文串

题目&#xff1a; 题解&#xff1a; func longestPalindrome(s string) int {mp : map[byte]int{}for i : 0; i < len(s); i {mp[s[i]]}res : 0for _, v : range mp {if v&1 1 {res v - 1} else {res v}}if res<len(s) {res}return res }...

【C++】STL数据结构最全函数详解2-向量vector

关于STL&#xff0c;我们之前浅浅提过&#xff1a;这里 另外对于栈&#xff0c;这里有更加详尽的介绍&#xff1a;CSTL常用数据结构1详解---栈&#xff08;stack&#xff09;-CSDN博客 这个系列将会更加深入地从函数原型开始用详细的例子解释用法 首先这一篇介绍的是一个非常…...

阿里云 Quick BI使用介绍

Quick BI使用介绍 文章目录 阿里云 Quick BI使用介绍1. 创建自己的quick bi服务器2. 新建数据源3. 上传文件和 使用4. 开始分析 -选仪表盘5. 提供的图表6. 一个图表的设置使用小结 阿里云 Quick BI使用介绍 Quick BI是一款全场景数据消费式的BI平台&#xff0c;秉承全场景消费…...

LLMs之SuperPrompt:SuperPrompt的简介、使用方法、案例应用之详细攻略

LLMs之SuperPrompt&#xff1a;SuperPrompt的简介、使用方法、案例应用之详细攻略 目录 SuperPrompt的简介 SuperPrompt的使用方法 1、prompt SuperPrompt的案例应用 SuperPrompt的简介 SuperPrompt项目是一个开源项目&#xff0c;旨在通过设计特定的提示词来帮助我们更好…...

Java中的Web服务开发:RESTful API的最佳实践

Java中的Web服务开发&#xff1a;RESTful API的最佳实践 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代Web应用开发中&#xff0c;RESTful API是构建可伸缩、易于维护的Web服务的关键。…...

Linux创建虚拟磁盘并分区格式化

快速创建一个虚拟磁盘 你可以通过以下步骤在Linux上虚拟一个磁盘&#xff0c;并将其挂载到 /mnt/ 目录下&#xff1a; 步骤 1: 创建一个虚拟磁盘文件 使用 dd 命令创建一个虚拟磁盘文件&#xff08;例如大小为1GB&#xff09;&#xff1a; dd if/dev/zero of/root/virtual_…...

面试经典150题——最后一个单词的长度

目录 题目链接&#xff1a;58. 最后一个单词的长度 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;反向遍历 Java写法&#xff1a; C写法&#xff1a; 解法二&#xff1a;逆天解法 思路 存在的问题 总结 题目链接&…...

【C++】入门基础(上)

Hi&#xff0c;好久不见&#xff01; 目录 1、C入门小基础 1.1 祖师爷--Bjarne Stroustrup&#xff08;本贾尼斯特劳斯特卢普&#xff09; 1.2 C参考文献 1.3 书籍推荐 2、C的第一个程序 3、命名空间 3.1 namespace的价值 3.2 namespace的定义 3.3 命名空间的使…...

Mac中Twig模版安装与SSTI漏洞学习

感谢大佬的文章参考学习。 SSTI&#xff1a;https://www.cnblogs.com/bmjoker/p/13508538.html Homebrew&#xff1a;快速开始 - Homebrew 中文网 Homebrew安装 一键快捷安装&#xff1a;默认使用中科大的源 /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homeb…...

【20.5 python中的FastAPI】

python中的FastAPI FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;基于 Python 3.6 的类型提示。它利用了 Python 3.7 的新特性&#xff0c;如类型提示&#xff08;Type Hints&#xff09;&#xff0c;来自动生成 A…...

研1日记13

正态分布&#xff1a; toTenor&#xff1a;转数字变为0-1 加载模型&#xff1a; model youmodel() model.load("路径") 测试单个样本&#xff1a;...

Go语言错误处理详解

Go语言以其简洁、高效和并发能力著称。在实际开发中&#xff0c;错误处理是一个不可避免且至关重要的部分。本文将深入探讨Go语言中的错误处理机制&#xff0c;涵盖其原理、使用方法、最佳实践&#xff0c;并提供丰富的代码示例和中文注释。 一、错误处理的基本概念 在Go语言…...

C++基础知识7 list

list 1. list的介绍及使用1.1 list的介绍1.2 list的使用1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity1.2.4 list element access1.2.5 list modifiers1.2.6 list的迭代器失效 2.1 模拟实现list 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 l…...

Android 车联网——汽车模块介绍(附1)

汽车模块指的是车辆中独立的电子控制单元(ECUs),如发动机控制单元(ECU)、车身控制模块(BCM)等,它们负责特定的功能或系统。 一、控制类模块 这些模块主要用于控制车辆的不同系统,确保车辆各部分的正常运行。 1、ECM ECM(Electronic Control Module,电子控制模块)…...

Windows下SDL2创建最简单的一个窗口

先看运行效果 再上代码&#xff1a; #include <stdio.h> #include "SDL.h"int main(int argc, char* argv[]) {// 初始化SDL视频子系统if (SDL_Init(SDL_INIT_VIDEO) -1){printf("Error: %s\n", SDL_GetError());return -1;} // 创建一个窗口SDL_…...

C++ | Leetcode C++题解之第406题根据身高重建队列

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort(people.begin(), people.end(), [](const vector<int>& u, const vector<int>& v) …...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...