假设有一堵防火墙,系统管理员已经封锁了许多子网,甚至可能封锁了某个特定国家的所有子网。
例如:
192.168.2.0 / 255.255.255.0
223.201.0.0 / 255.255.0.0
223.202.0.0 / 255.254.0.0
223.208.0.0 / 255.252.0.0
....
为了判断一个IP地址是否被阻止,防火墙可能会使用以下算法。
func blocked(ip)
foreach subnet in blocked_subnets
if in_subnet(subnet, ip)
return true
return false
但是,该算法需要运行太长的时间,时间复杂度为O(n)。如果路由表包含太多条目,则网络几乎将不可用。
有没有更有效的方法将IP地址与大量路由条目匹配?我猜想它基于某种树/图(Trie?)。我已经阅读了一些关于最长前缀匹配和Trie的内容,但并没有理解其中的要点。
223.208.0.0 / 255.252.0.0
。 - shawn