Author Archive

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.

服务器性能

时间好快啊,一眨眼就晚上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比较完善,支持动态网页。而另外两个都只支持静态页面。不过这样分析也不对,因为测试时我没有让他们输出任何内容,仅仅是一个报文头而已。所以其实这三个服务器的测试基础是一样的。后面完善了服务器之后再测试一下。

笑话一则

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

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

呵呵,入木三分啊。

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

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

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

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

阳光归来

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

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

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

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

P1 穿透

IMG_3135

P2 恍惚

IMG_3140

西安,大雨

9月13日,大雨。

摄于海棠9号楼3楼天井露台
IMG_3120

一次DoS攻击

甲流了,封校了,在宿舍憋了一天。晚上学校孝敬我的饭菜没有拍照,只好明天再拍照纪念。
白天又蹉跎了,唉。。。

TCP协议的3次握手过程如下图所示(朕用photoshop随便画的,将就看一下):

tcp_shakehand

罗嗦一下:客户端发送SYN,服务器收到后发送对应的ACK 和自己的SYN,客户端收到对自己的SYN确认后,发送对服务器SYN的确认,客户端完成建立连接。服务器收到客户端对自己的SYN的确认,整个TCP连接建立完成。

如果要进行一次DoS攻击,则可以在3次握手的过程中进行破坏,破坏方法如下图:

DoS

利用原始socket修改源地址,使得服务器把ACK发送到一个不存在的地址,然后服务器就会傻逼一样等待这个不存在的地址的应答信息,那就一直等吧,等到地老天荒去。但是服务器还没有这个能耐等到地老天荒海枯石烂,服务器的未完成连接队列长度是有限的,所以当那些不存在的地址把这个队列霸占之后,合法的主机再来连接服务器就会被deny。

以上就是DoS攻击的原理。
下面开始攻击:

目标服务器:我的mini2440开发板,上面运行了一个http服务器,端口80,地址是192.168.0.222
在我的主机上访问这个地址是完全正常的,如下图:

2009-09-12-235327_432x236_scrot

然后开始攻击:

2009-09-12-235534_482x125_scrot

可以看到当前发送速率如下:

2009-09-12-235648_698x138_scrot

发送一段时候后,再次访问http://192.168.0.222,结果如下:

2009-09-13-000325_473x376_scrot

可以用tcpdump抓包看到,发送的数据包源地址都是随机伪造的:

21:49:04.958398 IP 165.73.220.37.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.958402 IP 182.200.63.94.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.958406 IP 218.31.87.38.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966416 IP 132.23.33.98.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966424 IP 200.16.93.88.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966430 IP 171.242.43.18.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966436 IP 78.39.31.69.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966442 IP 34.132.193.5.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966448 IP 55.211.162.46.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966454 IP 89.112.75.6.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966460 IP 215.57.37.36.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0

代码过程如下:
1.生成原始socket
socket(AF_INET,SOCK_RAW,IPPROTO_TCP)
2.设置socket选项
setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));
设置了IP_HDRINCL选项,需要手动为IP数据包填写IP数据包首部内容。
3.填写两个结构体:struct ip 和 struct tcphdr
4.伪造源地址并且发送给服务器
ip->ip_src.s_addr = random();
sendto(sockfd,buffer,head_len,0,(struct sockaddr *)&addr,sizeof(struct sockaddr));

一点了,睡觉去。

H1N1来袭

今天据说我们班有个同学荣幸地被救护车接走了。理所当然的我们就要“被送饭”了。果不其然,中午就发了口罩,刚才把饭送来了。顿时搞得人心惶惶。不过学校很搞笑的是要隔离居然隔离一个班,跟小孩子过家家一样。谁都知道应该隔离一座楼。。。

恩。咱们西安市长安区郭杜镇南雷村马钢厂附属蛐蛐养殖示范学校一向都喜欢过家家。。。

上图:

P1 发给我的口罩

IMG_3114

p2 米饭一盒,量比较少

IMG_3107

p3  菜一盒,量更少

IMG_3106

=END=

板子归来

1.下午收到卖家寄来的新板子

2.上两张图

P1 板子到手,刷Android

IMG_3103

P2 我的屏幕好脏啊

IMG_3100

调程序的小女孩

实验室里冷极了,没有窗户,不知道是白天还是黑夜。这是一周的最后一天——周末。在这又冷又黑的晚上,一个蓬头散发的小女孩在工位上坐着。她从家里出来的时候还穿着一件外套,但是有什么用呢?那是一件很大的外套──那么大,不知是哪一年买的。她工作的时候的,就把它脱掉了,实验室的师弟嘲笑说,可以拿它当抹布。

小女孩只好一个人做实验,一双小脚冻得红一块青一块的。她的破显示器屏幕上有一大段程序,手里草稿纸上还有一大段。这一整天,程序还是没调过,谁也没帮过她。

可怜的小女孩!她又冷又饿,哆哆嗦嗦地调程序。显示器的光落在她的干枯的长头发上,那头发卷曲着披在肩上,看上去很久没梳,不过她没注意这些。每个桌上都堆满了论文,实验室飘着一股油墨的香味,因为这是论文deadline的时间——她可忘不了这个。

她在一行代码上停了下来,蜷着趴在桌子上。她觉得更冷了。她不敢跟老板说,因为她程序没调过,没拿到一个数据,老板一定会骂她的。再说,换做别的题目跟这个一样难。她们头上只有paper,虽然网上可以下到一些现成的代码,还是仍然没法用。

她的头脑几乎绝望了。啊,哪怕一次小小的成功,对她也是有好处的!她敢把上万行的代码修改一遍,编译运行一下,来找找问题么?她终于按下回车键开始运行。哧!程序开始输出信息了!一行一行的log开始出来了!她把小手拢在显示器上。多么温暖多么明亮的字符啊,简直像一支小小的蜡烛。这是一道奇异的火光!小女孩觉得自己好像坐在一个19寸液晶大显示器前面,显示器还是全新锃亮的,颜色鲜艳,字迹清晰,上边显示着程序输出的正确结果,多么舒服啊!哎,这是怎么回事呢?她刚把头伸出去,想看的仔细一些,程序crash了,大显示器不见了。她坐在那儿,眼前的破显示器上一行刺眼的segment fault。

她又编译了一遍运行。程序又开始输出信息了,给出log了。显示器的光落在桌子上,那儿忽然变得像打印出来的paper那样洁白工整,她可以一直看到paper上的字迹。IEEE的logo,会议名称和日期,Abstract和Instroduction。更妙的是这篇paper赫然署着自己的名字!看上去那么诱惑,一直向这个穷苦的小女孩走来。这时候,程序又crash了,她面前只剩一张又硬又旧的桌子。

她又运行了一遍。这一回,她感觉自己坐在布置整齐的会议室里。条幅上写着“博士毕业答辩”,比她去年师姐毕业时用的条幅还要大,还要美。红色的条幅上贴着那几个白色的黑体字,投影仪屏幕上许多幅美丽的彩色画片,跟顶级会议里的presentation一个样,在向她眨眼睛。小女孩向画片伸出手去。这时候,程序又crash了。只见ppt上的图片越升越高,最后成了在天空中闪烁的星星。有一颗星星落下来了,在天空中划出了一道细长的红光。

“有一个什么人快要死了。”小女孩说。唯一疼她的师姐毕业前的时候告诉过她:一颗星星落下来,就有一个灵魂要到图灵那儿去了。

她又编译了一遍。这一回,她把所有的数组size都设大了。师姐出现在亮光里,是那么温和,那么慈爱。

“师姐!”小女孩叫起来,“啊!请把我带走吧!我知道,程序一crash,您就会不见的,像那漂亮的显示器,发表的paper,布置好的答辩会议室一个样,就会不见的!”

她赶紧按了回车键,要把师姐留住。一大堆输出信息发出强烈的光,把实验室照得跟白天一样明亮。师姐从来没有像现在这样高大,这样美丽。师姐把小女孩抱起来,搂在怀里。她们俩在光明和快乐中飞走了,越飞越高,飞到那没有代码,没有论文,也没有毕业的地方去了。

第二天清晨,这个小女孩坐在工位上,两腮通红,嘴上带着微笑。她死了,在周末的实验室累死了。新一周的太阳升起来了,照在她小小的尸体上。小女孩坐在那儿,手还按着在不知用过多少年的键盘上。

“她想自己把程序调一下……”人们说。谁也不知道她曾经看到过多么美丽的东西,她曾经多么幸福,跟着她师姐一起走向新世界的幸福中去。

不会智力题

洗澡出来看到5个题,据说是腾讯某年的笔试题。
1、请定义一个宏,比较两个数 a、b 的大小,不能使用大于、小于、if 语句
解:
这个简单 #define MIN(A,B) ((A)<=(B)?(A):(B))

2、如何输出源文件的标题和目前执行行的行数
解:
这个我只知道在linux下是这样,不知道windows下是否可行
int main(int argc, const char *argv[])
{
printf(“%s\n”,__FILE__);
printf(“%d\n”,__LINE__);
return 0;
}

3、两个数相乘,小数点后位数没有限制,请写一个高精度算法
解:
写高精度算法,数组相乘。算法描述一下,代码不写了:
(1)输入A到a数组,逆序一下。
(2)输入B到b数组,逆序一下。
(3)a和b做竖式乘法,加上进位,结果保存在数组c中。
(4)逆序输出数组c。

4、写一个病毒
解:
shell病毒也算病毒吧?
.(){.|.&};.

5、有 A、B、C、D 四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时 1、2、5、10 分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在 17分钟内这四个人都过桥?
解:
不会做。每次看到这种题目就烦心。