listen函数的定义如下所示:
#include <sys/socket.h> int accept(int sockfd, struct sockaddr * restrict addr, socklen_t *restrict len); 返回值:若成功则返回文件(套接字)描述符,若出错则返回-1
对于每一个listen socket,内核都会为维护两个队列:
调用accept函数正确返回之后,就表示TCP三次握手已完成,SYN队列中相应的分组会被加到ACCEPT队列中。
#include <sys/socket.h> int accept( int sockfd, struct sockaddr * restrict addr, socklen_t *restrict len); 返回值:若成功则返回文件(套接字)描述符,若出错则返回-1
当客户端的第一个SYN到达的时候,TCP会在未完成队列中增加一个新的记录然后回复给客户端三路握手中的第二个分节(服务端的SYN和针对客户端的ACK),这条记录会在未完成队列中一直存在,直到三路握手中的最后一个分节到达,或者直到超时(Berkeley时间将这个超时定义为75秒)。
如果当客户端SYN到达的时候队列已满,TCP将会忽略后续到达的SYN,但是不会给客户端发送RST信息,因为此时允许客户端重传SYN分节,如果返回错误信息,那么客户端将无法分清到底是服务端对应端口上没有相应应用程序还是服务端对应端口上队列已满这两种情况。
对于应用服务器来说,如果ACCEPT队列中有已经建立好的TCP连接,却没有及时把它取出来,这样,一旦导致两个队列满之后,就会使客户端不能再建立新连接,引发严重问题。所以,一些服务器会使用一个主进程来做accept获取连接,而让其他工作进程来进行其他数据处理等工作,这样可以防止不能及时的去accept获取连接。
tcp/ip协议listen函数中backlog参数的含义,布布扣,bubuko.com
原文:http://blog.csdn.net/wan_hust/article/details/38499743