Tuesday, August 30, 2011

Http协议中的Content-Length

上阵子业务部门报告web server有很严重的bug,说是server经常提前关闭下载连接,然后浏览器就把不完全的文件交给了用户,导致服务不可用.

追查得到的信息是,客户端是qq手机浏览器,通过gprs上网,网速很慢,有时候可能导致server认为tcp连接超时而切断连接. 假设一个文件2M,客户端收到了1.5M,之后停顿15秒,则server关闭连接,客户端就把这1.5M的文件当作完整文件交给上层应用,导致服务不可用.

实际上,我们的http回复是有Content-Length头部的,这个头部指明了文件长度是2M.根据http协议4.4节的规定,客户端必须告知用户接收到的文件长度和content-length不一致,但是qq手机浏览器没有这样做.这是违反http协议的.

之后用firefox和ie测试拉一个jpg文件, 故意把content-length写得比实际发送的数据大, 发现这些浏览器也没有遵守这条规定,都是默默的就把图片解析并展现出来了, 也许是出于避免太频繁的骚扰用户的考虑,毕竟网络失败是比较常见的.

但是我在http回复中把Content-Type设置为application/octet-stream,让firefox启动下载管理弹窗,在接收到的数据明显小于Content-Length的情况下, firefox还是默默的显示下载成功,这个就太不厚道了.

修改了web server, 异常切断改用rst包而不是fin包,浏览器就都报错了.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4

4.4 Message Length

When a Content-Length is given in a message where a message-body is allowed, its field value MUST exactly match the number of OCTETs in the message-body. HTTP/1.1 user agents MUST notify the user when an invalid length is received and detected.

Sunday, August 14, 2011

Vmware内应用程序不回应Syc包的问题

我在工作PC(win7系统)装了一个vmware, 跑suse,默认是开启ssh服务的,但是从win7上用ssh客户端怎么都连不上。

开始怀疑是防火墙的问题, 我把win7自带的防火墙关闭了,还是没有效果。

然后怀疑是本地服务没有启动,但是从suse内用ssh客户端是能登录的,netstat也显示端口22是打开的。

最终祭出了tcpdump这个神器,在suse上抓包,发现来自win7发送的syc包到达了suse,但是suse上没有任何回应,三次握手没有完成。

崩溃掉,无法理解这种奇怪的现象。

Friday, August 05, 2011

time_t的类型

time_t没有标准,由实现者自由定义。

在linux中,定义如下

typedef __time_t time_t; // time.h
__STD_TYPE __TIME_T_TYPE __time_t; // bits/types.h
#define __TIME_T_TYPE __SLONGWORD_TYPE // bits/typesizes.h


也就是signed long int,这个类型在32位系统下是32位的, 64位系统下是64位。

--
Best Regards

Thursday, July 16, 2009

雪崩效应

我们的分发系统要从一个源节点向N个末端节点分发F个文件,N在10到200之间,F
则在1个/天到10000个/天之间,文件大小在32byte到2G 之间。这些节点可能散布
在新疆北京深圳,电信网通教育网。末端节点获知源节点有文件要分发的时候,用
udp协议向源节点发送request,而源节点回复 reply包。为了提高效率,我们加了
一个中间节点,这个中间节点把要分发的文件分片cache在自己的内存里,这样只
要一个末端请求了123.flv文件的0x101分片,其余的末端再请求123.flv的0x101分
片的时候,中间节点就可以直接返回给它了。

问题来了,我们最近发现发送的文件如果总大小很大,比如5个小时内向60个ping
值差异很大的节点发送500个80M的文件,则cache会失效,中间节点疯狂的向源节
点转发末端节点的request包,源节点被迫不断的做磁盘随机读取,由于源节点上
磁盘随机读取非常耗时间,于是源节点无法及时回应请求包,而这又导致末端节点
继续发送请求,形成雪崩效应。源节点上listen端口的Recv-Q长久维持一个最高
值。于是整个系统的效率急剧下降。以前1G 的文件五分钟可以分发完毕,但是现
在我们上周试图同时分发50G文件,发了一个周末只有几百M的文件被发出去了。

这里根本的问题就是我们的系统没有过载保护。

Monday, June 22, 2009

有意思的一些玩意

1.Taobao的TOP API
2.Linux下的搜够输入法,可以实现依据搜索关键词更新词库

Wednesday, June 10, 2009

中国大陆最后一个堂吉诃德被SAP开除了

yetaai同学,去年发起了一场针对GFW的法律诉讼,虽然程序走得很漂亮,但是一直没有任何结果,徒劳无功.而大多数网民也不太关注,因为大家都知道结果会是一个大大的零.

yetaai是这样做的.他有一个软件网站在美国的服务器上,有一天被GFW误杀了,在国内访问不了.他就以"未能提供正常服务"为由把中国电信告了,想逼中国电信在法庭供出网站不能访问的真正原因是因为GFW,这样就戳穿了外交部关于中国网络是自由的谎言.

在去年五月的时候,他给SAP的总裁发了邮件,请求后者支持他的诉讼,结果,SAP从此就把他视为眼中针,终于在今年4月跟他解除了劳动合同.

亲爱的堂吉诃德,请谅解我们不能追随你去战大风车
http://www.douban.com/people/yetaai/

Saturday, May 30, 2009

广东人和外星人

一群外星人占领了联合国总部会议室开party,联合国秘书长很震怒,要求安理会常任理事国去驱逐他们。美国派出了FBI,结果外星人把他们都绑起来扔出大楼外。俄国派出了KGB,结果一一被外星人识破,脱光了衣服挂在楼顶。英国的皇家海军,法国的外籍兵团也都失败了。最后胡哥出马,只派了一个人就搞掂。其他几个元首心悦诚服,问胡哥你怎么做到的?胡哥说"没什么,我随便找了一个广东人,要他进去说,'我是楼下开粤餐馆的,有个客人说山珍海味都吃过了,他要吃点新鲜东西!'"