【网络】网络层协议ARP和IP协议转发流程

目录

一、IP概述

1.1 IP简介

1.2 IP协议

二、IP地址与硬件地址

三、地址解析协议ARP

3.1 ARP协议简介

3.2 ARP工作流程

3.3 ARP的四种典型情况

四、IP协议的转发流


一、IP概述


1.1 IP简介


IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。

IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

1.2 IP协议


IP协议是为计算机网络相互连接进行通信而设计的协议。在因特网中,它使得连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。IP协议实际上是一套由软件程序组成的协议软件,它把各种不同“帧”统一转换成“IP数据报”格式,这种转换是因特网的一个最重要的特点,使所有各种计算机都能在因特网上实现互通,即具有“开放性”的特点(百度百科)。


二、IP地址与硬件地址


在学习IP地址时,很重要的一点就是要弄懂主机的IP地址与硬件地址的区别

上图说明了这两种地址的区别。从层次的角度看,物理地址是数据链路层和物理层使用的地址,而IP地址是网络层和以上各层使用的地址,是一种逻辑地址(称IP地址为逻辑地址是因为IP地址是用软件实现的)。

发送数据时,数据从高层下到低层,然后才到通信链路上传输。使用IP地址的IP数据报一旦交给了数据链路层,就被封装成MAC帧了。MAC帧在传送时使用的源地址和目的地址都是硬件地址,这两个硬件地址都写在MAC帧的首部中。

连接在通信链路上的设备(主机或路由器)在收到MAC帧时,根据MAC帧首部中的硬件地址决定收下或丢弃。只有在剥去MAC帧的首部和尾部后把MAC层的数据上交给网络层后,网络层才能在IP数据报的首部中找到源IP地址和目的IP地址。总之,IP地址放在IP数据报的首部,而硬件地址则放在MAC帧的首部。在网络层和网络层以上使用的是IP地址,而数据链路层及以下使用的是硬件地址。在上图中,当IP数据报放入数据链路层的MAC帧中以后,整个的IP数据报就成为MAC帧的数据,因而在数据链路层看不见数据报的IP地址。

如下图是三个局域网用两个路由器R1和R2互连起来。现在主机H1要和主机H2通信。这两台主机的IP地址分别是IP1和IP2,而它们的硬件地址分别为HA1和HA2(HA表示Hardware Address)。通信的路径是:H1→经过R1转发→再经过R2转发→H2。路由器R1因同时连接到两个局域网上,因此它有两个硬件地址,即HA3和HA4。同理,路由器R2也有两个硬件地址HA5和HA6。

下图中不同层次、不同区间的源地址和目的地址

-

在网络层

写入IP数据报首部的地址

在数据链路层

写入IP数据报首部的地址

源地址

目的地址

源地址

目的地址

从H1到R1

IP1

IP2

HA1

HA3

从R1到R2

IP1

IP2

HA4

HA5

从R2到H2

IP1

IP2

HA6

HA2

这里要强调指出以下几点:

(1)在IP层抽象的互联网上只能看到IP数据报。虽然IP数据报要经过路由器R1和R2的两次转发,但在它的首部中的源地址和目的地址始终分别是IP1和IP2。图中的数据报上写的“从IP1到IP2”就表示前者是源地址而后者是目的地址。数据报中间经过的两个路由器的IP地址并不出现在IP数据报的首部中。

(2)虽然在IP数据报首部有源站IP地址,但路由器只根据目的站的IP地址的网络号进行路由选择。

(3)在局域网的链路层,只能看见MAC帧。IP数据报被封装在MAC帧中。MAC帧在不同网络上传送时,其MAC帧首部中的源地址和目的地址要发生变化,如上表。开始在H1到R1间传送时,MAC帧首部中写的是从硬件地址HA1发送到硬件地址HA3,路由器R1收到此MAC帧后,在数据链路层,要丢弃原来的MAC帧的首部和尾部。在转发时,在数据链路层,要重新添加上MAC帧的首部和尾部。这时首部中的源地址和目的地址分别便成为HA4和HA5。路由器R2收到此帧后,再次更换MAC帧的首部和尾部,首部中的源地址和目的地址分别变成为HA6和HA2。MAC帧的首部的这种变化,在上面的IP层上是看不见的。

(4)尽管互连在一起的网络的硬件地址体系各不相同,但IP层抽象的互联网却屏蔽了下层这些很复杂的细节。只要我们在网络层上讨论问题,就能够使用统一的、抽象的IP地址研究主机和主机或路由器之间的通信。


三、地址解析协议ARP


3.1 ARP协议简介


在实际应用中,我们经常会遇到这样的问题:已经知道了一个机器(主机或路由器)的IP地址,需要找出其相应的硬件地址。地址解析协议ARP就是用来解决这样的问题的。下图图说明了ARP协议的作用。

ARP(Address Resolution Protocol)即地址解析协议由于是IP协议使用了ARP协议,因此通常就把ARP协议划归网络层。ARP协议的用途是为了从网络层使用的IP地址,解析出在数据链路层使用的硬件地址。

地址解析协议ARP在主机ARP高速缓存中存放一个从IP地址到硬件地址的映射表,并且这个映射表还经常动态更新(新增或超时删除)。每一台主机都设有一个ARP高速缓存(ARP cache),里面有本局域网上的各主机和路由器的IP地址到硬件地址的映射表,这些都是该主机目前知道的一些地址。那么主机怎样知道这些地址呢?我们可以通过下面的例子来说明。

3.2 ARP工作流程


当主机A要向本局域网上的某台主机B发送IP数据报时,就先在其ARP高速缓存中查看有无主机B的IP地址。如有,就在ARP高速缓存中查出其对应的硬件地址,再把这个硬件地址写入MAC帧,然后通过局域网把该MAC帧发往此硬件地址。也有可能查不到主机B的IP地址的项目。这可能是主机B才入网,也可能是主机A刚刚加电,其高速缓存还是空的。在这种情况下,主机A就自动运行ARP,然后按以下步骤找出主机B的硬件地址。

(1)ARP进程在本局域网上广播发送一个ARP请求分组如下图(a)是主机A广播发送ARP请求分组的示意图。ARP请求分组的主要内容是:“我的IP地址是209.0.0.5,硬件地址是00-00-C0-15-AD-18。我想知道IP地址为209.0.0.6的主机的硬件地址。

(2)在本局域网上的所有主机上运行的ARP进程都收到此ARP请求分组。

(3)主机B的IP地址与ARP请求分组中要查询的IP地址一致,就收下这个ARP请求分组,并向主机A发送ARP响应分组,同时在这个ARP响应分组中写入自己的硬件地址。由于其余的所有主机的IP地址都与ARP请求分组中要查询的IP地址不一致,因此都不理睬这个ARP请求分组,见上图(b)。ARP响应分组的主要内容是:“我的IP地址是209.0.0.6,我的硬件地址是08-00-2B-00-EE-0A。”请注意:虽然ARP请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。

(4)主机A收到主机B的ARP响应分组后,就在其ARP高速缓存中写入主机B的IP地址到硬件地址的映射。

当主机A向B发送数据报时,很可能以后不久主机B还要向A发送数据报,因而主机B也可能要向A发送ARP请求分组。为了减少网络上的通信量,主机A在发送其ARP请求分组时,就把自己的IP地址到硬件地址的映射写入ARP请求分组。当主机B收到A的ARP请求分组时,就把主机A的这一地址映射写入主机B自己的ARP高速缓存中。以后主机B向A发送数据报时就很方便了。

ARP对保存在高速缓存中的每一个映射地址项目都设置生存时间(例如,10~20分钟)。凡超过生存时间的项目就从高速缓存中删除掉,及时清理缓存失效的硬件设备地址。

3.3 ARP的四种典型情况


ARP是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。从IP地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上的另一个已知IP地址的主机或路由器进行通信,ARP协议就会自动地把这个IP地址解析为链路层所需要的硬件地址。

下面我们归纳出使用ARP的四种典型情况。

(1)发送方是主机(如H1)要把IP数据报发送到同一个网络上的另一台主机(如H2)。这时H1发送ARP请求分组(在网1上广播),找到目的主机H2的硬件地址。

(2)发送方是主机(如H1),要把IP数据报发送到另一个网络上的一台主机(如H3或H4)。这时H1发送ARP请求分组(在网1上广播),找到网1上的一个路由器R1的硬件地址。剩下的工作由路由器R1来完成。R1要做的事情是下面的(3)或(4)。

(3)发送方是路由器(如R1)要把IP数据报转发到与R1连接在同一个网络(网2)上的主机(如H3)。这时R1发送ARP请求分组(在网2上广播),找到目的主机H3的硬件地址。

(4)发送方是路由器(如R1),要把IP数据报转发到网3上的一台主机(如H4)。H4与R1不是连接在同一个网络上。这时R1发送ARP请求分组(在网2上广播),找到连接在网2上的一个路由器R2的硬件地址。剩下的工作由这个路由器R2来完成。

在许多情况下需要多次使用ARP。但这只是以上几种情况的反复使用而已。

下图是window系统使用 arp -a 命令查看本机的ARP缓存表:


四、IP协议的转发流程


如下图所示,计算机A将数据发送给计算机B要经过多个网络,数据的传输过程是怎样的呢?

计算机A往计算机B发送数据的传输路径有很多种选择。我们暂且随机选一条传输路径,拉直后如下图

数据经过网络1到达路由器,经过网络2到达路由器,经过网络3到达计算机B。这种传输方式称为逐跳(hop-by-hop),抽象地来看,数据在网络中的传输是从一个IP地址跳到另一个IP地址。

计算机、路由器都拥有一个路由表,路由表存储着指向特定网络地址的路径。

假设上图是计算机A的路由表,数据要到达目的地址IP1,下一跳的IP地址是IP4;数据要到达目的地址IP2,下一跳的IP地址是IP5。

仅从网络层分析,A发数据给B过程如下:

  1. A发出目的IP为B的IP数据报, 查询自身路由表发现下一跳为E。
  2. A将数据报发送给E。
  3. E查询路由表发现下一跳为F,将数据报发送给F。
  4. F查询路由表发现与目的IP设备B直接连接,将数据报发送给B。

结合网络层与数据链路层分析数据转发过程,如下:

  1. A发出目的IP为B的IP数据报, 查询路由表发现下一跳为E;A将IP数据报交给数据链路层,并告知目的MAC地址是E;数据链路层填充源MAC地址A和目的MAC地址E;数据链路层通过物理层将数据发送给E。
  2. E的数据链路层接收到数据帧, 把帧数据交给网络层;E查询路由表, 发现下一跳为F;E的网络层再把数据报交给数据链路层,并告知目的MAC地址为F;E的数据链路层封装数据帧并发送。
  3. F的数据链路层接收到数据帧, 把帧数据交给网络层;F查询路由表, 发现下一跳为B;F的网络层再把数据报交给数据链路层,并告知目的MAC地址为B;F的数据链路层封装数据帧并发送。

在数据转发的过程中,数据帧每一跳的MAC地址都在变化,而IP数据报每一跳的IP地址始终保持不变。

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

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

相关文章

[VUE]1-创建vue工程

目录 基于脚手架创建前端工程 1、环境要求 2、操作过程 3、工程结构 4、启动前端服务 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法&#xff0c…

如何写html邮件 —— 参考主流outook、gmail、qq邮箱渲染邮件过程

文章目录 ⭐前言⭐outlook渲染邮件⭐gmail邮箱渲染邮件⭐qq邮箱渲染邮件 ⭐编写html邮件💖table表格的属性💖文本💖图片💖按钮💖背景图片 ⭐总结⭐结束 ⭐前言 大家好,我是yma16,本文分享关于 …

云卷云舒:【实战篇】对象存储迁移

云卷云舒:【实战篇】MySQL迁移-CSDN博客 1. 简介 对象存储与块存储、文件存储并列为云计算三大存储模型。提供海量存储空间服务,具备快速的数据存取性能、高可靠和数据安全性,通过标准的RESTful API接口和丰富的SDK包来提供服务&#xff0c…

3D模型UV展开原理

今年早些时候,我为 MAKE 杂志写了一篇教程,介绍如何制作视频游戏角色的毛绒动物。 该技术采用给定的角色 3D 模型及其纹理,并以编程方式生成缝纫图案。 虽然我已经编写了一般摘要并将源代码上传到 GitHub,但我在这里编写了对使这一…

Presto CLI学习

1. 序言 作为Presto的客户端之一,Presto CLI是一个基于终端的交互式shell,对应presto源码中的presto-cli模块 Presto CLI的本质是一个self-executing jar —— presto-cli-version-executable.jar,就像一个普通的UNIX可执行文件 因此&#…

olap/spark-tungsten:codegen

15721这一章没什么好说的,不再贴课程内容了。codegen和simd在工业界一般只会选一种实现。比如phothon之前用codegen,然后改成了向量化引擎。一般gen的都是weld IR/LLVM IR/当前语言,gen成C的也要检查是不是有本地预编译版本,要不没…

城市建设模拟游戏:鼠托邦 RATOPIA 中文免安装版

《鼠托邦》是一款由独立游戏开发团队Cassel Games开发的基地建设模拟游戏。在游戏中,玩家需要管理一个庞大的地下鼠国,打造理想中的“鼠托邦”。玩家可以化身为糖果派对游戏中的老鼠女王,带领老鼠民众建设城市、勘探地下领域以扩展生存空间。…

Web前端-JavaScript(ES6)

文章目录 1.ES5数组新方法1.1 数组方法forEach遍历数组1.2 数组方法filter过滤数组1.3 数组方法some1.4 some和forEach和filter的区别1.5 find()1.6 findIndex()1.7 trim去除字符串两端的空格1.8 获取对象的属性名1.9 Object.defineProperty 2.ES6语法2.1 ES6概述2.2 为什么使用…

CTF数据分析题详解

目录 题目一(1.pcap) 题目二(2.pcap) 题目三(3.pcap) 题目四(4.pcap) CTF流量分析经典例题详解-CSDN博客 本文章涉及的所有题目附件下载地址: 链接: https://pan.baidu.com/s/18mWo5vn1zp_XbmcQrMOKRA 提取码:hrc4 声明:这里…

WorkPlus AI助理为企业提供智能客服的机器人解决方案

在数字化时代,企业面临着客户服务的重要挑战。AI客服机器人成为了提升客户体验和提高工作效率的关键工具。作为一款优秀的AI助理,WorkPlus AI助理以其智能化的特点和卓越的功能,为企业提供了全新的客服机器人解决方案。 为什么选择WorkPlus A…

Python机器学习入门必学必会:机器学习与Python基础

1.机器学习常见的基础概念 根据输入数据是否具有“响应变量”信息,机器学习被分为“监督式学习”和“非监督式学习”。“监督式学习”即输入数据中即有X变量,也有y变量,特色在于使用“特征(X变量)”来预测“响应变量&…

【Python从入门到进阶】46、58同城Scrapy项目案例介绍

接上篇《45、Scrapy框架核心组件介绍》 上一篇我们学习了Scrapy框架的核心组件的使用。本篇我们进入实战第一篇,以58同城的Scrapy项目案例,结合实际再次巩固一下项目结构以及代码逻辑的用法。 一、案例网站介绍 58同城是一个生活服务类平台&#xff0c…

【分布式】分布式链路跟踪技术

为什么需要分布式链路追踪 提到分布式链路追踪,我们要先提到微服务。相信很多人都接触过微服务。微服务是一种开发软件的架构和组织方法,它侧重将服务解耦,服务之间通过API通信。使应用程序更易于扩展和更快地开发,从而加速新功能…

Go-gin-example 添加注释 第一部分 新建项目及api编写

文章目录 go-gin-example环境准备初始化 Go Modules基础使用 gin 安装测试gin是否引入 gin搭建Blog APIsgo-ini简述配置文件 阶段目标 编写简单API错误码包 完成一个demo初始化项目初始化项目数据库编写项目配置包拉取go-ini配置包在conf目录下新建app.ini文件,写入…

【操作系统篇】什么是分段和分页

什么是分段和分页 ✔️ 典型解析✔️分页✔️页表✔️分段(Segmentation)✔️ 分段和分页的区别✔️分页和分段哪个更耗资源✔️它们对性能的影响是怎样的✔️分段和分页分别适合什么场景 ✔️ 典型解析 在操作系统中,分段和分页是两种不同的…

在做题中学习(43):长度最小的子数组

LCR 008. 长度最小的子数组 - 力扣(LeetCode) 解法:同向双指针-------滑动窗口算法 解释:本是暴力枚举做法,因为全部是正整数,就可以利用单调性和双指针解决问题来节省时间 思路: 如上面图&am…

ES -极客学习

Elasticsearch 简介及其发展历史 起源 Lucene 于 Java 语言开发的搜索引擎库类创建于 1999 年,2005 年成为 Apache 顶级开源项目Lucene 具有高性能、易扩展的优点Lucene 的局限性 只能基于 Java 语言开发类库的接口学习曲线陡峭原生并不支持水平扩展原生并不支持水…

如何找到 niche 出海细分市场的 IDEA

先说结论就是:看榜单 Why:为什么看榜单? 大家会问为什么?原因很简单: 熟读唐诗三百首,不会作诗也会吟不天天看榜单上相关的优秀同行,你想干啥 心法就是下苦功夫坚持,量变引起质变…

Nginx 文件名逻辑漏洞(CVE-2013-4547)

目录 Nginx 文件名逻辑漏洞(CVE-2013-4547) 1.cd到CVE-2013-4547 2.执行docker-compose up -d 3.查看靶场是否开启成功 4.访问浏览器 5.上传含有一句话木马的图片 6.burp抓包 7.在shell.gif加空格 8.放包 9.访问路径 10.继续抓包 11.在aa后面…

优化器(一)torch.optim.SGD-随机梯度下降法

torch.optim.SGD-随机梯度下降法 import torch import torchvision.datasets from torch import nn from torch.utils.data import DataLoaderdataset torchvision.datasets.CIFAR10(root./data, trainFalse, downloadTrue,transformtorchvision.transforms.ToTensor()) data…