『 Linux 』网络层 - IP协议 (二)

文章目录

    • 路由
    • NAT技术
    • 分片与组装
      • 分片的组装
      • IP协议分片的短板


路由

通常情况路由器具备了一个非常重要的功能,即构建子网;

同时路由器需要实现跨网络通信,说明路由器必须存在两个或以上的IP地址,通常在路由器中可以看到几个接口,分别是一个WAN口和几个LAN口;

WAN口IP被称为公网IP,LAN口IP被称为私网IP;

其中WAN口对应的IP地址是作为上一层子网,如运营商子网中的其中一个子网IP,而通常一个LAN口则代表一个子网,对于LAN口IP而言,该IP将作为该子网中的第一台设备IP;

或者在一些情况下,多个LAN口可以共享同一个子网;

通常路由器在自己作为子网的第一台设备时对应的LAN口IP将作为该子网的网关IP,即子网内所有设备访问其他网络时的第一道"门";

而路由的过程实际上就是以一跳一跳(Hop by Hop)的方式,在复杂的网络结构中找出一条通往终点的路线;

所谓"一跳"就是数据链路层中的一个区间,具体在以太网中指源MAC地址到目的MAC地址之间的帧传输区间;

在网络中的主机中,无论是电脑还是路由器设备,都有路由功能,同时也都内置了一个路由表;

其中路由表的字段如下:

  • Destination

    表示网络或主机的目标地址;

    路由器查看数据包的目的IP地址并与路由表中的Destination字段进行匹配以决定数据包应当发送到哪里;

    这个字段可以是特定的网络地址或主机地址,或是以标示默认路由的0.0.0.0(代表任何地址)或是default;

  • Geteway

    表示下一跳(Next hop)的IP地址;

    在某些配置中,当目标网络是直接连接的,网关字段可能显示geteway或是IP0.0.0.0,代表数据包直接通过制定接口发出而不需要通过中间网关;

    这是路由器发送数据包到下一个网络所应通过的设备或接口的IP地址;

    如果目标是直接连接的,那么它可以是路由器自己的接口IP地址;

  • Genmask(子网掩码)

    子网掩码定义了Destination字段中网络的范围,确定了哪些IP地址属于同一个网络;

    例如255.255.255.0表示该网络中有256个IP地址(/24),所有以相同前三个八位组开始的IP地址属于这个网络;

  • Flags(标志)

    U表示接口是活跃的;

    G表示数据包需要通过另一个路由器(网关)来到达目的地;

    H表示条目是针对特定主机而不是网络的;

    D表示通过路由协议动态学习到的条目;

    M表示被修改的路由条目,特别是在重新计算路由表时;

    !表示拒绝路由到特定地址或网络;

  • Metric(度量)

    表示到达目标网络的成本或举例,可以基于跳数(hop count),宽带,延迟等因素;

    较低的度量值通常表示更优的路径;

    在选择到某个目的地的路由时,路由器会选择度量值最低的路径;

  • Ref(引用)

    这个字段通常表示当前活跃连接或进程数目引用了这条路由;

    很少被直接显示,但如果有,它可以视为一种诊断工具;

  • Use(使用)

    指示通过这条路由路径传输的数据包数量;

    这是一个统计数据,表示使用该路由的频率;

  • Iface(接口)

    指示这条路由使用的出口接口,即数据包将通过哪个物理或逻辑接口发送出去;

    通常是一个网络接口名,如eth0,wlan0,Interface 1等;

在Windows中可以在命令行中通过route print命令查看对应的路由表;

在Linux中可以使用route命令来查看路由表;

当一个数据包到来时,主机会对数据包进行解包并查看IP报头中的目的IP地址,并通过目的IP地址与Genmask子网掩码进行&按位与操作,通过按位与后的结果与该行条目中的Destination字段进行匹配,如果结果与该字段不匹配则继续计算下一行条目,若是匹配则将该报文重新封装并向Destination所指向的IP进行下一跳;

如果路由表中所有的Destination字段都不匹配则通过0.0.0.0或是default以默认网关进行下一跳;

通过这种跳一跳的方式将一个IP数据包由源IP发送到目标IP;


NAT技术

网络地址转换(Network Address Translation,NAT)是一种用于在网络中重写源IP地址或目的IP地址的技术,通常在网络边缘设备如路由器上进行实现;

最初设计用于缓解IPv4地址耗尽的问题;

在使用NAT技术时IP报文报头中的源IP地址与目的IP地址将会在到达一个路由器时进行重写;

以该图为例;

当路由器同时充当为NAT设备时将会对IP报文的报头内的源IP和目的IP进行更改;

通常分为两种情况:

  • 报文的发送
  • 报文的回程

路由器启用NAT功能时,对应的NAT功能都将生成一个属于自己的表,即NAT表或是连接表;

通常报文的发送时报文每经过一个路由器上的NAT功能时路由器将会将IP报文中的源IP修改为该路由器的公网IP,并记录源私网IP和新公网IP和端口的映射关系;

NAT表的记录主要是方便对端在进行报文返程的时候可以通过NAT表中的映射关系使得报文能够正确返回源发送端;

当报文进行返程时进入第一个路由器的NAT功能时将查询NAT表中的映射关系并将目的IP修改为改路由器对应的私网IP,最终将报文交回原发送端;


分片与组装

在网络协议栈中,在网络层中的数据,如IP数据包并不是直接通过网络层发出,而是一样的贯穿协议栈将数据包交给下一层协议,这一层即为数据链路层;

而通常情况下,数据链路层所发生的数据帧不能太大,如果数据帧太大则可能会加重数据在网络中的存活时间从而与网络中的其他数据产生碰撞;

当网络健康状态差的时候,数据链路层将进行一些碰撞避免相关的策略从而减少数据碰撞的发生;

由此看出,数据帧只要过大都会直接或者间接影响到网络的健康状态;

所以为了避免这些问题的发生,通常由网络层交付给数据链路层的数据报都不能太大;

当网络层IP协议将要把一个较大的IP报文交付给下层时,IP需要对该报文进行分片操作;

  • “谁分片,谁组装”

分片操作由IP协议提供,对应的组装操作也将是由IP协议提供,即网络层;

在IP报文的内容中存在几个对应的字段用于分片与组装操作;

  • 16位标识

    这个标识通常用来标示不同的IP报文;

    通常情况下每个IP数据包的16位标识是不同的,但相同IP数据包的几个不同分片其对应的该字段是相同的;

    同一个IP数据包的不同分片在抵达对端后需要对IP数据包的分片进行组装;

    但组装的前提是将几个分片进行聚拢,通过相同的该字段可以使得同一个IP数据包的不同分片能够聚在一起从而进行下一步的组装;

  • 3位标志

    这个标志包含以下几个子字段:

    • 第一位

      第一位通常是未使用的,暂未赋予该字段的意义;

    • 第二位

      DF(Don’t Fragment) - 不分片标志;

      如果这个位被设置为1则路由器不能分片这个数据包,如果数据包的大小超过了某个链路的MTU(最大传输单元),这个数据包将会被丢弃,并返回一个ICMP错误消息给发送方;

    • 第三位

      MF(More Fragments) - 更多分片标志;

      当一个IP数据包被分片后,除了最后一个分片外,所有分片的这个位置都会被设置为1,表示还有其他分片,以及该分片并不是最后一个分片;

      最后一个分片的该字段将被设为0,表示这是最后一个片段;

  • 13位片偏移

    这个字段是13位长度的,表示当前分片在原始数据包中的相对位置;

    具体来说,它表示该分片相对于原始数据包开始处的字节偏移,以8byte位单位(即偏移量 = 片偏移字段*8);

    这种设计是因为IP分片的大小必须是8byte的整数倍,所以此偏移量可以更节省空间的表示出整个数据包中的字节位置;

假设IP需要发送4500 byte大小的数据,但由于该数据超过了数据链路层限制的大小,对应的IP协议需要对该数据包进行分片;

对应的分片结构如下:

以该图为例,在进行分片时,IP数据包的第一个分片将保留IP报头进行分片,对应的第一个分片的三位标志为001表示这个数据包可以被分片,且该分片并不是最后一个分片,片偏移为0表示该分片为数据包分片中的第一个分片;

其次后续的分片需要为分片后的数据增加报头,所以在进行分片时需要保留对应的报头大小;

因为在数据链路层中不关心上层的数据与报头的分隔,数据链路层协议将会把上层所发的所有内容,无论报头报文都当做自己的有效载荷进行封装;

最后一个分片的三位标志为000,且片偏移不为0,因此该分片表示分片中的最后一个分片;


分片的组装

对端在接受到IP数据包的分片后需要对分片进行组装;

首先组装前需要判断所接收到的IP数据包是否为完整的数据包还是IP数据包中的分片;

通常需要判断这几个条件:

  • 接收到的几个数据包16位标识字段是否一致

    若是接收方接收到了几个IP数据包所对应的16位标识字段相同,则判断该数据包可能为分片;

    并且将多个该字段相同的数据包聚集在一起存放;

  • 3位标志字段情况是否允许被分片以及是否有更多分片标识

    该字段用来判断所接收到的IP数据包是否是被允许分片的;

    若是判断该字段为允许被分片则该IP数据包可能为分片中的其中一个;

    同时若是该字段允许被分片且该字段的最后一个子字段被标识为1,则表示该IP数据包为分片中的其中一个;

  • 片偏移字段是否为0

    若是片偏移字段不为0则表示该IP数据包一定为分片中的其中一个;

这几个条件在组装过程中缺一不可;

通常需要判断四种情况:

  • 不为分片

    当接收方接收到的几个IP数据包中其16位标识字段是唯一,且该IP数据包的3位标志中被设置了不可分片标识则表示该数据包不为分片;

    或者所接收到的IP数据包16位标识字段唯一且3位标志位中更多分片字段设为0,同时片偏移量也为0同样表示该IP数据包不为分片;

  • 第一个分片

    当所接收的IP数据包的3位标志中更多分片为1,同时片偏移为0时则表示该IP数据包为相同16位标识字段IP数据包分片中的第一个分片;

  • 中间分片

    当所接收到的IP数据包中的3位标志中更多分片被设置为1且片偏移不为0则表示该IP数据包为相同16位标识字段IP数据包分片中的中间分片;

  • 最后一个分片

    当所接收到的IP数据包中3位标志中更多分片被设置为0,且片偏移不为0则表示该IP数据包为相同16位标识字段IP数据包分片中的最后一个分片;

在分片的聚合过后根据片偏移来对数据进行排序,随后去掉分片中的IP报头对数据进行组装;


IP协议分片的短板

通常情况下在网络协议栈中是不太支持IP协议对数据进行分片的;

主要的原因是IP协议若是对一个IP数据包进行分片后交由数据链路层进行传输,若是分片在传输过程中出现丢失问题则将要把该IP数据包的所有分片,即整个完整的IP数据包进行重新传输;

这样会延长数据在网络中的存活时间,对应的一个IP数据包的传输时间将变得更长,可能更加影响网络中其他主机的网络通信;

因此为了避免IP层因分片导致的各种问题,经常需要避免IP进行分片,为了避免IP分片,上层协议,如TCP协议才指定了一些列的策略,如流量控制,滑动窗口,慢启动等;

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

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

相关文章

深度学习实战图像缺陷修复

这里写目录标题 概述1. 图像缺陷修复的研究背景2. 传统图像缺陷修复方法的局限性(1) 基于纹理合成的方法(2) 基于偏微分方程(PDE)的方法 3. 深度学习在图像缺陷修复中的兴起(1) 深度学习的基本思路(2) 深度学习方法的优势(3) 关键技术的引入 4. 深度学习…

vue从入门到精通(七):事件处理

1,事件的基本使用 1.使用v-on:xxx或 xxx 绑定事件,其中xxx是事件名2.事件的回调需要配置在methods对象中,最终会在vm上3.methods中配置的所数,不要用箭头函数!否则this就不是vm了4.methods中配置的函数,都是被Vue所管…

如何在 .gitignore 中仅保留特定文件:以忽略文件夹中的所有文件为例

在日常的开发工作中,使用 Git 来管理项目是不可或缺的一部分。项目中的某些文件夹可能包含大量的临时文件、生成文件或不需要版本控制的文件。在这种情况下,我们通常会使用 .gitignore 文件来忽略这些文件夹。然而,有时我们可能希望在忽略整个…

【SQL实验】索引操作(菜单操作和命令操作)

【代码是自己的解答,并非标准答案,也有可能写错,文中可能会有不准确或待完善之处,恳请各位读者不吝批评指正,共同促进学习交流】 文件”成绩管理”导入【具体操作前几篇文章详细展示过来,这里跳过。还是不太…

MVC 模型:架构与原理

MVC 模型:架构与原理 MVC(Model-View-Controller)模型是一种广泛应用于软件工程的架构模式,主要用于分离应用程序的逻辑层,以提高其可维护性和可扩展性。MVC模型将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。本文将深入探讨MVC模型的…

[pdf,epub]162页《分析模式》漫谈合集01-35提供下载

《分析模式》漫谈合集01-35的pdf、epub文件,已上传至本号的CSDN资源。 如果CSDN资源下载有问题,可到umlchina.com/url/ap.html。 已排版成适合手机阅读,pdf的排版更好一些。 ★UMLChina为什么叒要翻译《分析模式》? ★[缝合故事…

【Linux学习】【Ubuntu入门】1-7 ubuntu下磁盘管理

1.准备一个U盘或者SD卡(插上读卡器),将U盘插入主机电脑,右键点击属性,查看U盘的文件系统确保是FAT32格式 2.右键单击ubuntu右下角图标,将U盘与虚拟机连接 参考链接 3. Ubuntu磁盘文件:/dev/s…

Leetcode152. 乘积最大子数组(HOT100)

链接 代码&#xff1a; class Solution { public:int maxProduct(vector<int>& nums) {int f nums[0],g nums[0];int res nums[0];for(int i 1;i<nums.size();i){//int i 1 not int i 0 ,因为我们已经初始化好了首元素作为子数组的最大值和最小值int a n…

移远通信推出全新5G RedCap模组RG255AA系列,以更高性价比加速5G轻量化大规模商用

11月20&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;正式推出其全新5G RedCap模组RG255AA系列。该系列模组支持5G NR独立组网&#xff08;SA&#xff09;和LTE Cat 4双模通信&#xff0c;具有高性能高集成度、低功耗、小尺寸、高性价比等优势&#…

【CVE-2024-9413】SCP-Firmware漏洞:安全通告

安全之安全(security)博客目录导读 目录 一、概述 二、修订历史 三、CVE根因分析 四、问题修复解决 一、概述 在SCP固件中发现了一个漏洞,如果利用该漏洞,可能会允许应用处理器(AP)在系统控制处理器(SCP)固件中导致缓冲区溢出。 CVE IDCVE-2024-9413受影响的产品SC…

数据集-目标检测系列- 花卉 玫瑰 检测数据集 rose >> DataBall

数据集-目标检测系列- 花卉 玫瑰 检测数据集 rose >> DataBall DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 贵在坚持&#xff01; 数据样例项目地址&#xff1a; * 相关项目 1&#xff09;数据集可视化项…

详解Qt QTimeZone 时区类

文章目录 QTimeZone 详解前言什么是 QTimeZone&#xff1f;QTimeZone 的构造函数和常用成员函数构造函数1. 默认构造函数2. 指定时区 ID 构造函数3. 根据 UTC 偏移量构造 常用成员函数1. 获取时区 IDid 2. 检查时区是否有效isValid 3. 获取 UTC 偏移量offsetFromUtc 4. 检查是否…

Linux应用编程(C语言编译过程)

目录 1. 举例 2.预处理 2.1 预处理命令 2.2 .i文件内容解读 3.编译 4.汇编 5.链接 5.1 链接方式 5.1.1 静态链接 5.1.2 动态链接 5.1.3 混合链接 1. 举例 Linux的C语言开发&#xff0c;一般选择GCC工具链进行编译&#xff0c;通过下面的例子来演示GCC如何使用&#…

GitHub 开源项目 Puter :云端互联操作系统

每天面对着各种云盘和在线应用&#xff0c;我们常常会遇到这样的困扰。 文件分散在不同平台很难统一管理&#xff0c;付费订阅的软件越来越多&#xff0c;更不用说那些烦人的存储空间限制了。 最近在 GitHub 上发现的一个开源项目 Puter 彻底改变了我的在线办公方式。 让人惊…

Python 使用 OpenCV 将 MP4 转换为 GIF图

以下是使用 Python 和 OpenCV 将 MP4 转换为 GIF 的示例代码&#xff1a; python import cv2 import imageiodef mp4_to_gif(mp4_path, gif_path, fps10, start_timeNone, end_timeNone):"""将MP4视频转换为GIF动图。:param mp4_path: 输入MP4视频的路径。:pa…

el-table的树形结构后端返回的id没有唯一键怎么办

前端自己生成唯一键 首先尝试了表格的几个字段用-拼接成唯一键 但是仍报错 只好自己利用uuid库生成&#xff1b;

【Linux】缓冲区/磁盘inode/动静态库

目录 一、缓冲区 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;刷新策略 &#xff08;三&#xff09;仿写FILE &#xff08;四&#xff09;内核缓冲区 二、磁盘 &#xff08;一&#xff09;磁盘的存储 &#xff08;二&#xff09;磁盘的抽象存储结构 &am…

SpringBoot(9)-Dubbo+Zookeeper

目录 一、了解分布式系统 二、RPC 三、Dubbo 四、SpringBootDubboZookeeper 4.1 框架搭建 4.2 实现RPC 一、了解分布式系统 分布式系统&#xff1a;由一组通过网络进行通信&#xff0c;为了完成共同的任务而协调工作的计算机节点组成的系统 二、RPC RPC&#xff1a;远程…

【Github】如何使用Git将本地项目上传到Github

【Github】如何使用Git将本地项目上传到Github 写在最前面1. 注册Github账号2. 安装Git工具配置用户名和邮箱仅为当前项目配置&#xff08;可选&#xff09; 3. 创建Github仓库4. 获取仓库地址5. 本地操作&#xff08;1&#xff09;进入项目文件夹&#xff08;2&#xff09;克隆…

Spring:Spring整合Mybatis开发之纯Mybatis开发

目前我们已经对Spring有一个简单的认识了&#xff1a; Spring有一个容器&#xff0c;叫做IoC容器&#xff0c;里面保存bean。 在进行企业级开发的时候&#xff0c;其实除了将自己写的类让Spring管理之外&#xff0c;还有一部分重要的工作就是使用第三方的技术。前面已经讲了如何…