路由器转发数据包的封装过程


如图,Host A 向Host B 发送数据,路由器会对数据包的封装如下。
1.Host A 在网络层将上层的数据封装成IP数据包,其首部包含了源地址和目的地址。源地址本机的IP 192.168.1.2,目的地址为192.168.2.2。在数据链路层将上层的数据封装成数据帧,源地址的Mac地址为 00-11-12-21-11-11 目的Mac地址不知道,Host A通过ARP协议广播想要获取Host B 主机mac地址,获得A路由器的E0接口MAC地址 00-11-12-21-22-22.这时在以太网首部的源Mac地址为00-11-12-21-11-11,目的Mac地址为00-11-12-21-22-22
2.
2.数据帧到A路由器E0口时 ,进行解封装再封装,再封装时源地址Mac为00-11-12-21-22-22,目的Mac在通过ARP广播请求,ARP请求得到A路由器E1口Mac地址为 00-11-12-21-33-33,
这还少以太网首部的源Mac地址为00-11-12-21-22-22,目的Mac地址为 00-11-12-21-33-33。

3.数据帧到A交换机E1口时,对数据帧进行解封装再封装,再封装时源Mac地址为00-11-12-21-33-33,目的Mac地址通过ARP广播请求,ARP请求得到B路由器E1口Mac地址为00-12-12-21-44-44,这时在以太网首部的源Mac地址为00-11-12-21-33-33 目的Mac 00-12-12-21-44-44。
4.
4.路由器B从E1接口收到数据帧,会把数据链路层的封装去掉,对ip地址进行检查,并与路由表进行匹配,然后根据路由表的下一跳信息将数据包准到E0接口。路由器B发现目的网段与自己的E0接口直接相连,通过ARP广播,路由器B获得Host B以太口的Mac位置为00-11-12-21-66-66.路由器B再将IP数据包装成以太网帧,源Mac地址为路由器B的E0接口的Mac地址00-11-12-21-55-55,目的Mac地址为Host B的Mac地址为00-11-12-21-66-66.封装完成,将以太网帧从E0接口发往Host B。

原文地址:https://blog.51cto.com/14449563/2427079

时间: 2024-07-30 17:41:44

路由器转发数据包的封装过程的相关文章

路由器转发数据包封装过程

HostA要通讯HostB首先要通过网关,现在还有没有网关的mac地址,这样就会发生ARP广播,这时 源IP:192.168.1.2/24源mac地址:00-11-12-21-11-11目标IP:192.168.1.1/24目标mac地址:FF-FF-FF-FF-FF-FF ping包过来,E0端口会回应HostA自己的mac地址,而后再回发送一个ping包 源IP:192.168.1.2/24,这时源mac地址:00-11-12-21-11-11目标IP:192.168.2.2/24目标mac

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

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7545855 更多请查看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 在博文Linux内核--网络栈

北斗数据包格式封装和解析

1.北斗协议的具体格式如下图 2.数据包类型 根据北斗协议类型定义如下枚举类型 /// <summary> /// 数据包类型 /// </summary> public enum BDFrameType : ushort { /// <summary> /// 默认 /// </summary> Default = 0x00, /// <summary> /// 终端通用应答 /// </summary> TerCommonResp

Linux网络 - 数据包的发送过程【转】

转自:https://segmentfault.com/a/1190000008926093 继上一篇介绍了数据包的接收过程后,本文将介绍在Linux系统中,数据包是如何一步一步从应用程序到网卡并最终发送出去的. 如果英文没有问题,强烈建议阅读后面参考里的文章,里面介绍的更详细. 本文只讨论以太网的物理网卡,并且以一个UDP包的发送过程作为示例,由于本人对协议栈的代码不熟,有些地方可能理解有误,欢迎指正 socket层 +-------------+ | Application | +-----

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

转, 原文:https://segmentfault.com/a/1190000008926093 -------------------------------------------------------------------------------------------------------------------- 继上一篇介绍了数据包的接收过程后,本文将介绍在Linux系统中,数据包是如何一步一步从应用程序到网卡并最终发送出去的. 如果英文没有问题,强烈建议阅读后面参考里的文章

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

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7492423 更多请看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 上一篇博文中我们从宏观上分析了L

数据包的接收过程

网络栈的层次结构: 我们就从最底层开始追溯一个数据包的传递流程. 1.网络接口层 * 硬件监听物理介质,进行数据的接收,当接收的数据填满了缓冲区,硬件就会产生中断,中断产生后,系统会转向中断服务子程序. * 在中断服务子程序中,数据会从硬件的缓冲区复制到内核的空间缓冲区,并包装成一个数据结构(sk_buff),然后调用对驱动层的接口函数netif_rx()将数据包发送给链路层.该函数的实现在net/inet/dev.c中,(在整个网络栈实现中dev.c文件的作用重大,它衔接了其下的驱动层和其上的

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

转自:https://segmentfault.com/a/1190000008836467 本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的. 如果英文没有问题,强烈建议阅读后面参考里的两篇文章,里面介绍的更详细. 本文只讨论以太网的物理网卡,不涉及虚拟设备,并且以一个UDP包的接收过程作为示例. 本示例里列出的函数调用关系来自于kernel 3.13.0,如果你的内核不是这个版本,函数名称和相关路径可能不一样,但背后的原理应该是一样的(或者有细微差别) 网卡到内存 网卡

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

转, 原文: https://segmentfault.com/a/1190000008836467 ----------------------------------------------------------------------------------------------------------------- 本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的. 如果英文没有问题,强烈建议阅读后面参考里的两篇文章,里面介绍的更详细. 本文只讨论以太网的物理网