@
hronro 1.不是较真,我以前,还真没去看过 AdBlock 的规则列表,只是见过它自动更新。
看你上一条评论这么一说,我有点好奇了,于是去看了一眼最新的规则列表里的内容,它的 URL 都发在上一条回复你的评论里了。
结论也正如我上一条回复你的评论,全 hostname 的规则,真的不多。
不多的意思是,我原本和你看法一样,以为至少百分之七八十应该是这种纯 hostname 的规则,结果我猜错了...
2.你这说法没问题,没发现自然就跳过了。
但问题是,就算没发现,你仔细想想它的实现细节:
每条 tcp 流做了分割后,对分割后的数据包或者说是数据结构,都要尝试提取一下 SNI-hostname ;
接着还要拿到一个巨大的列表里去做字符串匹配,这一来一回,
对于 CPU 来说,字符串的匹配与列表的索引结构,多少条存取与对比指令的周期给浪费了;
而对于运行速度更慢的内存来说,这些操作还涉及到一堆 malloc 或 realloc 开销,造成更多的时间浪费,就算是极端优化后用预先开辟的环状内存结构,整块内存的存取也需要花费几次内存周期;
最后这些网络数据包还得先缓存到网卡甚至内存中,缓存的数据要处理还得经过系统设备与系统两个队列,最好的方案也是 IOCP 或 epoll 甚至 DMA ,就算如此,它们每次进行系统设备或系统队列的存取,都得来一次总线级别的中断,这在时间上的代价也是相当的大。
你如果不打游戏 + 不大流量下载 + 不压榨路由器 + 路由器买的是非常贵的,那么路由器在闲时,也许这些操作加起来还不到 1 个 ms 的延迟开销,你自然无所谓。
但如果你打游戏 + 大流量下载 + 压榨路由器 + 路由器买的是高性价比版本,那么路由器内各本来各配件的性能不会太高,且工作负载不低,同时你还跑一堆小脚本来压榨它,这样一搞,它处理 sni-hostname 时,对整个系统的处理所造成的延迟就会更大。
3.现在的 http/https ,除了极少骚操作之外,其他基本上都是 TCP 的。另外,运营商也会对 UDP 的优先级做了降级处理。并且很多公司 /单位,因为买了安全设备,比如流控、防火墙、WAF 、入侵检测等等,这些安全设备里往往都有 UDP 防范,所以很多专业的 APP 甚至游戏,考虑了这个问题,当 UDP 环境很差时,很少会用 UDP 。