下面是对unix network programming
4.5节的总结
对此归纳几点,函数原型
int listen(int sockfd, int backlog);
为了理解backlog就要明白
内核实际上维护着两个队列(queue)
1. incomplete connection queue
2. completed connection queue
在1中,服务器受到来自客户端的SYN,等待完成三步握手
这时socket是被标记为SYS_RCVD状态的
在2中,每个client都完成了三步握手
这时socket被标记为ESTABLISHED状态
所以说两个队列的总数不可以超过backlog的数值
并且当一次三步握手完成之后,1中的这个entry会被移到2中的尾部
从内部看一下
当服务器受到客户送到的SYN,如果这时队列已经满了
TCP会忽略他们,但是不会发送RST,这就让客户端知道
“这个服务器只是暂时队列满了,一会儿再发SYN”
如果客户受到的是RST,那么客户的connect函数就会返回一个错误
让程序去处理,而不是继续发送SYN了
数据在三步握手结束之后就会到来,但是在服务器调用accept()之前
数据都要被queue在缓存里
[ 本帖最后由 madfrogme 于 2012-7-24 13:11 编辑 ]