跨网络传输的大致过程+图解(软件虚拟层),ip地址介绍,ip地址和mac地址对比

目录

跨网络传输

引入​​​​​​​

举例 -- 唐僧西天取经

结论

介绍

ip地址

引入

介绍

类型

公有ip

私有ip

版本 

ipv4

ipv6

ip地址和mac地址的唯一性问题

数据包转发的过程

引入

思考 -- 如何跨子网

过程

图解

封装和解包

去掉差异

ip地址/协议的重要性

注意 

ip vs mac


跨网络传输

引入​​​​​​​

举例 -- 唐僧西天取经

唐僧要从长安到西天,他无法直接到达,只能一步一步走向目的地,他途中会经历很多国家

类似于下图这样:

而跨网络传输大致流程也是这样

  • 数据无法直接传输给对方主机,必须经过不同设备(也就是中转站,相当于唐僧每次落脚的国家)的转发

他每次到达一个地方,都要说一句经典台词 -- 我从东土大唐而来,前往西天取经

为什么要说这句话?

  • 一是为了说明自己的来历
  • 二是需要根据最终目的地来确定下一站 (每当要动身离开某地时,都要根据"西天"来确定自己的下一站)
  • 那么,网络通信中,肯定也会有类似的设计 -- 需要一个最终地址来确定自己传输的方向

结论

所以,这里有两个地址是关键

  • 一个不变的地址(最开始从哪来,最终要到哪去) -- ip地址
  • 一个随着当前位置变化而变化的地址(上一站从哪来,下一站到哪去) -- mac地址(熟悉吗,就是在局域网通信中用到的那个)
  • 地址变化的依据 -- 最终目的地
  • 正是因为唐僧心里有这两个地址,最终他成功到达西天,所以网络传输只要有ip地址和mac地址,也可以成功将数据传输给正确的主机

具体怎么使用,将会在数据包的转发过程里介绍

总之,这个例子是为了让我们简单地描摹出跨网络传输的过程

介绍

指在不同网络之间传递数据或信息的过程

数据在网络之间传输时需要经过路由器

  • 路由器是网络设备,负责决定数据包在网络中的最佳路径,并进行转发
  • 它级联了左右两个子网(局域网),帮助数据跨越不同的网络边界

ip地址

引入

我们再次明确一下,为什么会有ip地址?

  • ip地址是ip协议定义出来的,而ip协议在网络层,是用来解决主机定位的问题
  • 类比唐僧取经: ip地址相当于某地的地址,它的存在是为了进行路径选择 (如果没有目的地的话,所谓路径又从何而来呢)
  • ip地址也像是我们每个人定下的目标,为了某个目标,我们是有规划地去完成的
  • 比如:你想要找到工作,就得去学习知识,做项目,投简历,去面试等等,这都是通往"找到工作"这个目标的道路上必要的结点

介绍

ip地址是在互联网协议(IP协议)中用于唯一标识和定位网络上设备的数值标签

  • 它允许网络中的计算机、服务器、路由器等设备进行通信,并确保数据能够正确地从一个设备传输到另一个设备

  • 有两个主要版本的ip地址:ipv4(主流使用)和ipv6

类型

公有ip
  • 全球范围内唯一标识一个设备的地址,用于在互联网上进行直接通信
  • 由互联网服务提供商分配
  • eg: xshell连接云服务器时输入的ip
私有ip
  • 在私有网络内使用的地址,不直接暴露在互联网上
  • 有可能重复

版本 

ipv4
  • 32位的二进制整数,类似可以被书写为xxx.xxx.x.x(十进制)
  • 分为网络地址和主机地址两部分,用于区分网络和主机,通过子网掩码来划分这两个部分
  • 主流使用的ip地址
  • ipv4的地址空间有限,约有42亿个可用的唯一地址,导致ipv4地址枯竭
ipv6
  • 采用128位的二进制数表示,通常以冒号分隔的十六进制数表示

ip地址和mac地址的唯一性问题

  • ip地址(需要保证主机在全网内的唯一性)
  • 而mac地址只需要保证局域网内的唯一性 (理论上他也可以保证全网内的唯一性,但以太网是局域网的技术实现,不需要太大)

数据包转发的过程

引入

通过路由器实现跨网络传输(这里以只经过一个路由器为例),其原理类似于下图(要通信的两个子网之间必须要横跨一个路由器)

278a42807e9246909ce955125a7c87e6.png

我们在已经了解了局域网内的通信流程的基础上,来理解一下如何通过路由器实现跨网络传输

思考 -- 如何跨子网

先不管那些专业知识,我们先自己思考一下,如何从子网1到子网2

  • 因为我们的目的ip并不在局域网内,所以首先要出自己的局域网 -- 这需要借助路由器实现

路由器也属于局域网内的一个普通设备

  • 它可以帮我们转发给其他局域网,而该局域网内的其他设备不行
  • 把数据交给路由器的过程,本质上就是局域网通信
  • 路由器再将数据交给主机,也是局域网通信

所以,图中其实就是两次局域网通信:

  • 278a42807e9246909ce955125a7c87e6.png

过程

我们将用户向服务器发送请求,看作是[子网1内的一台主机a] 和 [子网2内的主机b]通信

首先,a发送的数据被层层封装

  • 其中网络层协议的报头中包含<来源ip和目的ip>
  • 链路层协议的报头有<来源mac地址和目的mac地址>(指示物理层将报文发送给哪个设备)
  • 注意,这里要经过路由器,所以目的mac地址=路由器mac地址

然后这条报文被发送给子网1内的所有主机

  • 每台主机收到数据,上传至链路层被解析后,只有路由器保留了这条报文,且上传到网络层
  • 经过网络层(路由器就在网络层工作)的解析,路由器发现目的ip并不是自己,且识别到是与自己相连的子网2内的主机,就会将其转换为子网2内部的通信

所以它会向下传输(因为通信最终必须要通过物理层),交给自己的链路层

  • 这里假设子网2内部用的是令牌环网络
  • 路由器内部的链路层会将自己的报头封装进去(包含<自己的mac地址+目的设备的mac地址>),然后通过物理层传输给子网2的所有主机
  • 最终只有目的ip对应的主机会保留该报文,且经过一层层解析
  • 最终,目的主机就可以收到消息了

图解

6f76fa3ef9c64bd0a899dfddb310ba2a.png

封装和解包

到一个新局域网后,路由器会帮我们去掉老的链路层报头,换成新的报头

  • 这个过程也可以叫封装和解包
  • 路由器内部的局部封装/解包,贯穿协议栈的封装/解包,都叫做封装/解包

去掉差异

注意看图,前三层同层之间收到的报文都是一样的,但是在链路层,其链路层封装的报头有区别

  • 说明网络层及其以上的协议要使用一样的,但网络层以下可以是不同的
  • 所以局域网的类型(比如以太网/令牌环网/无线网等等)已经不重要了,因为他底层的差异已经被路由器去掉了(路由器会帮我们进行报头的更新)

因为是路由器帮助我们横跨网络

  • 所以其内部必须既要有以太网协议,又要有令牌环协议,或者其他协议
  • 同理,网卡也需要配齐(也就是物理层,它因不同的局域网类型而有所不同)

ip地址/协议的重要性

还记得我们捋出来的过程吗,ip地址是其中的关键

  • 有了ip地址,我们才可以指导路由器进行转发设备的选择,路由器去进行实际的定位和转发工作
  • 相当于ip地址是最初的1,有了1才会有之后
  • 而ip地址是ip协议定义的
  • 所以可以说,是ip协议屏蔽了底层网络的差异(靠的就是工作在网络层的路由器)

  • 那么,ip报文就可以被看作是一种在全球范围内设备之间进行通信的软件虚拟层
  • 它隐藏了底层网络技术的细节,使得不同类型的设备都能够在同一个网络中进行通信,只要它们支持ip协议,就可以在这个虚拟层上互相交流(无需关心它们之间的物理连接、链路层协议或其他底层细节)
  • 这样抽象后,跨网络通信是不是就和之前学习过的局域网通信很像?
  • 所以,他们都可以用统一的传输流程
  • 这个理念和linux系统中的一切皆文件非常相似 -- 文件对象让我们忽略硬件的差异,ip地址让我们忽略底层网络的差异

  • 而这也体现了软件分层的优越性(正是因为分了层,才有机会忽略差异),在系统和网络上都有使用该思想,它大大简化了我们的操作难度
  • 也正是因为ip协议的好用,所以网络技术可以很快普及

注意 

但即使上层玩出花来,也必须得经过实际的物理层传输(因为一切的网络通信,本质上都是操作网卡)

所以可以看到,图中的a主机和b主机想跨网络交流的话,这条数据运输线必然是将他俩相连的,而不能断掉 

ip vs mac

从上面的过程梳理中我们就可以发现,这两个地址还是有很多不同的:

  • ip地址是不会发生改变的,尤其我们需要目的ip来协助我们进行路径选择
  • 而mac地址是局域网内部使用的,相当于临时地址,一旦出局域网,源和目的mac地址都会被丢弃,由路由器在链路层为其重新封装

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

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

相关文章

[每周一更]-第90期:认识Intel的CPU

市面上的CPU分类主要分有两大阵营&#xff0c;一个是Intel、AMD为首的复杂指令集CPU&#xff0c;另一个是以IBM、ARM为首的精简指令集CPU。 两个不同品牌的CPU&#xff0c;其产品的架构也不相同&#xff0c;例如&#xff0c;Intel、AMD的CPU是X86架构的&#xff0c;而IBM公司的…

mybatis plus 查询数据库 字段名 自动添加下划线

问题 mybatis plus 查询数据库 字段名 自动添加下划线 详细问题 笔者使用mybatis plus 查询数据库&#xff0c;执行查询语句报错。详细报错信息 2024-03-08 11:08:33.156 ERROR 4816 --- [nio-9090-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() …

Sora的双重边缘:视频生成的革新与就业的再思考

随着科技的日新月异&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术如潮水般涌入我们的日常生活&#xff0c;为各个领域带来了翻天覆地的变化。在这一浪潮中&#xff0c;Sora作为一款前沿的AI视频生成工具&#xff0c;凭借其高度逼真…

妇女节:打开AI视界,成就“她力量”

根据国内招聘平台猎聘发布的《2024女性人才数据洞察报告》&#xff0c;从2023年3月到2024年2月&#xff0c;女性在AIGC领域的求职人次同比增长了190.49%。随着人工智能时代的降临&#xff0c;女性正以前所未有的姿态&#xff0c;在技术的助力下&#xff0c;蜕变成为新生的力量。…

C++:Stack和Queue的模拟实现

创作不易&#xff0c;感谢三连&#xff01; 一、容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结)&#xff0c;该种模式是将一个类的接口转换成客户希望的另外一个接口。 就如同是电源适配器将不适用的交流电…

redis中的zset的原理

一、zset有序集合的原理 如果有序集合元素个数少于128个且元素值小于64字节&#xff0c;使用压缩列表&#xff08;新版本已经废弃压缩列表改用listpack数据结构了&#xff09; 如果不满足上述条件&#xff0c;采用跳表作为redis的底层数据结构 二、压缩列表 1.由连续内存块组…

k8s常用命令大全

k8s常用的命令 下面是一些常用的Kubernetes&#xff08;K8s&#xff09;命令&#xff0c;以及它们的简要说明。这些命令可以帮助您管理和操作Kubernetes集群中的资源。 集群管理命令&#xff1a; kubectl cluster-info: 显示集群的基本信息。 kubectl config use-context &l…

Doris-数据分区

数据分区&#xff1a;即将大表划分为小表&#xff0c;数据分区主要有两个级别&#xff1a;Partition和Bucket&#xff08;Tablet&#xff09;。 Partition&#xff1a;逻辑分区&#xff0c;按照一定规则将表按照行进行划分&#xff0c;每个部分就是一个Partition。 Bucket&…

Java开发与配置用到的各类中间件官网

开发配置时用到了一些官网地址&#xff0c;记录一下。 activemq 官网&#xff1a;ActiveMQ elk 官网&#xff1a;Elasticsearch 平台 — 大规模查找实时答案 | Elastic nginx 官网&#xff1a;nginx maven 官网&#xff1a;Maven – Welcome to Apache Maven nexus 官网&a…

MySQL-----视图

一 视图 ▶ 介绍 视图view是一个虚拟表&#xff0c;非真实存在&#xff0c;其本质是根据SQL语句获取动态的数据集&#xff0c;并为其命名&#xff0c;用户使用时只需使用视图名称即可获取结果集&#xff0c;并可以将其当作表来使用。 数据库中存放了视图的定义&…

修复 因 fstab 中UUID 错误导致系统无法正常工作的问题

操作系统&#xff1a; PVE 8.0 /debian 12 &#xff08;bookworm&#xff09; 问题症状&#xff1a;可以正常启动进入系统&#xff0c;但是系统盘以只读方式挂载 问题原因&#xff1a;/etc/fstab 中引导区的UUID 被错误修改导致 解决方法&#xff1a; 重启系统&#xff0c;在…

CPU设计实战-加载和存储指令(2)

目录 一 ll和sc指令说明 二 ll和sc指令的实现 1 llbit寄存器 2 译码阶段 3 访存阶段 4 Load相关问题 5 流水线在取指阶段暂停 本章介绍两个比较特殊的加载存储指令ll和sc&#xff0c;这两个指令的存在用于实现信号量机制。 信号量机制&#xff1a;在多线程中为了保证某个…