【Linux网络编程】网络层 | IP协议 | 网段划分 | 私有IP和公有IP | NAT技术



前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站



在这里插入图片描述

🌈个人主页: 南桥几晴秋
🌈C++专栏: 南桥谈C++
🌈C语言专栏: C语言学习系列
🌈Linux学习专栏: 南桥谈Linux
🌈数据结构学习专栏: 数据结构杂谈
🌈数据库学习专栏: 南桥谈MySQL
🌈Qt学习专栏: 南桥谈Qt
🌈菜鸡代码练习: 练习随想记录
🌈git学习: 南桥谈Git

🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈
本科在读菜鸡一枚,指出问题及时改正


IP协议

IP的意义:IP地址将数据从B主机跨网络可靠的发送给主机C

在这里插入图片描述

这里和传输层联系一下:传输层提供的是策略,网络层提供能力。

IP地址格式:XXX.YYY.ZZZ.AAAip=网络号+主机号

在Linux系统中,可通过ifconfig来查看当前IP地址:(云服务器中查出来的是内网IP)

在这里插入图片描述

IP协议报头格式

在这里插入图片描述

报头和数据如何进行分离?
4 位首部长度: IP 头部的长度是多少个 32bit, 也就是长度 4的字节数. 4bit 表示最大的数字是 15, 因此 IP 头部最大长度是 60 字节。
如果此时IP首部长度就是20字节,4位首部长度应该是5,对应的二进制为0101
在读到一个IP报文时,先无脑读出20个标准长度,然后读出4位首部长度,这4位首部长度-标准长度就是选项,然后再将选项和数据进行分离;如果4位首部长度-标准长度为0,表示没有选项,那么剩下的就是数据。

IP报文如何分用?
8位协议:表示上层协议的类型
IP根据8位协议向上交付。

4位版本:指定 IP 协议的版本, 对于 IPv4 来说, 就是 4

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

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

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

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

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

网段划分

IP地址=网络号+主机号

  • 网络号: 保证相互连接的两个网段具有不同的标识

  • 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号

  • 不同的子网其实就是把网络号相同的主机放到一起

  • 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复

路由器功能:

  1. 路由功能
  2. 构建子网(路由器自己构建的私有IP)

通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的 IP 地址都
不相同。手动管理子网内的 IP, 是一个相当麻烦的事情:有一种技术叫做 DHCP, 能够自动的给子网内新增主机节点分配 IP 地址, 避免了手动管理 IP 的不便。一般的路由器都带有DHCP功能. 因此路由器也可以看做一个 DHCP 服务器。

两种网段划分方式:

  1. 传统划分: 把所有 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 类却浪费了大量地址.

  1. 新的划分方案, 称为 CIDR
    • 引入一个额外的子网掩码来区分网络号和主机号
    • 子网掩码也是一个 32 位的正整数. 通常用一串0 来结尾
    • 将 IP 地址和子网掩码进行 按位与 操作, 得到的结果就是网络号
    • 网络号和主机号的划分与这个 IP 地址是 A 类、 B 类还是 C 类无关
      在这里插入图片描述
      IP 地址和子网掩码还有一种更简洁的表示方法,例如 140.252.20.68/24,表示 IP 地址为140.252.20.68, 子网掩码的高 24 位是 1,也就是 255.255.255.0

上述两种网络划分方式市面上大多数教材都有提到。

为什么需要进行网段划分?

  • IP是一个有用且有限的资源,因此需要经过合理的划分来给不同区域使用。
  • 通过划分好的网段,可以高效支持未来的报文路径查找,大大提高查找目标主机的效率。

特殊的IP地址

  • 将 IP 地址中的主机地址全部设为 0, 就成为了网络号, 代表这个局域网

  • 将 IP 地址中的主机地址全部设为 1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包

  • 127.*的 IP 地址用于 本机环回(loop back)测试,通常是 127.0.0.1

IP 地址的数量限制

IP 地址(IPv4)是一个 4 字节 32 位的正整数. 那么一共只有 2 的 32 次方 个 IP地址, 大概是 43 亿左右. 而 TCP/IP 协议规定, 每个主机都需要有一个 IP 地址由于一些特殊的 IP 地址的存在, 数量远不足 43 亿; 另外 IP 地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个 IP 地址.

CIDR 在一定程度上缓解了 IP 地址不够用的问题(提高了利用率, 减少了浪费, 但是 IP地址的绝对上限并没有增加), 仍然不是很够用。三种解决方案:

  • 动态分配 IP 地址: 只给接入网络的设备分配 IP 地址. 因此同一个 MAC 地址的设备, 每次接入互联网中, 得到的 IP 地址不一定是相同的;
  • NAT 技术
  • IPv6: IPv6 并不是 IPv4 的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6 用 16 字节 128 位来表示一个 IP 地址; 但是目前 IPv6 还没有普及。

私有IP和公有IP

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

  • 10.*,前 8 位是网络号,共 16,777,216 个地址
  • 172.16.* 到 172.31.*,前 12 位是网络号,共 1,048,576 个地址
  • 192.168.*,前 16 位是网络号,共 65,536 个地址

包含在这个范围中的, 都成为私有 IP, 其余的则称为全局 IP(或公网 IP)。

每一个主机都有自己的私有IP,不能出现在公网中,但是私有IP可以重复。虽然 存在公网,但是上网的 时候都必须先接入一个指定的私网(内网)中,一般都是运营商可以接入公网中。

在这里插入图片描述

家用路由器可以配置两个 IP 地址, 一个是 WAN 口 IP, 一个是 LAN 口 IP(子网IP),路由器 LAN 口连接的主机, 都从属于当前这个路由器的子网中,WAN口连接的是运营商。不同的路由器, 子网 IP 其实都是一样的(通常都是 192.168.1.1). 子网内的主机IP 地址不能重复. 但是子网之间的 IP 地址就可以重复了.

运营商路由器称之为出入口路由器,WAN口IP是公网的IP。

因此网络世界=内网+公网构成的。


理解私有IP不能出现在公网上:
以下图为例,主机的源端口为192.168.1.201,目的端口为122.77.241.3,当前主机所处的网络号为192.168.1.0,但是目的端口所处的网络号为122.77.241.0,因此需要通过家用路由器转出去,转到运营商路由器。运营商路由器此时的子网为10.1.1.1,不是目标端口的子网号,因此需要通过运营商路由器转出去,在公网环境转发到服务器中。
在这里插入图片描述

因此,任何一台主机都能知道和自己直连的网络号(子网)是多少
内网中的IP地址是可以重复的,可以变向的提高IP地址使用上限。但是私有IP不能出现在公网上,因此上述通信模式并不能完全正确完成通信

NAT技术

如何完全正确的完成通信?
主机将报文交给家用路由器时,将报文中源IP替换成自己的WAN口IP,这样避免了私有IP出现在公网中。同样的,家用路由器将报文交给运营商服务器时,在运营商服务器中将报文源IP修改成运营商服务器的WAN的IP。最后通过广域网环境交给服务器。

像这种源IP不断转换的工作我们称之为NAT技术,NAT技术只在内网做转换,解决了从内网到公网的问题。
在这里插入图片描述

路由

路由是在一个复杂的网络结构中,找到一条通往终点的路径。

  • 当 IP 数据包, 到达路由器时, 路由器会先查看目的 IP。
  • 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器。当前路由器决定该报文先去下一个路由器的时候,该路由器称之为缺省路由
  • 依次反复, 一直到达目标 IP 地址。

因此路由过程中有两种情况:一是到达目的主机,二是缺省路由。还有一种特殊情况是该路由器连接的是终点的子网,后续需要进行子网内的转发即可。

在Linux中可以通过route指令查看自己的路由表:

在这里插入图片描述
路由表的 Destination 是目的网络地址,Genmask 是子网掩码,Gateway 是下一跳地址,Iface 是发送接口,Flags 中的 U 标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。

假设某路由表配置如下:

在这里插入图片描述

  • 转发过程例 1: 如果要发送的数据包的目的地址是 192.168.56.3

    • 跟第一行的子网掩码做与运算得 到 192.168.56.0,与第一行的目的网络地址不符合
    • 再跟第二行的子网掩码做与运算得 到 192.168.56.0,正是第二行的目的网络地址,因此从 eth1 接口发送出去
    • 由于 192.168.56.0/24 正 是与 eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发
  • 转发过程例 2: 如果要发送的数据包的目的地址是 202.10.1.2

    • 依次和路由表前几项进行对比, 发现都不匹配
    • 按缺省路由条目, 从 eth0 接口发出去, 发往 192.168.10.1 路由器
    • 由 192.168.10.1 路由器根据它的路由表决定下一跳地址

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web基础之什么是HTTP协议

Q:什么是HTTP协议? 概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 特点: 1.基于TCP协议:面向连接,安全 2.基…

小米路由器IPv6 功能使用指南

本文不限于多层路由使用IPv6 的情况,提供解决IPv6 无法获取的更硬核的方法,需要有ssh 工具。(无安卓设备,测试环境win、mac、ios) 首先明确一点,就是如果想让你的设备得到GUA 地址,即访问 6.i…

element plus 使用 upload 组件达到上传数量限制时隐藏上传按钮

最近在重构项目,使用了 element plus UI框架,有个功能是实现图片上传,且限制只能上传一张图片,结果,发现,可以限制只上传一张图片,但是上传按钮还在,如图: 解决办法&…

汽车基础软件AutoSAR自学攻略(三)-AutoSAR CP分层架构(2)

汽车基础软件AutoSAR自学攻略(三)-AutoSAR CP分层架构(2) 下面我们继续来介绍AutoSAR CP分层架构,下面的文字和图来自AutoSAR官网目前最新的标准R24-11的分层架构手册。该手册详细讲解了AutoSAR分层架构的设计,下面让我们来一起学习一下。 Introductio…

MBTiles 爬取,读取,数据转换,发布

MBTiles :https://github.com/mapbox/mbtiles-spec/blob/master/1.3/spec.md 1.MBTiles是什么 MBTiles是一个在SQLite 数据库存储瓦片地图数据的标准,该标准的目的是即时传输和使用数据。 作为一个容器格式,MBTiles可以存储任何瓦片数据,…

机器学习笔记合集

大家好,这里是好评笔记,公主 号:Goodnote。本笔记的任务是解读机器学习实践/面试过程中可能会用到的知识点,内容通俗易懂,入门、实习和校招轻松搞定。 笔记介绍 本笔记的任务是解读机器学习实践/面试过程中可能会用到…

java_将数据存入elasticsearch进行高效搜索

使用技术简介: (1) 使用Nginx实现反向代理,使前端可以调用多个微服务 (2) 使用nacos将多个服务管理关联起来 (3) 将数据存入elasticsearch进行高效搜索 (4) 使用消息队列rabbitmq进行消息的传递 (5) 使用 openfeign 进行多个服务之间的api调用 参…

Gitlab-Runner配置

原理 Gitlab-Runner是一个非常强大的CI/CD工具。它可以帮助我们自动化执行各种任务,如构建、测试和部署等。Gitlab-Runner和Gitlab通过API通信,接收作业并提交到执行队列,Gitlab-Runner从队列中获取作业,并允许在不同环境下进行作…

SpringBoot项目实战(41)--Beetl网页使用自定义函数获取新闻列表

在Beetl页面中可以使用自定义的函数从后台新闻列表中获取新闻数据展示到页面上。例如我们可以从后台新闻表中获取新闻按照下面的格式展示&#xff1a; <li><a href"#">东亚非遗展即将盛妆亮相 揭起盖头先睹为快</a></li><li><a hre…

LayaAir3.2来了:性能大幅提升、一键发布安装包、支持WebGPU、3D导航寻路、升级为真正的全平台引擎

前言 LayaAir3的每一个分支版本都是一次较大的提升&#xff0c;在3.1彻底完善了引擎生态结构之后&#xff0c;本次的3.2会重点完善全平台发布相关的种种能力&#xff0c;例如&#xff0c;除原有的安卓与iOS系统外&#xff0c;还支持Windows系统、Linux系统、鸿蒙Next系统&#…

【力扣热题100】—— Day18.将有序数组转换为二叉搜索树

期末考试完毕&#xff0c;假期学习开始&#xff01; —— 25.1.7 108. 将有序数组转换为二叉搜索树 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵平衡二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] …

C++ Qt练习项目 QChar功能测试

个人学习笔记 代码仓库 GitCode - 全球开发者的开源社区,开源代码托管平台 新建项目 设计UI 1、拖入group box去掉名字 2、拖入2个LineEdit 3、拖入两个Label 4、拖入两个PushButton 5、点栅格布局 1、拖入GroupBox 2、拖入4个PushButton 3、点栅格布局 1、拖入GroupBo…

保证Mysql数据库到ES的数据一致性的解决方案

文章目录 1.业务场景介绍1.1 需求分析1.2 技术实现方案 2.业界常用数据一致性方案分析2.1 同步双写方案2.2 MQ异步双写方案2.3 扫表定期同步方案2.4 监听binlog同步方案 1.业务场景介绍 1.1 需求分析 某知名的在线旅游平台&#xff0c;在即将到来的春季促销活动之前&#xff…

初学stm32 --- DAC模数转换器工作原理

目录 什么是DAC&#xff1f; DAC的特性参数 STM32各系列DAC的主要特性 DAC框图简介&#xff08;F1/F4/F7&#xff09; 参考电压/模拟部分电压 触发源 关闭触发时(TEN0)的转换时序图 DMA请求 DAC输出电压 什么是DAC&#xff1f; DAC&#xff0c;全称&#xff1a;Digital…

《HTTP协议与内外网划分:网络世界的基石知识》

http协议与内外网的划分 http协议的简介 HTTP&#xff08;超文本传输协议&#xff09;是互联网上应用最广泛的一种网络协议&#xff0c;用于从服务器传输超文本&#xff08;如HTML&#xff09;到本地浏览器的传输协议。以下是关于HTTP协议的简介&#xff1a; HTTP协议的基本…

二叉树层序遍历 Leetcode102.二叉树的层序遍历

二叉树的层序遍历相当于图论的广度优先搜索&#xff0c;用队列来实现 &#xff08;二叉树的递归遍历相当于图论的深度优先搜索&#xff09; 102.二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右…

特制一个自己的UI库,只用CSS、图标、emoji图 第二版

图&#xff1a; 代码&#xff1a; index.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>M…

12工具篇(D3_Lombok)

目录 一、基本介绍 二、Lombok使用说明 1. 基本介绍 2. 安装插件 IDEA在线安装Lombok插件 IDEA离线安装Lombok插件 3. 引入依赖坐标 4. Lombok注解功能说明 NonNull Getter&Setter Cleanup ToString EqualsAndHashCode Constructor RequiredArgsConstructor …

STM32如何测量运行的时钟频率

前言 环境&#xff1a; 芯片&#xff1a;STM32F103C8T6 Keil&#xff1a;V5.24.2.0 一、简介STM32F103C8T6的时钟源 ①HSI 内部高速时钟,RC振荡器&#xff0c;频率为8MHz&#xff0c;精度不高。②HSE 外部高速时钟,可接石英/陶瓷谐振器&#xff0c;频率范围为4MHz~16MHz&…

【物流管理系统 - IDEAJavaSwingMySQL】基于Java实现的物流管理系统导入IDEA教程

有问题请留言或私信 步骤 下载项目源码&#xff1a;项目源码 解压项目源码到本地 打开IDEA 左上角&#xff1a;文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件&#xff0c;点击确定&#xff0c;根据图示步骤继续导入项目 查看项目目录&#xff…