1. 背景:
在复习计算机通信相关的知识的时候,有遇到一个问题:网络中两台主机A和B使用IP地址进行通信时,数据包是怎么转发的?
2. 具体的流程:
- 主机A打算通过IP地址向主机B发送信息,首先在主机A的网络层中对数据进行组装,其中:
源IP地址:A的IP地址
目的IP地址:B的IP地址
在主机A的网络层,首先判断主机B的IP地址与主机A是否时属于同一个字网,具体的做法是:主机A使用自己的字网掩码与主机B的IP地址进行“与”运算,得到的结果跟主机A的网络地址进行对比,如果相同则表示A和B属于同一子网,否则属于不同的字网。
-
若A和B属于同一子网,如果A知道B的MAC地址,则在主机A的数据链路层把IP数据包封装成“帧”的形式,其中:
源MAC地址:A的MAC地址
目的MAC地址:B的MAC地址
源IP地址:A的IP地址
目的IP地址:B的IP地址如果A不知道B的MAC地址,则使用ARP协议,发送一个数据包来获取B的MAC地址,获得之后,在使用同样的方法来对IP数据包进行封装。然后直接发给主机B,至此完成数据传输。
若A和B属于不同的子网,A会使用ARP协议发送一个ARP数据包来获取与A相连 接的路由器1的MAC地址,之后再在数据链路层对IP数据包进行封装,其中:源MAC地址:A的MAC地址
目的MAC地址:路由器1的MAC地址
源IP地址:A的IP地址
目的IP地址:B的IP地址然后再把封装好的数据帧发送给与A相连接的网关1.
-
路由器1收到来自内部主机A的数据帧后,知道主机A希望自己转发这个数据帧,于是它就查找自己的路由表,路由器的路由表可以有两种方式进行获得:一是管理员手动添加,称为静态配置,另一种是通过路由器转发的记录自动获得,称为动态配置。在路由表中查到有与目的IP地址网络地址相对应的下一个路由地址后,这里假设为路由器2,就会对来自A的数据帧进行重组,重组后:
源MAC地址:路由器1的MAC地址
目的MAC地址:路由器2的MAC地址
源IP地址:A的IP地址
目的IP地址:B的IP地址
如果在路由器1的路由表中没有找到与主机B的网络地址相关的下一个路由地址,就会把数据发送到路由表中的默认路由地址,这是重组后的数据帧中:
源MAC地址:路由器1的MAC地址
目的MAC地址:默认路由的MAC地址
源IP地址:A的IP地址
目的IP地址:B的IP地址
- 路由器2在接收到路由器1发来的数据后,首先进行判断目的IP地址即主机B的IP地址是不是自己的本地网络内的,如果是自己所在的子网,则不在进行转发,将接收的数据进行重新封装:
源MAC地址:路由器2的MAC地址
目的MAC地址:主机B的MAC地址
源IP地址:A的IP地址
目的IP地址:B的IP地址
其中主机B的MAC地址可以通过ARP协议获得。封装过后再发给主机B,至此数据传输完成。如果不是,所做的事情跟之前路由器1一样,对其重新进行封装后再转发。
- 接下来的每一跳中,经过的路由器进行转发的时候所做的工作就跟路由器2所做的工作一样,直到找到目的IP(主机B)所在的网络。
3. 需要注意的事:
- 沿途所经过的转发的路由器它们并不知道从主机A到主机B完整的路由路径,它们只是知道自己应该转发的下一个的路由地址。
- 数据包在被转发的过程中源、目的MAC地址会被修改,但是相关的IP地址不会被修改。
- 以上所讲的路由器也可以理解为网关。
- 在UNIX下可以使用命令
traceroute + 网址
来对完整的路由信息进行跟踪。