本文主要目标是让大家了解数据包在网络中的流转过程,以及对ip、MAC地址、交换机和路由器有混淆的,看完本文一定会恍然大悟。
对于TCP/IP4层协议,这里不过多介绍,里面只会简单涉及到一些。
ip的重新认识
ip中分为网络号和主机号,目前通常使用子网掩码来识别。网络号是用于标识该ip属于哪个子网(局域网),相同的子网则代表是在同一个区域网内;而主机号主要用于区分子网内的不同主机。
如果源ip和目标ip不是一个局域网,则数据包在网络中传输时,从当前设备跳到下个设备的过程中,源ip和目标ip是不变的,而源mac地址和目标mac地址则是一在变化的,
至于是怎么变化的,可以继续往下看。
如果源ip和目标ip属于一个局域网,则数据包不需要经过路由器
,而是在局域网
内使用ARP协议
通过广播
的形式获取到目标ip的MAC地址
,然后在该局域网
内使用交换机
将数据发送给该MAC地址
(交换机只认识MAC地址而不认识IP地址)。
上面这三段话很重要,大家细细品读。
MAC地址到底是干什么用的
大家对网络层的ip可能比较熟悉,ipv4是一个32位的10进制数;但是对网络接口层的MAC地址的作用可能有点模糊,有的同学可能有疑问:既然已经知道了目标ip,为什么还需要目标的MAC地址呢?
接下来由我细细讲解:
首先需要知道的一点是网络层的ip的作用只是
指明数据包应发往的目的地是哪里
,而数据包具体是以什么方式发送到目的地的
,网络层ip并不关心
。举个例子,比如你想去迪士尼,那么你的目的地就是上海,而目的ip就是上海,而至于你怎么去的上海,网络层ip并不关心。如果想把数据包真实的发送到目标ip,则只能通过
转换机
或者是路由器
来实现;转换机
只能负责在局域网数据传输
,而路由器
可以在不同的网段内进行数据传输
;对于交换机还是路由器来说它们并
不认识ip
,只认识MAC
地址。在实际的网络通信中,当一个设备需要将数据包发送到另一个设备时,它通常需要查找到目标设备的 MAC 地址才可以进行传输;现在有个问题,我们发送数据时通过
DNS解析
知道了目标ip
,而数据传输是需要知道目标设备的MAC地址的,所以是怎么知道目标ip的MAC地址呢?
答案就是ARP协议
,该协议会在目标ip的局域网
内进行广播
询问当前目标ip的MAC地址是什么?对应的IP收到广播信息后就会将自己的MAC地址返回
。通过APR协议
就可以将ip转换为对应MAC
地址,数据就可以愉快的传播啦。还需要注意一点是,网络中的所有设备
都存在
一个MAC地址,比如路由器
,交换机
,主机
都存在唯一的MAC地址。
通过上面的介绍现在你应该明白了,目标MAC地址
的作用是用于真正的数据传输
。网络接口层的目标MAC地址
指向的是数据包下一跳的设备的MAC地址
;而网络层接口层的源MAC地址
就是指的数据包所在当前设备的MAC地址。
网卡到底是做什么的
信号转换
源ip的数据包经过TCP/IP的4层协议加工(应用层->传输层->网络层->网络接口层,每层协议前边都加一个头)后,从源主机的网卡优先流出,从数字信号转换为电信号
,顺着网线传输。
经过交换机
、路由器
、交换机
等,到达目标ip后会会进入目标ip的网卡
,然后将电信号转换为数字信号
,然后在经过CP/IP的4层协议层层分拨(网络接口层-->网络层->传输层>应用层),最终将数据展示出来。
网卡是计算机里的一个硬件,专门负责接收和发送网络包
,当网卡接收到一个网络包后,会无脑接受
,通过 DMA 技术,将网络包写入到指定的内存地址,也就是写入到 Ring Buffer ,这个是一个环形缓冲区,接着就会告诉操作系统这个网络包已经到达。
上面介绍知道了:网卡的一个作用就是将数字信号转换为电信号 或者 电信号转换为数字信号
。
确定源ip
其实还有一个非常重要的作用就是确定消息的源ip
:每个计算机通常会有多个网卡
,那么每个网卡对应一个ip
,也就是说一个计算机通过会有只有多个ip
。那么当发送数据包时,应该选择哪个网卡的ip作为源目标ip呢?
-
使用route -n查看当前计算机的路由表,如下
Destination
表示的是路由表中的网络地址
,用来匹配目标ip的网络地址
;GateWay
表示下一跳的设备ip
(可能是路由器、交换机或者是目标ip);Genmaskz只子网掩码;Iface
指的就是网卡
了。通过上图可以看出该计算机有俩个网卡,分别是
eth0
和eth1
。如果目标ip为192.168.3.10,而子网掩码为255.255.255.0时,该ip的网段正好是
192.168.3.0
,所以匹配的是第一条路由
,而第一条路由的网卡是eth0
,那么该数据的源ip
就是eth0的ip
。如果数据目标ip为192.168.20.10,而子网掩码为0.0.0.0时,该ip的网段正好是
0.0.0.0
,所以匹配的是第3条路
由,而第三条路由的网卡是eth0
,那么该数据的源ip就是eth0的ip
。
确定了消息使用的网卡后,那么该消息的源ip的就是网卡的ip
,使用ifconfig
即可查看到对应的网卡的ip了。从下图可以看出eth0网卡的ip是192.168.1.4
。
根据上面的路由表还需要关注几个特别重要的点:
上图中可以确定有
俩个网卡
,也就意味有俩个ip,也就意味着有俩个局域网
。通常
Gateway为0.0.0.0时则代表是局域网
。
如果目标ip的网段为192.168.3.0或者是192.168.10.0时,则表示和本机是在一个局域网内,那么则发送的数据包不需要经过路由器,而是在局域网内使用ARP协议通过广播的形式获取到目标ip的MAC地址,然后在该局域网内使用交换机将数据发送给该MAC地址即完成数据传输了。
通常
Genmask为0.0.0.0是是指默认网关
,指目标ip网络段没有匹配到路由表的其他路由之后,就会走该路由。
表示的是如果目标ip的网段不再192.168.3.0或者是192.168.10.0时,也就是源ip和目标ip不是一个局域网时,则发送给下一跳地址ip为192.168.3.1的路由器。可以发现192.168.3.1其实是属于192.168.3.0网段的,也就是192.168.3.1是属于本机的局域网的。
深入了解
举个例子:假如目标ip为192.168.20.4,该ip不属于本机的局域网
,所以命中默认网关路由
,指明数据的下一跳地址为192.168.3.1的路由器。
此时在192.169.3.0这个局域网内使用ARP协议
通过广播的形式
获取到192.168.3.1 ip路由器的MAC地址
,然后在该局域网
内使用交换机
将数据发送给该MAC地址的路由器
。
接着在继续查询192.168.3.1路由器的路由列表,使用Destination
来匹配目标ip的网络段的路由
,如果匹配到了该路由器局域网,则在该局域网内使用交换机将数据发送目标ip所对应MAC地址即可;如果匹配到的是默认网关,则继续跳到下一个路由器上。以此循环直到找到目标ip的局域网为止。
TCP/IP 4层的作用
- 应用层:组装应用数据
- 传输层:保证数据传输的稳定性以及可靠性。
源端口
是由客户端随机选择的
。客户端会在一个特定的端口范围内(通常是1024到65535)随机选择一个未被占用的端口
作为源端口,用来标识自己;目标端口为请求服务的socket bind端口;源端口和目标端口在整个数据传输过程不变。 - 网络层:指明数据的传输地址,也可以认为实现主机与主机之间的通信,也叫点对点(end to end)通信。主机一般会很会有很多网卡,每个网卡都有自己的ip,主机发送数据时会选择一个合适的网卡将数据流出,该网卡即
源ip
;目标ip
即为请求服务的socket的ip;源ip和目标ip在整个数据传输过程不变。 - 网络接口层: 实现了数据的真正的传输。每个设备,如主机、交换机、路由器等设备都有一个
唯一的MAC地址
。源MAC地址
为数据包所在当前设备的MAC地址;目标MAC地址
为数据包的下一跳设备的MAC地址,通过ARP协议获取
;可以发现,数据在整个传输过程中会经过很多的网络设备,也就是说整个传输过程中的源MAC地址和目标MAC地址都是在一直变化的。
路由器
应用场景
源ip和目标ip不在同一个局域网
时会使用到路由器
(其实也会用到交换机
,网络包经过交换机之后,才会达了路由器,并在此被转发到下一个路由器或目标设备,后面的流程中会详细说明)。
作用
ip路由
根据目标ip的网络段
来匹配当前设备的路由表的Destination
字段,该行的gateway
字段即是当前设备下一跳的ip地址
。路由表中记录着网络地址与下一步应该发送至路由器的地址。在主机和路由器上都会有各自的路由器控制表。在发送 IP 包时,首先要确定目标IP 包的网络地址
,再从路由控制表中找到与该地址具有相同网络地址
的记录,根据该记录将 IP 包转发
给相应的下一个路由器
。如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配。数据转发(同网段件的数据传输)
对于不同网段
的数据转发只能使用路由器
来转发,而不可以使用交换机
。
交换机
使用场景
源ip和目标ip属于一个局域网时数据包的传输不需要经过路由器,只经过交换机
即可。
作用
数据传输
:在局域网内使用ARP协议通过广播的形式获取到目标ip的MAC地址,然后在该局域网内使用交换机将数据发送给该MAC地址即可。
实践
上面说了那么多,可能还是云里雾里的,接下来通过上面这张图来来详细介绍下数据包在网络中的流转过程(数据包的应用层和传输层的头信息在整个传输 顾虑是一直不变的,这里就不再介绍)。
确定源ip: 首先可以确定目标ip为10.1.2.10,通过主机A路由表匹配到了默认路由,该路由的网卡是eth0(图中没有显示,正常路由表后面有一个iface字段),通过ifconfig查看到该网卡的ip为
10.1.1.30
,即为源ip
了。根据目标ip的网络段来匹配主机A路由表,最终匹配到了
默认路由
,也就知道了主机A的下一跳目标地址为10.1.1.1
,此时主机1通过ARP协议在10.1.1.0.24这个局域网内广播可以获取到10.1.1.1的MAC地址;
此时在主机上A的数据包格式如下:
网络层: 源ip:10.1.1.30,目标ip为10.1.2.10;
网络接口层: 源MAC地址:主机A的MAC地址;目标MAC地址:路由器1的MAC地址
由于下一跳地址10.1.1.1与主机A属于
同一局域网
,那么此时由交换机
将主机A上的数据传输到路由器1
上。-
根据目标ip的网络段来匹配路由器1的路由表,发现
有对应10.1.2.0/24网段
,即下一跳的地址为10.1.0.2
。此时路由器1通过ARP协议
在10.1.0.0/24(图中画错了)这个局域网内广播可以获取到10.1.0.2的MAC地址
;此时在路由器1的数据包格式如下:
网络层: 源ip:10.1.1.30,目标ip为10.1.2.10;
网络接口层: 源MAC地址:路由器1的MAC地址;目标MAC地址:路由器2的MAC地址
由于下一跳地址10.1.0.2与路由器1
不属于同一局域网
,那么此时由路由器1将路由器1上的数据传输到路由器2上。-
根据目标ip的网络段来匹配路由器2的路由表,发现
有对应10.1.2.0/24网段
,即下一跳的地址为10.1.2.8
。此时路由器2通过ARP协议
在10.1.2.0/24这个局域网内广播可以获取到10.1.2.8的MAC地址
。此时在路由器2的数据包格式如下:
网络层: 源ip:10.1.1.30,目标ip为10.1.2.10;
网络接口层: 源MAC地址:路由器2的MAC地址;目标MAC地址:路由器3的MAC地址;
由于下一跳地址10.1.2.8与路由器2
不属于同一局域网
,那么此时由路由器2
将路由器2
上的数据传输到路由器3
上。-
根据
目标ip的网络段来匹配路由器3的路由表
,发现有对应10.1.2.0/24网段
,且该网段为局域网
,也就是已经找到目标ip的局域网了
。此时路由器3通过ARP协议
在10.1.2.0/24这个局域网内广播可以获取到10.1.2.10的MAC地址,即目标ip的MAC地址。
此时在路由器3的数据包格式如下:
网络层: 源ip:10.1.1.30,目标ip为10.1.2.10;
网络接口层: 源MAC地址:路由器3的MAC地址;目标MAC地址:目标主机B的MAC地址;
由于
路由器3和目标ip属于同一局域网
,那么此时由交换机
将路由器2上
的数据传输到目标主机上
。目标主机通过网卡将电信号转化为数字信号,然后在根据TCP/IP协议一层一层解析出来数据即可。
总结:
可以发现如果源ip和目标ip不是
一个局域网时
,网络包先经过交换机将数据发送到下一跳的路由器上
(该路由器
和源ip
属于局域网
内,交换机只能在局域网内通过MAC地址传输数据).路由器
根据在所属的路由表将数据发送到下个路由器上
,以此循环,路由器与路由器之间属于不同的局域网
,那么对于不同局域网
内的数据包传输
是路由器
完成的而不是交换机
,路由器传输数据同样是通过ARP协议
获取下一跳设备(路由器)的MAC地址
来完成数据传输的;最后会一直跳到与目标ip相同的
局域网
的路由器上,最后在局域网内通过ARP协议获取到目标ip的MAC地址,最终通过交换机发送数据到该MAC地址上,接着数据也就到达了目标ip的网卡。到此整个数据传输完成。如果源ip和目标ip
不是一个局域网
时,数据是先通过交换机
发送到对应的路由器上
,然后路由器1跳到路由器2,路由器2跳到路由器3….,最终跳到了与目标ip相同的局域网的路由器上
,接着在使用交换机将数据发送到目标MAC上
,最终到达目标ip的网卡,整个过程为源ip网卡->交换机->路由器1->路由器2->路由器n->交换机->目标ip网卡。如果源ip和目标ip不是一个局域网,则数据包在网络中传输时,从当前设备跳到下个设备的过程中,
源ip和目标ip是不变的
,而源mac地址和目标mac地址则是一在变化的.
·