这篇文章主要是对数据包在同网段和不同网段的转发流程梳理,使用 ping 命令进行实际抓包测试。

网关的概念:

对于像 PC 等终端设备来说,通过交换机可以实现同网段的通信。但如果想要给其他网段发生数据,就不行了,因为本身没有路由的功能,不知道该发给谁。这时就提出了一个网关的概念,为这些终端设备配置上,当想要实现跨网段的通信时,就把数据发送到配置的网关地址上。一般来说,默认配置的网关地址都是路由的接口地址。

ARP

什么是 ARP?

ARP - Address Resolution Protocol. 在封装数据帧-链路层的数据包时,由于上层已经有了目的 IP 地址。而在链路层需要封装 SMAC 和 DMAC,但目的 MAC 如何获取呢?就是通过 ARP 协议,完成 IP 地址到物理地址的映射。但需要注意的是,ARP 不能穿越路由器,也就是跨网段传输。

ARP 原理

假设这里出现的设备均是第一次启动。把路由器的路由功能关闭,这里的 R1 代表的就是 PC 了,否则是 Ping 不通.

这里 R1 想要给 PC 发送 IP 数据包,只有按照要求封装成 2 层数据帧的格式才可以,步骤如下:

  1. 发现目前有源 MAC 地址,却没有目的 MAC 地址,那么封包不成功,暂时将包缓存。

  2. 接着发送 ARP 广播(将 ARP 广播添加帧头部发送),交换机转发该广播到该网络的每一个主机,

  3. 每个主机收到后开始解封装,进而查看到 ARP 报文中的目的 IP,如果该 IP 和自己的 IP 一致,那么做出 ARP 响应报文(单播),否则丢弃。

  4. R1 收到 PC 的响应报文后,开始解封装,并查看 ARP 报文中的目的 IP,添加到缺少的目的 MAC,最后再发送到数据到 PC。

ARP 分类

标准 ARP:用于获取 MAC 的 ARP 协议。

代理 ARP:正常来说,如果某个接口收到的网络层 IP 不是自己的话,就会把包丢掉。但如果在路由器的上接口配置了代理 ARP,路由器在收到数据包后,会先查看自己的路由表,看能不能到达,能到达的话。就将自己接口的 MAC 地址回复给请求方。注意真的 MAC 可能是另一网段的设备。其实这里就是一种欺骗行为,欺骗发送者自己的 IP 和 MAC.

无故(免费) ARP:用于检测 IP 地址是否冲突,已经被其他接口使用。目的和源 IP 都是自己.(在接口第一次启动时发送。)

同网段的数据通信

这里出现的设备均是第一次启动,把路由器的路由功能关闭,这里的 R1 代表的就是 PC 了,否则是 Ping 不通的

这里 R1 想要给 PC 发送 IP 数据包,只有按照要求封装成 2 层数据帧的格式才可以。这时发现目前有源 MAC 地址,却没有目的 MAC 地址,那么封包不成功,暂时将包搁置。接着发送 ARP 广播(将 ARP 广播添加帧头部发送,帧结构如下图)

交换机收到该数据包后发现目的 MAC 为 ffff:ffff:ffff, 根据交换机的转发规则,先将 R1 的源 MAC 和自己端口号(e0/0)存入 MAC 表,然后进行泛洪操作,广播到该网络的每一个主机。

每个主机收到后开始解封装,进而查看到 ARP 报文中的目的 IP,PC 发现目的 IP 和自己的 IP 一致,接着发送 ARP 响应报文(如下图)

交换机收到 PC 的 ARP 应答报文后,由于目的 MAC 地址在本身的 MAC 表里已经存在,进而直接转发给 R1。

R1 收到 PC 的响应报文后,开始解封装,并查看 ARP 报文中的目的 MAC,添加到搁置的缺少目的 MAC 的数据包,接着将封装好的数据帧发送到 PC (ping 命令 在传输层是 ICMP 协议)

不同网段之间的通信

这里注意一下,两台 PC 机要配置网关,否则 ARP 包内的内容可能不一样

不管终端的目的是哪里,首先都要将数据包发送到网关

PC1 要给 PC2 发送 ICMP 包,首先要发送到网关,我们先模拟下封包过程:

封装 4 层 ICMP 头

封装 3 层 IPV4 头,源 IP 为 12.1.1.1 目的 IP 为 23.1.1.2

封装 2 层 头,源 MAC 为 aabb.cc00.1000 目的 MAC(也就是网关的 MAC) 不清楚

封装暂停。

PC1 开始发送 ARP 报文,获取网关 MAC,报文如下:

路由器 R2 收到 ARP 请求报文,开始解封装,发现报文中的 Sender IP 是自己,那么进行 ARP 报文回复,并将 PC1 的源 MAC 和源 IP 记录在自己 ARP 缓存表中,报文如下:

PC1 收到 ARP 应答报文,进行解封装,取出报文中缺少的 MAC 地址,添加到搁置的 ICMP 的包中,PC1 顺利的将数据包发送至网关

R2 收到发来的 ICMP 包后,进行解封装,进行到第三层时,发送目的 IP 是自己可达网段中的 IP。因此进行转发,开始封装新的 ICMP 数据包

封包过程如下:

  1. 三层不变
  2. 封装二层,封装源 MAC:aabb.cc00.2010 ,目的 MAC (PC2 终端 MAC)不清楚
  3. 封包暂停

R2 开始发送 ARP 报文,请求 PC2 的 MAC 地址,报文如下:

交换机收到 ARP 请求报文,将 R2 的 e0/1 的 MAC 地址和自己的端口号(e0/0) 记录在 MAC 地址表内,然后根据规则进行泛洪.

PC2 收到 ARP 解析包后,发送 ARP 包中的目的 IP 是自己,因此进行 ARP 应答,并将 ARP 请求中的源 MAC (aa:bb:cc:00:20:10) 和 源 IP(23.1.1.1) 记录在自己的 ARP 缓存表中,应答报文如下:

交换机收到 PC 的 ARP 应答报文后,先将 PC2 的 e0/0 MAC 地址和自己的端口号(e0/1) 记录字 MAC 地址表内,接着发现要去数据包要去的 MAC 地址在自己的 MAC 表内,因此直接转发。

R2 收到 ARP 应答报文,取出 PC2 的 MAC 地址,并添加到搁置的 ICMP 包中,封包成功。接着将 ICMP 包发给 PC2,同时也将 PC2 的 MAC 地址和 IP 记录在自己的 ARP 缓存表中。

PC2 收到 ICMP 包发现,三层包中目的 IP 是自己,接着进行 ICMP 应答,我们再来模拟一下封包的过程:

封装 4 层 ICMP 头

封装 3 层,源 IP:23.1.11 目的 IP:12.1.1.1

封装 2 层,源 MAC:aabb.cc00.4000 目的MAC:网关 MAC(aabb.cc00.2010)(在 ARP 缓存表中取得)

然后进行发包。

交换机收到数据包后,发送目的 MAC 在自己的 MAC 表中有,直接转发给 R2,R2 收到数据包后,解 封 2 层,发现 3 层中要去的网段自己能到达,因此开始封装包:

3 层不变

2 层的源 MAC 为自己的 MAC 地址(e 0/0),目的 MAC 为 aabb.cc00.1000 (从 ARP 缓存表中取得),

报文如下:

最后我们可以发现,数据包在跨网段传输时,网络层的 IP 是固定不变的,但是 MAC 地址是在不断发生变化的。

CCNA - Part10 数据包的通信过程的更多相关文章

  1. Linux内核--网络栈实现分析(七)--数据包的传递过程(下)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7545855 更多请查看专栏,地 ...

  2. Linux内核--网络栈实现分析(二)--数据包的传递过程--转

    转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的”(上 ...

  3. [转]Linux网络 - 数据包的发送过程

    转, 原文:https://segmentfault.com/a/1190000008926093 -------------------------------------------------- ...

  4. Linux内核--网络栈实现分析(二)--数据包的传递过程(上)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7492423 更多请看专栏,地址 ...

  5. Linux网络 - 数据包的接收过程【转】

    转自:https://segmentfault.com/a/1190000008836467 本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的. 如果英文没有问题,强烈建议阅读后 ...

  6. [转]Linux网络 - 数据包的接收过程

    转, 原文: https://segmentfault.com/a/1190000008836467 ------------------------------------------------- ...

  7. opencontrail—VXLAN模式下数据包的传输过程

    在这篇文章中,我们将看到VM生成的数据包如何能够到达另一个VM或外部资源,Neutron使用OpenContrail插件的上下文中的关键概念/组件是什么. 我们将重点介绍OpenContrail,它如 ...

  8. ovs 数据包的处理过程

    Openvswitch的内核模块openvswitch.ko会在网卡上注册一个函数netdev_frame_hook,每当有网络包到达网卡的时候,这个函数就会被调用. static struct sk ...

  9. Linux网络 - 数据包的接收过程(转)

    https://segmentfault.com/a/1190000008836467

随机推荐

  1. MySQL语句的使用

    进入数据库  mysql -u root -pmysql    (u用户名,p密码)#如果不想让其他人看到就直接一个p然后回车再打密码 select version();   查看数据库版本 sele ...

  2. 使用SpringCloud Stream结合rabbitMQ实现消息消费失败重发机制

    前言:实际项目中经常遇到消息消费失败了,要进行消息的重发.比如支付消息消费失败后,要分不同时间段进行N次的消息重发提醒. 本文模拟场景 当金额少于100时,消息消费成功 当金额大于100,小于200时 ...

  3. Hystrix Stream的监控页面不显示内容

    打开Hystrix Stream页面,进入后,发现只有一行Unable to connect to Command Metric Stream. 因为springboot的默认路径不是 "/ ...

  4. JFinal 开箱评测,这次我是认真的

    引言 昨天在看服务器容器的时候意外的遇到了 JFinal ,之前我对 JFinal 的印象仅停留在这是一款国人开发的集成 Spring 全家桶的一个框架. 后来我查了一下,好像事情并没有这么简单. J ...

  5. MongoDB快速入门教程 (4.3)

    4.3.Mongoose模块化 4.3.1.为什么要进行模块化拆分? 模块化拆分的目的是为了代码的复用,让整个项目的结构更加清晰,举个例子:当数据库中的集合变多的时候,例如有课程.订单.分类.教师等多 ...

  6. jmeter跨线程组获取cookie或jmeter线程组共享cookie-笔者亲测

    一.Jmeter版本 此次示例采用的是apache-jmeter-5.2.1版本 二.设置配置文件使Cookie管理器保存cookie信息. 修改apache-jmeter-5.2.1/bin/jme ...

  7. java普通对象和json字符串的互转

    一.java普通对象和json字符串的互转 java对象---->json 首先创建一个java对象: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...

  8. Spring FactoryBean 缓存

    相关文章 Spring 整体架构 编译Spring5.2.0源码 Spring-资源加载 Spring 容器的初始化 Spring-AliasRegistry Spring 获取单例流程(一) Spr ...

  9. 缓存数据库之redis

    NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库,NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题 N ...

  10. css定义变量_css原生变量的使用和兼容 附带还有更高性能,文件更高压缩率的好处

    在开发中,css样式有一些属性往往需要重复使用,为了避免代码冗余,降低维护成本.我们需要使用CSS预编译工具[Sass/Less/Stylus],随着这些工具的流行,CSS变量也开始规范制定,目前很多 ...