QSocket – TCP/IP 之路由选择

一个数据包在网络传输时,是如何确定该从那块网卡出去以传送到目的地的吗?这里面的秘密是什么?它就是路由表。

在 Windows 下,可以用 route print 来打印当前的路由表,用 tracert 目标IP地址 可以跟踪实际的数据包到目标的路由过程。下表是我机器上用 route print 命令打印出的路由表的一部分

IPv4 路由表
===========================================================================
活动路由:
网络目标        网络掩码          网关       接口   跃点数
          0.0.0.0          0.0.0.0      192.168.0.1     192.168.0.14     10
        127.0.0.0        255.0.0.0            在链路上         127.0.0.1    306
        127.0.0.1  255.255.255.255            在链路上         127.0.0.1    306
  127.255.255.255  255.255.255.255            在链路上         127.0.0.1    306
      192.168.0.0    255.255.255.0            在链路上      192.168.0.14    266
     192.168.0.14  255.255.255.255            在链路上      192.168.0.14    266
    192.168.0.255  255.255.255.255            在链路上      192.168.0.14    266
     192.168.56.0    255.255.255.0            在链路上      192.168.56.1    276
     192.168.56.1  255.255.255.255            在链路上      192.168.56.1    276
   192.168.56.255  255.255.255.255            在链路上      192.168.56.1    276
        224.0.0.0        240.0.0.0            在链路上         127.0.0.1    306
        224.0.0.0        240.0.0.0            在链路上      192.168.56.1    276
        224.0.0.0        240.0.0.0            在链路上      192.168.0.14    266
  255.255.255.255  255.255.255.255            在链路上         127.0.0.1    306
  255.255.255.255  255.255.255.255            在链路上      192.168.56.1    276

 

首先,我们通过程序调用 socket 接口函数 sendto 或 connect 时,告诉了底层要发送的目标地址,那么,这个在发送数据包时,底层通过将你的目标 IP 地址和网络掩码进行与运算,比如上面的路由表中,我们的目标是 192.168.0.27,则挨个进行掩码运算,然后分别与网络目标进行对比,会发现符合其匹配的是 192.168.0.0/255.255.255.0 的那条记录,所以,操作系统底层将通过该网卡将数据包发送出去。

那么,问题来了,如果有两个符合条件的路由记录怎么办?这个问题就引入了另一个问题:跃点数。跃点数代表的是当前结点到目标结点的需要跳跃的距离的一个数组,这个数越大,代理该链路与目标网络的距离越远。一般操作系统会优先跃点数低的网络进行传输。当然,如果两个一样,那么问题就严重了,操作系统有可能会随机一个,然后下次又随机选择一个,结果造成网络传输出问题,所以这个路由表,一般情况下应是唯一的。

那么,当我们将一个数据包发送到超过局域网的范围会发生什么事情呢?

首先,在本机要进行一次路由选择。因为是发往外网的,所以与各类掩码最后的结果会落到 0.0.0.0/0.0.0.0 的记录上,这条记录被称做默认路由,会发送到链路对应的网关地址进一步路由。

接下来,网关将收到的数据包与本地的路由表进行匹配,然后同样一顿匹配发现不是自己的那么它就会根据网关的路由规则选路发送到上一级的路由器。

最终,数据包被逐级转发到目标地址的上一级路由,然后它进行匹配后,发现是自己的内部网络的设备IP地址,它就会将数据包转发到目标 IP 对应的物理网络设备,完成数据包的传输。

那么,当目标 IP 收到数据包时,回复数据包是否一定会按原路返回?当然不一定,这取决于中间经过路由器的路由规则,而且返回时的路由表中某一级万一错了的话,回应数据包甚至有可能无法返回到源,造成连接无法完成。

分享到: