标签:
从我毕业那天起,我就打算往网络编程方向走,因为互联网无极限,可惜技术不够,只能先找份嵌入式软件工程师来干。刚刚上班,我就下了《TCP/IP详解》系列来看,可是一页都看不明白,这tmd是什么鬼?之后搞vxworks、linux+Qt,一直停留在调界面和业务逻辑,偶尔也玩一下服务器,但是一直都是停留在调用socket以及相关的接口,但这已经是我接触网络编程的极限了。
但自从我换了份服务器开发工程师的工作之后,在我一步步努力之下,今天我终于再次和《TCP/IP详解》碰面了。
我想,这就是缘分,只要心里想着那件事,并且为之努力,那么和它的缘分就肯定会到来。
好吧,还是说回那个bug。
主程的意思是这样的,在服务器进入工作状态之后,会调用listen(int fd, int backlog)来侦听客户端的连接,这个backlog虽然不怎么起眼,但是却和tcp协议息息相关。我翻到《TCP/IP详解卷一:协议》的第195页,那里写backlog是侦听队列的最大数,书上写最大是5。我很好奇,够用么?如果是大并发的话,侦听队列就只有5个位置,要等每次accept取走之后才空出来1个位置,大并发来得及么?当然书上也没有说大并发情况下来不来得及,所以我就搜了一下代码里面是怎么写的,发现那个参数传的是SOMAXCONN,winsock2.h里面定义这个值是0x7fffffff,那么大!实际上有多少能用呢?这得要明天测试过才行。
另外,在这个找资料的过程中,我还发现了一个新东西,就是listen的完成队列和未完成队列。TCP3次握手,在第二次握手成功后,这个连接就放在未完成队列里面,而3次握手成功的,就会放在完成队列里面。完成队列里面有数据,就会触发accept来读取连接,从而建立数据传输的socket。而且相关资料还表示,那个backlog是完成队列和未完成队列的总和,但是没有表示各占多少比例。我猜想这就表示没有比例的说法,就是谁用得多就占得多,像链表那样。
那么问题就来了,如果队列的长度真的有SOMAXCONN那么多,那主程的猜想就是错误的,不是因为这个队列满了导致连接不上,是别的原因。但是我觉得队列是有个上限的,不应该会这么长。所以我明天打算就开个写个测试代码,思想是这样的,服务器端就只有listen,客户端不停地循环connect,直到满了为止,看看能connect多少个。不知道可不可行,如果不行就另外想办法测。
能够研究这些小东西,其实也是种乐趣。
标签:
原文地址:http://my.oschina.net/chrisforbt/blog/473813