回家

By ganquan, 2009年09月29日 12:15

回家来整整3天了。这边的天气很宜人,昨天在黔灵湖边坐了好久,好舒服。

联通3G网卡用起来感觉还不错,我个人看好WCDMA,TD承载了很多本不应该由一个通信标准来承载的东西。在宿舍已经能搜索到电信的wifi热点了,移动应该有一些大动作了吧。。。

据说封校解除了,是个好事。

无题

By ganquan, 2009年09月24日 21:12

中国很多貌似忠良的品牌都已经彻底变为洋人的东西了,以前就知道不少,今天看到这个帖子更加感觉国货很悲哀。

肯定有很多人又要号召抵制洋品牌,我觉得那些愤怒的青年都是没有自知之明的家伙,打开他们发帖的电脑来看,不知有多少芯片是外国生产的,你不是要抵制吗,你先试试把那些芯片都抠下来看看你还能发帖抵制外国货不。

在我念初中的时候,看到网上有强烈的反日情绪,那是2000-2003年。我记得当时有好多抵制日货的帖子在网络上游荡,一直持续到我上高中,我那个和女人一样不服老的愤青(其实他的年龄已经不能当愤怒的青年了)语文老师兼教导主任整天在课堂上宣扬他在网上学来的那一套日本阴谋论和抵制日货,说日本购买中国煤炭沉海以备战时之需,整天宣传日本阴暗面。当时我就感觉这个不服老的愤青比很多年幼的愤青更容易受到舆论影响,而忘记了自己的本质。我至今都还记得那个老愤青的数码相机和摄像机都是佳能的,对了,我还去过他的办公室,打印机也是佳能的。

我从来就不抵制日货,我也没有仇日情节,因为我有自知之明。这个事其实还有一段缘由:

初中的时候最开始是用猫加电话线拨号上网,当时用户名和密码都是163,一拨就能上,但是速度特别慢,下载东西只有10k左右的速度,有时候还不到10k。后来我初二的时候去电信办了“窄带”(当时我们那里还没有ADSL),就是ISDN,好像叫什么综合数字业务的东东,反正网络接入速度上去了,好几十k,我一下子感觉很棒。

当时弄那个窄带的时候,有一个特殊的猫,还要在机箱里面装个专用的网卡。当时我从电信局花了800块把东西拿回来,回家立马找起子拆开机箱装网卡(现在意识到是当时想上网的欲望让我变得力量无穷,不惧困难,不怕弄坏电脑,毅然自己拆开机箱)。呀,机箱里面原来是这样的啊,好奇的我把机箱抬到写字台上,用台灯照着把主板上的芯片看了个遍,当时我发现那些芯片上有诸如:Made in Japan, Made in Korea, Made in Malaysia之类的字样,我一下就明白了。哦,这些东西都是外国生产的啊,我幼小的心灵里面就想,如果我也抵制日货(碰巧我的主板上Made in Japan的芯片比较多),我就没有电脑用了,也不能上网了,这是多可拍的事情。

在那以后,凡是我看到或者听到抵制日货的言论的时候,我都灰溜溜低头的告诉自己把头埋下来,埋得更低一点,我抵制不了日货,不能和愤怒的青年组成抵制日货的统一战线,我惭愧啊。妈的,桌上的喷墨彩色打印机也是日本的佳能生产的,我立刻就发现我简直和抵制日货没有任何缘分啊!

我思考了一下发现我很懦弱,自己没有当愤青的潜质,于是我索性就敞开怀抱接受日货。
所以高中我就开始嘲笑我的愤青语文老师说一套做一套,真搞笑。我做不到,所以我不胡说八道。

扯远了。反正这就是我不抵制日货的原因。

我突然阴暗的想到一个问题:号称自主知识产权的龙芯将来会不会变成外国货啊?哈哈哈

1,国产要想强大,就要专心研究技术,就要踏实的做产品,别把衣食父母消费者当做猴子耍
2,要专心研究技术,就要有扎实的教育作为基础,别把教育当市场来运作,教育产业化是一个笑话
3,社会风气不正,上面两点办到了都是白搭。给某某TV一点钱,他就可以像狗一样对你摇尾巴,把施舍者以前的丑恶都忘记得干干净净,给钱多一点还可以指使这条XXTV狗去咬其他人。
4,其实我也想爱国货,但是我早晨起床,掀开黑心绵作的被子,用致癌牙膏刷完牙,喝杯过了期的碘超标还掺了三聚氰胺的牛奶,吃根地沟油炸的洗衣粉油条,外加一个苏丹红咸蛋,在票贩子手里买张车票,准时赶到地下烟厂上班,九点三十分偷偷用山寨手机看股票从6124.04点跌到1240.46点,中午在餐馆点一盘用地沟油炒的避孕药喂的黄膳,再加一碟敌敌畏喷过的白菜,盛两碗杯陈化粮煮的毒米饭;晚上蒸一盘病的瘦肉精养大的死猪肉做的腊肉,沾上点毛发勾兑的毒酱油,夹两片大粪水浸泡的臭豆腐,还有用福尔马林泡过的凉拌海蜇皮,抓两个添加了漂白粉和吊白块的大馒头,还喝上两杯富含甲醇的白酒。这么爽快的日子让我乐不思蜀,我哪里还有心情和时间爱国货呢?

妈的,发现我自己说话越来越啰嗦。四个字结贴:体制问题。

笑话一则

By ganquan, 2009年09月22日 17:59

今天下午我突然很想看电影,特别想看高清的,最好是1080的。

然后我开始在网上到处找,对了,我特别喜欢看科幻片。

找了半天无果,我问宿舍人,有啥新出的科幻片推荐没?

一人顺口回答:建国大业

隔离结束了,封校还在继续

By ganquan, 2009年09月19日 21:37

总算不用吃学校送的饭了,豆腐豆芽豇豆,整整一个星期,一共14顿饭,天天都是这几个菜。。。。

还是不能出学校,封校就是一个动作很大意义很小的行为。

TCP协议的TIME_WAIT状态详解

By ganquan, 2009年09月17日 14:09

原创文章,转载请注明出处:www.imganquan.org

我发现有个公司面试的时候问了对TCP协议比较细节的地方,那就写一下帮助自己加深理解和记忆。在开始说TIME_WAIT状态之前,要知道TCP协议是如何关闭连接的。
很多人对TCP协议的三次握手都很熟悉(不知道的可以参考我以前的帖子),因为学校的垃圾考试都爱考三次握手,但是很多知道三次握手的人都对TCP协议是如何关闭连接不了解。不说废话了,TCP关闭连接过程如下图,寡人用photoshop画的,凑合看一下:
tcpclose
为了方便描述,我给这个TCP连接的一端起名为Client,给另外一端起名为Server。上图描述的是Client主动关闭的过程,FTP协议中就这样的。如果要描述Server主动关闭的过程,只要交换描述过程中的Server和Client就可以了,HTTP协议就是这样的。

描述过程:
Client调用close()函数,给Server发送FIN,请求关闭连接;Server收到FIN之后给Client返回确认ACK,同时关闭读通道(不清楚就去看一下shutdown和close的差别),也就是说现在不能再从这个连接上读取东西,现在read返回0。此时Server的TCP状态转化为CLOSE_WAIT状态。
Client收到对自己的FIN确认后,关闭 写通道,不再向连接中写入任何数据。
接下来Server调用close()来关闭连接,给Client发送FIN,Client收到后给Server回复ACK确认,同时Client关闭读通道,进入TIME_WAIT状态。
Server接收到Client对自己的FIN的确认ACK,关闭写通道,TCP连接转化为CLOSED,也就是关闭连接。
Client在TIME_WAIT状态下要等待最大数据段生存期的两倍,然后才进入CLOSED状态,TCP协议关闭连接过程彻底结束。

以上就是TCP协议关闭连接的过程,现在说一下TIME_WAIT状态。
从上面可以看到,主动发起关闭连接的操作的一方将达到TIME_WAIT状态,而且这个状态要保持Maximum Segment Lifetime的两倍时间。为什么要这样做而不是直接进入CLOSED状态?

原因有二:
一、保证TCP协议的全双工连接能够可靠关闭
二、保证这次连接的重复数据段从网络中消失

先说第一点,如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。

再说第二点,如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。

各种协议都是前人千锤百炼后得到的标准,规范。从细节中都能感受到精巧和严谨。每次深入都有同一个感觉,精妙。

一次错误

By ganquan, 2009年09月16日 22:48

在千橡注册过程中,我很老实的点了一个下一步,然后服务器就抛出线程异常了。

我运气这么好?
千橡错误

TCP: time wait bucket table overflow

By ganquan, 2009年09月16日 02:28

redhat网站查到下面的信息,说是因为内存不够的原因。我觉得这个可以当作出现这个问题的解释,但是却解释得不够“完美”,我仍旧还在疑惑中:如果是是因为内存不够的原因,那么在每次测试之前,只要保证机器状态一样,那么TCP: time wait bucket table overflow这条信息的输出次数就应该是一样的,或者差的不是很多,因为每次有一个socket来了,就给一个数据结构,直到内存用完输出TCP: time wait bucket table overflow信息,但是我测试的结果是差异不小,这就让我感觉疑惑了,莫非每次分配的数据结构不一样大?这不可能。我每次单独测试都是重启开发板,然后不运行任何其他程序就进行测试的,这样应该可以保证每次测试机器的状态不是差的很多吧。

The “TCP: time wait bucket table overflow” message shows when the kernel is unable to allocate a data structure to put a socket in the TIME_WAIT state.

This is happening according to linux/net/ipv4/tcp_minisocks.c:

if (tcp_tw_count < sysctl_tcp_max_tw_buckets)
tw = kmem_cache_alloc(tcp_timewait_cachep, SLAB_ATOMIC);

if(tw != NULL) {
(..)
} else {
/* Sorry, if we’re out of memory, just CLOSE this
* socket up. We’ve got bigger problems than
* non-graceful socket closings.
*/
if (net_ratelimit())
printk(KERN_INFO “TCP: time wait bucket table overflow\\n”);
}

This problem is more likely to happen on systems creating a lot of TCP connections at a fast pace. RFC 793 decided that those sockets should stay in the TIME_WAIT state for 2*MSL (Maximum Segment Life), but the Linux implementation seems to make the TIME_WAIT state last for 1 minute.

Monitor the resources used by those time wait buckets by watching:

# cat /proc/slabinfo | grep tcp_tw_bucket

The size of the time wait bucket can be adjusted by writing to /proc/sys/net/ipv4/tcp_max_tw_buckets. However, the link between the client and the server cannot cause packets to arrive out of order, then the TIME_WAIT state can be skipped and sockets can be recycled immediately. Socket recycling can be configured in /proc/sys/net/ipv4/tcp_tw_recycle, but check with your network administrator to verify whether it’s safe to do so.

服务器性能

By ganquan, 2009年09月15日 23:34

时间好快啊,一眨眼就晚上11点过了。赶紧写今天的日记。

今天写了一个超级超级简陋的web服务器,采用epoll多线程的方式:主线程负责accpet,子线程处理链接。问题出在测试环节:

在笔记本上用ab模拟50个并发连接,10000次请求,进行测试,一切OK。可是移植到mini2440开发板上去运行,测试参数不变,就出现这样的输出(截取一部分)
TCP: time wait bucket table overflow
TCP: time wait bucket table overflow
__ratelimit: 1745 callbacks suppressed
TCP: time wait bucket table overflow
TCP: time wait bucket table overflow

我第一反应是服务器连接队列太小,我立刻改大了再测试,还是有问题。我又找了一个别人写的单进程服务器移植到mini2440开发板上来测试,一样有这样的输出。但是这些服务器在笔记本上测试都没有这种问题,很明显是硬件处理能力跟不上的原因。

索性用开发板上自带的boa服务器来测试,靠,问题更加严重,出现好多好多这样的输出。

不解。回头一定要搞明白这个问题。

性能测试结果对比如下,都是在mini2440开发板上进行测试:

1.epoll+pthread服务器,处理10000次请求总共耗时22.341秒,平均每秒处理447.61个请求,测试结果性能最好
2.单进程服务器,处理10000次请求总共耗时28.922秒,平均每秒处理个345.75请求,测试结果性能最差
3.mini2440系统里面自带的boa服务器,处理10000次请求总共耗时26.739秒,平均每秒处理个373.98个请求,测试性能第二

从结果来看多线程方式比单进程的处理方式要好一点,估计boa性能略差的原因是因为boa比较完善,支持动态网页。而另外两个都只支持静态页面。不过这样分析也不对,因为测试时我没有让他们输出任何内容,仅仅是一个报文头而已。所以其实这三个服务器的测试基础是一样的。后面完善了服务器之后再测试一下。

笑话一则

By ganquan, 2009年09月15日 17:41

今天看到一则笑话:《读博士与拉大便的相同点》

1.都是憋出来的
2.肚子里有货才爽
3.即便肚子里面有货 也得有paper才行
4.paper越多心里越踏实
5.paper上的都是屎
6.paper不能是别人用过的
7.paper虽然是别人用过的 但是只要看不出来也可将就
8.运气够好的话可以借到paper
9.没有paper的话 如果你很有钱也能解决问题
10.实在没有paper 直接拍拍屁股走人是很需要勇气的

呵呵,入木三分啊。

中国高等教育就是一个笑话。

最近身边不少同学都在忙碌考研、保研的事情,让我感到惊讶的是不少导师在宣传自己的时候不是以自己的才能或经验来吸引学生,对外的宣传竟然是自己今年有多少个项目,经费如何如何的充足。。。可笑至极!联想到一个事情,一个德国的科学家来中国游学,每到一个研究所参观学习的时候,发现中国人总是喜欢炫耀自己有多少多少先进设备,这个德国人非常反感,因为他们从来不比中国的科研设备差,他关注的是你们中国人用这些设备研究出了什么样的成果。

什么样的思想观念能培养决定培养出什么样的人才。

若干年后,我们可以又一次骄傲地向世界宣布,我们的硕士人数是全球第一,人口素质得到极大提高。

阳光归来

By ganquan, 2009年09月14日 18:18
下午天晴了,持续两天的雨总算停下来。这两天一直宅在宿舍,身体感觉特别难受,我非常肯定我需要运动。

持续两天的雨总算停下来。

这两天一直宅在宿舍,身体感觉特别难受,我非常肯定我需要运动。

当我看到塑胶跑道上的积水反射的阳光时,感觉很恍惚。

P1 穿透

IMG_3135

P2 恍惚

IMG_3140

Panorama Theme by Themocracy