Linux多网卡与路由

之前在调试Linux多网卡驱动时,想在应用层实现默认网关的自动切换,需要了解路由的知识,特此总结。

路由

路由是指数据包从源节点到目的节点过程中,决定端到端路径的行为。说白了,就是数据在网络中从一个主机到另一个主机的传递路径。举个例子,我上班需要从家(A)走到公交站(B)坐130路车到大公司(C),那么我上班的路由就是A -> B -> C。

路由表

可以理解成是保存某个主机的所有路由信息的集合。还是说上班那个例子,我也可以从家里(A)走到公家站(B)先坐220路车到达山东路公交站(B1),再转106路车到达公司(C),所以A -> B -> B1 -> C也是一条路由信息,那么这两条路由信息都属于我的路由表。

路由器

路由器主要负责查询数据在网络中的传递路由信息,并完成数据包的投递。再举个公交车的例子,假如有一天我想去五四广场(D)玩,但不知道坐哪路车,所以我先从家里(A)走到公交站(B),查了一下站牌信息,需要做128路车到达,接着我就等车来然后坐车抵达目的地。在这个情景中,公交站就相当于路由器,帮我查到坐车信息并经此抵达,相应的A -> B -> D就是对应的路由。

以上只是对这几个重要概念的简单理解,真实网络环境中肯定要复杂许多。

多网卡

正常情况下,嵌入式板子有一个网卡就够用了,要么WiFi,要么以太网。但有时候需要多个网卡的情况,以连接不同的子网。运行ifconfig命令可以查看系统网卡信息:

$ ifconfig
eth0     Link encap:Ethernet HWaddr 00:0C:29:C2:8D:7E
         inet addr:192.168.10.223 Bcast:192.168.10.255 Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:100
         RX bytes:0 (0.0 b) TX bytes:420 (420.0 b)
         Interrupt:10 Base address:0x10a0

eth1     Link encap:Ethernet HWaddr 00:0C:29:C2:8D:88
         inet addr:192.168.56.136 Bcast:192.168.56.255 Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
         RX packets:603 errors:0 dropped:0 overruns:0 frame:0
         TX packets:110 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:100
         RX bytes:55551 (54.2 Kb) TX bytes:7601 (7.4 Kb)
         Interrupt:9 Base address:0x10c0

上面信息表明我的系统中有两个以太网卡,一个网络接口连到 192.168.10.* 段网络,另一个网络接口连到 192.168.56.* 段网络。再来看一下路由表信息,运行route命令可以查看:

$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.10.0   * 255.255.255.0 U     0    0   0  eth0
192.168.56.0   * 255.255.255.0 U     0    0   0  eth1
127.0.0.0      * 255.0.0.0     U     0    0   0  lo
default   192.168.10.1 0.0.0.0 UG    0    0   0  eth0

上述 route 命令输出信息中各项的含义请看下表:

Destination  目标网段或者主机
Gateway  网关地址,”*” 表示目标是本主机所属的网络,不需要路由
Genmask  网络掩码
Flags  标记。一些可能的标记如下:
    U - 路由是活动的
    H - 目标是一个主机
    G - 路由指向网关
    R - 恢复动态路由产生的表项
    D - 由路由的后台程序动态地安装
    M - 由路由的后台程序修改
    ! - 拒绝路由
Metric  路由距离,到达指定网络所需的中转数
Ref  路由项引用次数
Use  此路由项被路由软件查找的次数
Iface  该路由表项对应的输出接口

可以看到路由表里有4条路由信息。如果要发送的数据包的目的地址是192.168.56.8,跟第一条路由信息的子网掩码做与运算得到192.168.56.0,可判断与路由信息中目的网络地址不符;再跟第二条路由信息的子网掩码做与运算得到192.168.56.0,正是第二行的目的网络地址,因此数据从eth1网卡发送出去,由于192.168.56.0正是与eth1接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。如果要发送的数据包的目的地址是114.114.114.114,跟前三条路由表条目都不匹配,那么就要按缺省路由信息,从eth0网卡发出去,首先发往地址为192.168.10.1的路由器,再让路由器根据它的路由表决定下一跳地址。

通过上面的分析可以发现,若使网络中任意两个节点能够通信,要么在路由表有对应的路由信息,要么通过默认网关进行转发。

纯个人理解,如有问题,欢迎指正~~~

你可能感兴趣的:(Linux多网卡与路由)