CCNA - Part10 数据包的通信过程
这篇文章主要是对数据包在同网段和不同网段的转发流程梳理,使用 ping 命令进行实际抓包测试。
网关的概念:
对于像 PC 等终端设备来说,通过交换机可以实现同网段的通信。但如果想要给其他网段发生数据,就不行了,因为本身没有路由的功能,不知道该发给谁。这时就提出了一个网关的概念,为这些终端设备配置上,当想要实现跨网段的通信时,就把数据发送到配置的网关地址上。一般来说,默认配置的网关地址都是路由的接口地址。
ARP
什么是 ARP?
ARP - Address Resolution Protocol. 在封装数据帧-链路层的数据包时,由于上层已经有了目的 IP 地址。而在链路层需要封装 SMAC 和 DMAC,但目的 MAC 如何获取呢?就是通过 ARP 协议,完成 IP 地址到物理地址的映射。但需要注意的是,ARP 不能穿越路由器,也就是跨网段传输。
ARP 原理

假设这里出现的设备均是第一次启动。把路由器的路由功能关闭,这里的 R1 代表的就是 PC 了,否则是 Ping 不通.
这里 R1 想要给 PC 发送 IP 数据包,只有按照要求封装成 2 层数据帧的格式才可以,步骤如下:
发现目前有源 MAC 地址,却没有目的 MAC 地址,那么封包不成功,暂时将包缓存。
接着发送 ARP 广播(将 ARP 广播添加帧头部发送),交换机转发该广播到该网络的每一个主机,
每个主机收到后开始解封装,进而查看到 ARP 报文中的目的 IP,如果该 IP 和自己的 IP 一致,那么做出 ARP 响应报文(单播),否则丢弃。
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 数据包
封包过程如下:
- 三层不变
- 封装二层,封装源 MAC:aabb.cc00.2010 ,目的 MAC (PC2 终端 MAC)不清楚
- 封包暂停
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 数据包的通信过程的更多相关文章
- Linux内核--网络栈实现分析(七)--数据包的传递过程(下)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7545855 更多请查看专栏,地 ...
- Linux内核--网络栈实现分析(二)--数据包的传递过程--转
转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的”(上 ...
- [转]Linux网络 - 数据包的发送过程
转, 原文:https://segmentfault.com/a/1190000008926093 -------------------------------------------------- ...
- Linux内核--网络栈实现分析(二)--数据包的传递过程(上)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7492423 更多请看专栏,地址 ...
- Linux网络 - 数据包的接收过程【转】
转自:https://segmentfault.com/a/1190000008836467 本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的. 如果英文没有问题,强烈建议阅读后 ...
- [转]Linux网络 - 数据包的接收过程
转, 原文: https://segmentfault.com/a/1190000008836467 ------------------------------------------------- ...
- opencontrail—VXLAN模式下数据包的传输过程
在这篇文章中,我们将看到VM生成的数据包如何能够到达另一个VM或外部资源,Neutron使用OpenContrail插件的上下文中的关键概念/组件是什么. 我们将重点介绍OpenContrail,它如 ...
- ovs 数据包的处理过程
Openvswitch的内核模块openvswitch.ko会在网卡上注册一个函数netdev_frame_hook,每当有网络包到达网卡的时候,这个函数就会被调用. static struct sk ...
- Linux网络 - 数据包的接收过程(转)
https://segmentfault.com/a/1190000008836467
随机推荐
- RedHat服务器安装
为什么选择 RedHat 市场占有率商业化比较高 厂商的支持比较丰富 新手建议ubuntu 进行上手 等熟悉了Linux环境可以选择自己喜欢的发行版 (有些Geeker就是认为Ubuntu太易于使用了 ...
- java 加密与解密艺术二
首先需要明确的是RSA的密钥对不能手动指定,需要通过代码系统生成 接下来我们来介绍下生成密钥对 package com.weiyuan.test; import java.security.KeyPa ...
- 半导体质量管理(LineWorks)_SPACE(统计过程分析和控制环境)
LineWorks作为SEMI的质量管理,可为半导体制造商提供对实施标准,产品质量,质量和指标验证的全面控制.有许多附加模块和SPACE-Chart插件,可根据个人需求进行灵活调整. 三个主要特征是: ...
- 解决Centos7下中文显示乱码
第一步:先查看是不是ctr的问题: SecureCRT的修改,选项→会话选项,将外观中的字符编码集修改为UTF-8即可,其他终端程序同理 如果不是则再参照如下文档操作:https://www.cnbl ...
- JedisUtils工具类模板
redis.properties配置文件 redis.maxIdle=30 redis.minIdle=10 redis.maxTotal=100 redis.url=192.168.204.128 ...
- Linux下Jmeter+nmon+nmon analyser实现性能监控及结果分析
一.概述 前段时间讲述了Jmeter利用插件PerfMon Metrics Collector来监控压测过程中服务器资源的消耗,一个偶然机会,我发现nmon这个 工具挺不错,和Jmeter插件比起来, ...
- IDEA中文注释难看的简单解决办法
好多人会发现IDEA这款集成开发工具的中文(主要是在注释上面)显示都比较难看,如下面: 都以为是字体的原因,于是各种替换字体,麻烦不说,还容易造成乱码的问题. 真正难看的原因并不是字体,而是以为是斜体 ...
- npm和webpack
npm是前端开发中常用的一种工具,对于普通开发者来说,便于管理依赖. 往大了说,便于共享代码.写完代码,使用npm发布以后,然后别人用npm可以方便地共享到你的代码. npm的使用: mac环境下的安 ...
- Yarn的安装和全局配置(源/缓存位置/全局安装位置)
本文安装环境: Win10 64位 前置条件: 已安装好Node环境(参考Node安装与环境配置) 下载和安装 Yarn安装包下载地址 全局配置 控制台输入命令, 正常显示版本表示安装成功 $ yar ...
- 由VIP漂移引发的算法异常问题调查和解决
最近工作中的一个问题,耗时一个月之久终于调查完毕且顺利解决,顿时感慨万千.耗时之久和预期解决时间和环境搭建以及日志不合理等等有关,当然这个并非此文的重点.之所以在很久以后的今天又开始写文,主要是这个问 ...