1、从 计算机A 的应用层内网通软件向 计算机B 发出一个消息,生成数据。

2、请求从计算机A的应用层下到 计算机A 的传输层,传输层在上层数据前面加上 tcp 报头,报头中包括目标端口以及源端口。

3、传输层数据下到网络层, 计算机A 在网络层封装,源 ip 地址为 计算机A地址,目标 ip 地址为 计算机B 地址。

4、计算机A 将 计算机B 的 ip 地址和子网掩码与自己做比对, 可以发现 计算机B与自己处于相同的子网。所以数据传输不必经过网关设备。

     如果不同子网的话:

网络层同样不会改变之前的数据包,当然也包括之前封装的任何包头,
首先主机A要对目标主机作判断,他会用自己的IP地址和自己的子网掩码进行与运算结果是172.16.12.0,
然后在拿自己的掩码和主机B的IP地址作与运算,假若结果是172.16.12.0,这个时候他知道他们在同一网段内,这时他会封装自己的IP及目标的IP地址,同上层传下来的数据一下向下传。
假若是61.152.251.0,发现不在同一个网段,注意:这时也是用自己IP和目标IP进行封装,然后向下层传递。
在数据链路层这时就不会封装目的的MAC地址,他也不知道MAC地址是什么,这时他会封装网关的MAC地址,而让网关将数据转发出去。
同时在网关收到数据时候,他会查看目标IP地址,当然不是他自己的IP地址了,所以他知道这个数据包是要由他路由出去的,然后路由器查找自己的路由表,若存在到该网络的路由便按路由表从对应接口发出去,
若路由表中没有到该网络的路由则检查是否存在默认路由,如果没有则丢弃数据包,并向源主机发送网络不可达icmp消息。
若一切正常,路由器会把数据包发给了他的邻居或网络运营商的路由器上去,重复以上动作,在TTL值为0之前将数据传递给某X官方网站,数据传递成功!

     (数据包传输到路由器网关上,路由器会把数据包的源MAC会变为路由器的MAC地址,目标MAC会变成下一跳路由器的MAC地址。但是无论经过多少个路与由器,原数据包的源ip地址和目标ip地址是不会改变的)

5、数据包下到 计算机A 的数据链路层进行封装,源 mac 地址为 计算机A的 mac 地址,目标 mac 地址查询自己的 arp 表。

6、计算机A 把帧转换成 bit 流,从物理接口网卡发出。

7、物理层接收到电信号,把它交给数据链路层进行查看帧的目标 mac 地址,和自己是否相等,如果相等说明该帧是发送给自己的,于是将mac帧头解开并接着上传到网络层。

8、网络层查看目标 ip 地址和自己是否匹配,如果匹配即解开ip头封装。然后再把数据上传到传输层。

9、传输层解开对应的包头之后,继续把数据传给应用层,计算机B即可接收到计算机A发的消息。

 

总结:数据向外发送时,数据是由最上面的应用层向下经过一层层封装后发送给物理层;而接收数据时,数据是由物理层向上经过一层层解封后发给应用层。