博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ip数据包经由路由转发的时候源ip MAC,目的ip 目的MAC是否改变
阅读量:4286 次
发布时间:2019-05-27

本文共 1159 字,大约阅读时间需要 3 分钟。

轉載自

ip数据包经由路由转发的时候源ip,目的ip是否改变?

最近面试网络方面的经常问到这个问题,答案是不能改变的,*除非做了nat转换才能改变。

不过mac地址是变化的,因为发送端开始不知道目的主机的mac地址,所以每经过一个路由器mac地址是变化的。

目的mac地址是如何得到的?

TCP/IP里面是用的ARP协议。比如新建了一个内网,如果一台机器A找机器B,封装FRAME时(OSI的第二层用的数据格式),要封装对方的MAC,开始时A不知道B的MAC,只知道IP,它就发一个ARP包,源IP是自己的,目的IP是B的,源MAC是自己的,目的MAC是广播的。然后这个请求包在内网内被广播,当其他机器接到这个包时,用目的IP和自己的IP比较,不是的话就丢弃。B接到时,发现IP与自己的一样,就答应这个包的请求,把自己的MAC送给A。如果B是其他子网的机器,那么路由器会判断出B是其他子网,然后路由器把自己的MAC返回给A,A以后再给B发包时,目的MAC封装的是路由器的。

路由转发过程:

当主机A发向主机B的数据流在网络层封装成IP数据包,IP数据包的首部包含了源地址和目标地址。主机A会用本机配置的24位IP网络掩码255.255.255.0与目标地址进行与运算,得出目标网络地址与本机的网络地址是不是在同一个网段中。如果不是将IP数据包转发到网关。

在发往网关前主机A还会通过ARP的请求获得默认网关的MAC地址。在主机A数据链路层IP数据包封装成以太网数据帧,然后才发住到网关……也就是路由器上的一个端口。

当网关路由器接收到以太网数据帧时,发现数据帧中的目标MAC地址是自己的某一个端口的物理地址,这时路由器会把以太网数据帧的封装去掉。路由器认为这个IP数据包是要通过自己进行转发,接着它就在匹配路由表。匹配到路由项后,它就将包发往下一条地址。

路由器转发数据包就是这样,所以它始终是不会改IP地址的。只会改MAC.

当有数据包传到路由器时,路由器首先将其的目的地址与路由表进行对比,如果是本地网络,将不会进行转发到外网络,而是直接转发给本地网内的目的主机;但是如果目的地址经路由表对比,发现不是在本网中,有nat就将改变源地址的IP(原源地址的Ip地址改为了路由器的IP地址),路由器将数据包转发到相应的端口,进行通信。

比如: 

如:A访问B, 
首先对比是否同一子网,如果是,检查ARP表,有B的MAC就直接发送,没有就发送ARP请求.如果否,发送到默认网关C,源IP为A,源MAC为A,目的IP为B,目的MAC地址为C, 
C接收到这个包,检查路由表,发送到下一跳D,源IP为A,源MAC为C,目的IP为B,目的MAC为D….. 
如此循环,直到发送到B.

NAT为特殊应用,会修改源IP为网关自己外网IP。

转载地址:http://bzpgi.baihongyu.com/

你可能感兴趣的文章
teamviewer Linux centos7安装使用详细
查看>>
【MATLAB】线条标记符大小设置
查看>>
MATLAB中矩阵的逻辑索引方法
查看>>
windows下go dep环境搭建
查看>>
EMQX docker安装及运行
查看>>
使用python和MQTT.fx连接mqtt
查看>>
EMQTT的ACL鉴权(topic权限控制)
查看>>
emqx客户端用户名密码登录验证配置
查看>>
python多线程之信号量semaphore实战
查看>>
ubuntu下忘记mysql密码重置方式
查看>>
ubuntu不在python虚拟环境下使用uwsgi启动django及nginx代理配置
查看>>
flask ORM之SQLAlchemy基本架构实战
查看>>
Python2和python3中类型判断
查看>>
Centos 7上搭建flask项目实战
查看>>
搭建nginx+uwsgi+flask遇到KeyError: 'REQUEST_METHOD'
查看>>
Nginx+uwsgi+flask部署实战
查看>>
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence
查看>>
python中导入 train_test_split提示错误
查看>>
django创建项目的一些命令
查看>>
python3.6合并多个文件代码
查看>>