你有没有想过,当你在手机上刷视频时,那些数据是怎么从几千公里外的服务器准确送到你手里的?这背后有个默默工作的“交通指挥员”——协议栈中的路由表。
路由表是啥?
可以把它想象成一张电子地图。当设备要发数据包时,系统会查这张表,决定这个包该往哪个网卡走、下一跳交给谁。没有它,网络通信就像没导航的车,只能瞎转。
协议栈里怎么实现的?
在Linux这类系统中,路由表通常由内核协议栈维护。每当有数据要发出,IP层就会调用路由查找函数,比如 fib_lookup(),根据目标IP地址匹配最优路径。
常见的路由条目长这样:
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 wlan0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 wlan0
第一行是默认路由,所有不知道去哪的包都发给192.168.1.1(通常是路由器)。第二行表示局域网内的设备直接走本地转发,不走网关。
代码层面咋操作?
开发者可以通过 socket 编程配合 netlink 接口读写路由表。比如用 C 语言添加一条静态路由:
struct rtmsg *rtp = &rt_hdr->rtmsg;
rtp->rtm_family = AF_INET;
rtp->rtm_dst_len = 24;
rtp->rtm_table = RT_TABLE_MAIN;
rtp->rtm_type = RTN_UNICAST;
rtp->rtm_protocol = RTPROT_STATIC;
rtp->rtm_scope = RT_SCOPE_UNIVERSE;
然后通过 NETLINK_ROUTE 套接字把这条规则注入内核。很多路由器固件就是这么干的。
实际场景中的问题
家里装了双宽带,想让下载走电信、视频走联通?这就得靠策略路由。普通用户看到的路由器后台只给了一个默认网关,但高级设置里可以启用多表机制,按端口或IP来源选择不同路由表。
比如你开个BT下载,流量可能被识别并打上标记,协议栈查表时发现这个标记,就走高带宽低优先级的线路,不影响别人看视频。
别小看这张表
一旦路由表混乱,轻则网页打不开,重则整个局域网瘫痪。曾经有人误删了默认路由,结果电脑能上网却ping不通任何设备——因为回程路径断了。
排查时用 route -n 或 ip route show 看一眼,往往就能发现问题。有时候重启路由器就行,但搞开发或运维的就得手动补规则。
现在的智能家居设备越来越多,每个设备上线都要分配路由策略。好的协议栈实现能让这些过程悄无声息,差的可能让你家的扫地机器人连不上App。