«

»

Sep 26 2013

透明串接HTTP80端口缓存加速的缺陷分析

刚好快国庆,根据国情,过轻的分析一下这个东西蛤蛤。

感兴趣的朋友可以去研究一下喽,这玩意设计之初可是对互联网有贡献的呦,但是时至今日,他已经老了。

不过刚好发现这篇文章里岂不是通篇的敏感词汇?我这写完了之后才发现,于是只好一点一点的先把自己和谐一下哈哈哈(苦逼脸)

あややや!!

既然要批评人家,那么首先就要先把人家的好地方先说了,我不是CCAV,我也不是无节操记者,

看名字就知道,透明串接缓存加速,说白了就是直接在用户到服务器这段网络上新增一个设备,进行缓存,当重复访问相同文件的时候,命中缓存,直接返回缓存内容,减少上行带宽的使用,同时加速下行用户的访问速度,优化用户体验。

说白了,可以认为和浏览器缓存一样,这回变成了好多好多用户共享同一个浏览器缓存一样。(再不理解我也没办法,谁让你们没事就用流氓软件清理磁盘了)

 

不过就向我开头说的,他已经老了。如果这个技术放在很久以前,应该会很有用,因为早期大家带宽都很少,没有光纤技术,大部分流量也都是http(思科甚至为了这点事自己开发了WCCP协议)。但现在不是了,我们有光纤,单根10GBps带宽无压力(理论值),我们还有无线(WiFi和3G),我们还有我们还没有的4G。

不过即使这样,毕竟是一个技术,鸡肋鸡肋,食之无味,弃之可惜(后来我就被拖出去斩了……),至少也要让我分析一下她的各种缺陷喽(反正都会被拖出去斩了……)

 

 

透明串接HTTP80端口缓存加速的缺陷分析:

1、缓存过期问题
一般来说,网络上的对象(object)可以定义一个过期时间,比如QQ网站上的QQ安装包,定义了缓存有效时间为10分钟。在10分钟之内,重复访问此对象可直接命中缓存(HIT),不会向网络发送任何请求,也不消耗网络上的任何流量。10分钟过后,再次请求此对象时,浏览器会先向网站发送请求,确认文件是否有更改。如果网站回应文件未更改(UNMODIFIED),则继续复用缓存中的内容;如果网站回应文件已更新(MODIFIED),则重新下载文件。
当链路中有加速设备的时候,遵循上述逻辑可以节省网络流量,并且优化客户端用户上网体验。

服务器端的缓存控制

服务器端的缓存控制

但是网络对象也有可能不定义这个过期时间。这些对象可能会经常更新,比如实时新闻、正在编辑的代码等,服务器不希望用户缓存这些对象,防止出现用户获得信息延迟的问题。
一般规定(RFC2616),代理是不缓存此类信息,强行缓存此类信息会导致用户无法获取更新的信息,影响用户体验。
但某些代理应用可以强制缓存(比如squid使用参数ignore-no-cache),强行缓存服务器未定义缓存有效时间的文件,甚至改写服务器已定义的缓存有效时间(比如将上文中的QQ安装包从缓存有效时间10分钟覆盖成1个月)。这样做的好处是可以很明显的削减网络的使用,并加速用户对速度的体验。但是这样做是违背(注释)的,其后果会造成用户长时间内无法获取同一url的新内容。

squid中一些违背HTTP协议规范的参数

squid中一些违背HTTP协议规范的参数

因为网络中经常会出现此类现象,很多网站都不得已用其他方式做规避,比如QQ安装包现在每次更新都会更换文件名,每次更新后url都会变化,不会再命中此代理的过期缓存。
但也有无解的情况。CentOS使用的YUM,Debian、Ubuntu使用的apt-get,提供这些系统rpm包或deb包的服务器,一般都不希望用户缓存某些文件,否则会出现下载rpm包或deb包的MD5值与服务器提供的MD5值不相同的情况。

命中不希望命中的缓存

命中不希望命中的缓存2

目前有很多厂家制作此类缓存加速产品,并且很多大陆运营商都会在用户链路上部署类似网络加速产品(二级运营商几乎都会部署此类产品,部分一级运营商也有在3G链路上部署此类产品)。如果你察觉网站内容确实已经更新,但自己浏览器死活都无法刷新出最新的内容,尝试Ctrl+F5,浏览器会发出“无视任何缓存直接请求服务器”的请求

当然如果链路中的加速设备使用了很无节操的参数ignore-no-cache(无视浏览器发出的“无视任何缓存直接请求服务器”),那么你可以骂街了。(squid在3.2版本中就移除了ignore-no-cache,因为其违背HTTP/1.1,参见Squid configuration directive refresh_pattern。但是难免无节操的开发者不再把这功能再加回去。有的,我已知的就好几个)

 

毕竟网络带宽有限,在不改变链路的情况下节省对带宽的使用,从而变相的扩大带宽。

总之,初衷是好的,做得太过分了就不太好了。(就像把枪支全部收缴统一管理以防暴民危害老百姓,结果反而变成了爆栗职法的保护伞)

 

 

2、兼容性问题

既然初衷是好的,那么如果好好利用的话,就需要继续考虑其他的缺陷。

透明串接HTTP80端口透明代理,其设计方式一般有两种:1、链路设备直接监听链路的80端口,并进行劫持代理;2、链路设备仅监听本地的某一端口,链路中的流量使用防火墙劫持并转到本地代理端口进行代理。

监听端口的进程,一般来说都是代理进程。这种应用的工作就是接收用户的请求,理解用户请求,并模拟用户动作,向服务器发起新的请求。这个过程中,“理解用户请求”与“模拟用户的动作”将成为整个代理的关键点。

早期时,服务器(Web Server)与客户端(Brower)都是使用非常标准的请求(Request)和应答(Response),简单,易懂,代理进程很容易理解客户端请求,并模拟这个请求。

但是时代在发展社会在进步,http协议的开发性越来越高,经常会出现私有应用和专用服务器,客户端(Some APP)会向指定的服务器(Modified HTTP Server)发起专属的请求,服务器也会向客户端发起专属的应答。此类请求和应答只有这种客户端和这个服务器懂。这就向一群人中突然冒出来两个说方言的一样,其他人听不懂,也学不来,但是人家交流没问题。

这种情况下这种代理就会出问题,或者无法理解这种特殊的请求,丢给客户端一个“4xx请求错误”,拒绝代理,客户端请求失败,上不去网;或者不懂装懂自己做了一个请求发给服务器,服务器对代理“无法理喻”,返回代理“4xx请求错误”,代理失败,客户端还是上不去网……总之被坑的永远是用户。

 2013年9月29日更新:萃香同学说了一下随机参数,我突然就想起来这么一件事:大家有遇到过在线看视频时出现拖动进度条之后发现视频竟然从头播放了的情况吗?个人觉得这种情况很普遍(bilibili甚至还有6分钟诅咒,看完6分钟后直接跳到第12分钟的情况),这是另外一种代理理解不能。萃香同学说的参数,在在线视频的flv播放器上是有使用的,他能通过参数调节播放进度。而某些代理会忽视这后面的参数。没有参数的请求只能从头播放,所以无论怎样拖动进度条,视频终究会从头播放……

 

上述说的是使用80端口的私有应用和专用服务器,他们走的仍是HTTP服务,只不过使用了非标准的请求(Request)和应答(Response)。还有一种情况,客户端和服务器跑的根本就不是HTTP服务(比如BT),代理更是无法理解,会直接报400 Bad Request,代理失败,客户端上不去网……总之被坑的还是用户。

(没节操的运营商会说:哈哈好,P2P封掉一个又节省带宽了!)

 

 

在这插一句,某些特殊应用还可能会用80端口走HTTPS服务(本来应该走443的),80端口如果有劫持的话,会出现证书错误,这个时候你就要小心自己的账号密码了。(1、有兴趣的朋友可以去了解下HTTP和SSL,请自行谷歌)(2、事实上劫持443端口并不是什么新鲜事,大家遇到证书错误一定要多多谨慎)

 

 

3、性能问题和加速效果问题

如果上述问题过来之后,节操都保住了,那么恭喜你,性能问题会让你觉得节操什么的保住了也没用!(喂喂那也不能丢掉啊喂)

既然是缓存加速,那么免不了要把流量保存下来,那么保存在哪呢?1、内存;2、硬盘。

内存,8G、16G、32G、64G,好了有再多的内存恐怕你也没槽位插了,断电就没,成本太高。

硬盘,现在的硬盘都白菜价,500G都跟不要钱似的,容量不要钱。

但你别忘了,你带宽是多少的?20Mbps的?为了个20Mbps的带宽专门搞一台双网卡的服务器做代理缓存加速?妥妥的200Mbps都不够用啊。虽然个人用户企业用户的带宽少得可怜(贵啊,享受着全球最贵的宽带和最烂的宽带服务),但是最想做加速的不就是卖带宽的么,只要我能加速10%,那么我1G的带宽就能变成1.1G!10G的带宽就能变成11G!

作者语:不考虑再铺一根光纤(一根光纤10G无压力)整天净想着低投入高回报,丧心病狂。(好吧其实我回避了交换设备的问题)

好吧,就算可以,那么考虑一下有多少流量是走80端口的。少了吧,加速没效果。那咱就往多了说:100M!就100M!

也就是说每秒会有100M流量要代理,要加速,要缓存!要写硬盘!去给我找块写速度100M的硬盘出来。

机械的就不要想了,就算速度跟得上,便宜货这种高负荷不写断针就不错,贵的,你刚才不是还在考虑成本么?

那么固态硬盘,固态硬盘这玩意虽然蹦出来好多年了,相对于传统机械硬盘,有着逆天的读写速度,以及……很短的读写寿命,你还要不要继续考虑成本问题了?

说完了硬盘,别忘了还有CPU、内存、网卡。缓存加速与交换机路由器不一样,交换机是2层的(MAC),路由器是3层的(IP),就算更高端的带负载均衡路由器也只是4层而已(TCP/UDP)。缓存加速是第7层的(HTTP),对上述资源消耗与普通交换设备和路由设备都不一样。(而且交换设备和路由设备都是靠硬件做的,就如同PC的显卡处理图像对CPU消耗很小一般)

 

最后说一下加速效果:

刚才也提到了,现在这时代,走带宽的大部分都不在是传统HTTP了,比较走带宽的流量都是P2P,HTTP除了传统下载(用了下载软件后还是会变成非80端口的P2P),就只有优酷土豆这种在线视频了(优酷的flash还支持P2P,而且别忘了iku客户端),所以现在消耗带宽的流量中,80端口HTTP没什么事,所以加速效果……那个刚才我说什么来着?我给忘了。

 

 

总之,暂时能想到的缺点就这些。个人认为,要想提升带宽,最佳的解决办法,就是增设光缆,提升交换机和路由器的吞吐率,踏踏实实,不偷鸡摸狗……啊不对,是投机取巧。当然,这些事情不符合国情。

最后恶意鄙视一下运营商的用户数量限制功能(也有称防私接、1拖N)的。用户买的是带宽,2M宽带,10M宽带,用户都是这么买的,你们竟然强行限制路由器后的设备数量,有没有节操……啊,不对,节操是被狗吃了还是被拉粪车压了?这年头谁没几个wifi设备?(我在北京三家合住,其中有一家刚搬走,现在就有10台设备上网:我一台笔记本,一个3DS,一个手机,一个ipad,一个树莓派;对门2人一人一个笔记本,一人一个手机,再加1个ipad),我们买的是带宽,不是用户数。

当然这也不符合国情,曾经有一次我对着运营商大骂,老子就是有这么多设备要上网,老子有钱,你有种给我接6根线进来!结果人家没种……哦不,没端口,不给办。(毕竟人家是垄断企业嘛,不要节操也不要种人家也不想让你好好上网嘛……真要有什么对不住的地方,你TMD来打我呀!)

12 comments

Skip to comment form

  1. 萃香西瓜

    据说有些网页地址后面加一个随机数做参数就是用来防止被缓存的

    1. 石樱灯笼

      加随机参数也阻止不了恶意缓存

    2. 石樱灯笼

      感谢您的留言,看了您的留言之后我突然想起了关于优酷的一些事情,已经补充在正文中了。

  2. 别问我是谁

    这个到现在用处不大的吧。最有用还不如如何 go across the wall.

    1. 石樱灯笼

      嗯,现在几乎没有用途。这功能现在不是这么用的。另外长城什么的我不敢关心,我在北京。

  3. 一树小草

    一线运营商会好点么?

    1. 石樱灯笼

      能好一些,不过感觉好景不长了。

  4. 方室网志

    限制用户数量?电信、网通、联通、铁通?

    1. 石樱灯笼

      All of them

      1. 方室网志

        如果是4M带宽,会限制多少用户?

        1. 石樱灯笼

          联通用户请咨询10010,电信用户请咨询10000,铁通用户请咨询10050,其他小运营商请咨询对应客服。投诉请咨询工信部。谢谢。

  5. PremierZhou

    squid的缓存机制很有问题 我喜欢用Nginx+Memcache或Vanish 没有试过本地应用 看性能来说 非阻塞才是一切的关键 如nginx的核心永远是非阻塞 而ngx_proxy协议另一头经常是阻塞的 也就是说没有真正的意义和价值(对于动态网页还有更多严重问题 例如vanish有set-cookie项都不会缓存 这会另命中率极大的降低 ) 不会带来性能的真正飞跃 对于本机来说 这是无必要的

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据