Chinaunix首页 | 论坛 | 博客
  • 博客访问: 682369
  • 博文数量: 77
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1173
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-16 11:20
个人简介

将技术做到极致...

文章分类

全部博文(77)

文章存档

2019年(3)

2015年(27)

2014年(47)

分类: LINUX

2014-08-12 11:00:37

   最近在工作发现一种情况:如果有多条路由信息时,我们的socket连接、ping命令等到底是走哪条路由信息呢?针对该问题我把我的处理步骤做一下简单的描述。

一、路由选择
    a、第一种情况优先判断主机地址(socket连接的目标地址)是否有对应的路由信息设置,如果有优先选择走该路由信息。
    b、第二种情况根据路由信息上的子网掩码计算出主机地址所在的网段,与路由信息的目标地址所在的网段,是否在同一网段,如果是同一网段则走该路由信息。
    c、第三种情况以上两种情况都不成立的情况,我们就根据默认路由顺序进行判断了,默认路由顺序排前的优先选择。

二、IP对应网段计算
   a、路由信息查看
         在linux下查看当前路由信息可以通过命令="route -n"进行查看,具体参考如下:
        /root#route -n
        Kernel IP routing table
        Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
        172.20.10.0     0.0.0.0         255.255.255.240 U     0      0        0 wlan0
        192.168.5.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
        0.0.0.0         172.20.10.1     0.0.0.0         UG    0      0        0 wlan0
        0.0.0.0         192.168.5.254   0.0.0.0         UG    0      0        0 eth0
        根据上面的路由信息,我们可以知道前两条是本地路由,后面两条信息是默认路由。
    b、网段计算
         下面以connect连接的主机ip=“192.168.5.92”为例,首先我们根据上面路由选择的三种情况,按优先顺序进行判断走的是哪条路由。
          主机没有对应的路由信息设置,我们要根据每条路由信息上的子网掩码计算网段:下面是C的部分实现代码:
            unsigned long test_ip,test_ip1;
            int test_netmask;
            inet_pton(AF_INET,“192.168.5.92”,(void *)&test_ip); 
            inet_pton(AF_INET,“每条路由信息上对应的目标地址(Destination)”,(void *)&test_ip1);
            inet_pton(AF_INET,“每条路由信息上对应的子网掩码(Genmask )”,(void *)&test_netmask);         
            test_ip=test_ip&test_netmask;
            test_ip1=test_ip1&test_netmask;    
            inet_ntop(AF_INET, (void *)&test_ip, tmpipstr, INET_ADDRSTRLEN); 
            inet_ntop(AF_INET, (void *)&test_ip1, tmpipstr1, INET_ADDRSTRLEN); 
            strcmp(tmpipstr,tmpipstr1)//比较两个网段,如果属同一网段选择对应的路由
        通过计算ip=“192.168.5.92”走的是192.168.5.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0这条路由。

三、默认路由选择
    如果路由选择的前面两种情况对不成立的话,这个时候就要考虑默认路由的选择了,这种情况的前提是默认路由信息也有多条,这个时候我们就要按默认路由的顺序考前的优先选择。


        
    
阅读(2215) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~