【网络学习】A-B主机在同一子网和不同子网中的通信过程

同一子网

两台主机分别为A和B,A主机中如果使用名称访问B主机必须先使用DNS,将B的名称解析为IP,然后A主机一以自己的IP为源地址,B的IP为目标地址封装IP数据包,同时使用A自己的网卡接口的子网掩码和B的IP进行与运算,如果B和自己在636f70797a6431333262353438相同网络机载接口直接发送出去。但接口在发送时还需要将IP数据包封装成数据帧,这需要两台主机的MAC地址。如果A知道B的MAC,则直接使用B 的MAC作为数据帧中的目的地址,如果不知道则向网络中发送ARP广播,将B的IP解析为MAC。
得到B的MAC地址后完成数据帧的封装,将数据帧用高低不同的电平值表示发送到物理线路中就可以了。这是同一子网中A向B的单向通信过程。

不同子网

不同子网的通信过程中,DNS的名称解析是一样的。在数据包当中封装的源IP是A,目标IP是B,这个也一样。但是当A主机使用接口掩码和B的IP进行与运算后会发现两个IP不在同一子网,这是A会将这个数据包发送给本网络的网关(通常是本网的路由器),由网关来转发。另外,在封装数据帧时,主机需要知道B的MAC地址,向外广播要求解析B的MAC,但B不在本网络,所以只能有网关的ARP代理功能实现,但A主机得到的并不是B的MAC地址,而是网关的MAC地址,所以A在数据帧中封装目的地址为本地网关。接下来从接口发送出去,当数据到达网关,网关会读取数据包中的目的IP,并根据目的IP进行转发,在转发时数据包中的目的IP不变,但数据帧中的源MAC地址和目的MAC地址都会发生变化。源MAC地址变为网关的发送接口的MAC地址,而目的地址可能是B主机的MAC或是下一个路由器的接口MAC。这就是不同子网的单向通信过程。B向A的通信和此过程是一样的。

 

 如下摘自:https://blog.csdn.net/whueratsjtuer/article/details/89702586

学习计算机网络如果只是被动的接受知识的话,不但枯燥,效率低下,而且理解也不够深。这里我推荐一款网络仿真软件cisco packet tracer。这款软件最有价值的地方在于用户可以通过软件来模拟真实的网络,能够零成本搭建一套计算机网络。我们可以边学网络边用这个软件来进行仿真,验证所学知识。

下载链接:https://www.netacad.com/courses/packet-tracer  学生版是免费的,学习的话足够了。

下面是软件主界面的截图 :

 

 

 

我们看看同一网段内的主机是怎么通信的。

1. 假设我们有如下的一个子网:

 

 

 

三个主机通过一个hub进行连接,我们知道hub是第一层(物理层)设备,所以它只具备无脑广播的功能。

此时,子网内的任何一个两个主机之间的通信都是通过广播的方式来进行,而且一次只能允许一台主机发送消息(冲突域),否则同一条线路可能同时传输两个信号,会相互干扰。这种通信方式效率非常低,因此hub现在已经很少使用了。

2. 把上图中的hub换成switch:

Switch是第二层网络设备(数据链路层),它具备了数据单播的能力,因为switch具有自学习能力(其实就是维护一个mac-address-table),保存了跟它连接的设备的mac地址与端口的映射关系。

 

 

 

数据链路层的数据包格式如下:

 

 

 

 它包含了目标mac和源mac。当数据包从一台主机(MAC地址为X)发送另一台主机(MAC地址为Y)时,数据包先发送交换机上,交换机在mac-address-table更新X和端口的映射。然后查询Y是否在表中,如果存在则将数据转发到该端口;如果不存在则广播到所有端口上,Y主机收到以后返回一个数据包到交换机,交换机更新Y的映射关系。这样下载X再给Y发送数据的时候,就不需要广播了。

如果一个网段内主机非常多,这个表可能会是TB级别的,不易扩展和维护。那我们可以采用这样一个办法,那就是将多个主机组成一个子网,这个子网共用一个逻辑地址(其实就是IP地址),子网的网络设备只需要维护子网内的主机就行了。然后将许多子网连接起来组成一个更大的子网,这样可以一直扩展下去,理论上就可以容纳无穷多台主机了。如下图:

 

 

 

有了IP地址以后,我们边可以将数据包先发送到目标主机所在的子网,剩下的可以依据上面的原理就可以发送到目标主机了。

注:先看看IP数据包的大概格式。可以看到数据格式跟数据的流动方式密切相关的。数据从主机A的应用层依次往下进行封装,在后再路由器先解封,在重新封装,最后发到目标主机进行解封,所以才有了上面的数据格式 

 

 

 

 

3. 在同一子网中,两个主机要通过IP地址进行通信,过程是怎样的呢?

以ping命令为例,当我们用PC0 ping PC1时,数据包发送过程如下图所示:

 

 

 

总结一下,每次同一子网内主机之间要通信之前,源主机都要查询目标ip是否在自己的mac-ip映射表中,如果不存在就要通过arp协议来寻找目标主机的mac地址,找到目标主机的mac之后,源主机会将目标主机的mac-ip添加到映射表中,然后就可以开始点对点发送数据了。

下面来看看不同网段之间主机之间的通信过程。

假设我们有如下的网络拓扑结构:

 

 

 

我们要跟目标主机通信,就必须知道目标主机的ip和mac地址。如果源主机与目标主机不属于同一子网,那么目标mac地址为默认网关的mac地址。随后数据被发送到默认网关,发送的方式参考上面同一子网内主机的通信(因为默认网关与源主机必定是在同一个子网中的)。默认网关收到后,将目标mac地址设置为下一跳的路由器的mac地址(找不到下一跳的mac地址就使用arp协议,广播到所有子网设备)。在这一过程中目标IP和源IP始终不变,只有目的mac地址不断变化。

为什么要同时使用mac地址和ip地址?

不同的地址作用于不同的层,mac作用于数据链路层,ip作用于网络层;数据包中,“mac地址包在ip地址之外面” ,每当一个数据包被解析时,总是mac地址先被解析到。如果数据包的mac地址跟当前设备的mac地址不符,则直接丢弃,反之会继续向上层发送,这样能够提高效率。所以可以这样理解,ip地址是逻辑地址,它可以计算网络的最短路径,为数据包指明了下一个应该去的设备,将下一个设备的mac地址设为目的mac地址,从而使得该数据包能够被送到那个路由器。

总结起来可以这么理解,ip地址为数据包去向指明了方向,下一个站是哪里;而mac地址有点类似于一个跑腿的,能够将数据包运送到指定的设备。因此,可以看到在整个传输过程中目的ip始终不变,应为它表明了数据包的终点,每次到达一个路由器,都会计算出下一步怎么走最优,一旦找到了下一个目标路由器,则将目的mac设为那个路由器的mac,至于怎么到达,就不是ip地址需要操心的了,而是由数据链路层和物理层负责。

posted @ 2020-04-29 12:43  gtea  阅读(6141)  评论(0编辑  收藏  举报