listen函数小结
listen 用来监听tcp socket的连接请求;
函数形式为int listen(int sockfd, int backlog);
要明白backlog参数的含义,我们必须明白对于一个listening socket,kernel维护者两个队列,
1.一个未完成连接的队列,此队列维护着那些已收到了客户端SYN分节信息,等待完成三路握手的连接,socket的状态是SYN_RCVD;
2.一个已完成的连接的队列,此队列包含了那些已经完成三路握手的连接,socket的状态是ESTABLISHED
backlog参数历史上被定义为上面两个队列的大小之和,Berkely实现中的backlog值为上面两队列之和再乘以1.5,但是目前根据上图可知,backlog现在的意思是指已完成连接队列的大小。当客户端的第一个SYN到达的时候,TCP会在未完成队列中增加一个新的记录然后回复给客户端三路握手中的第二个分节(服务端的SYN和针对客户端的 ACK),这条记录会在未完成队列中一直存在,直到三路握手中的最后一个分节到达,或者直到超时(Berkeley时间将这个超时定义为75秒)。
如果当客户端SYN到达的时候队列已满,TCP将会忽略后续到达的SYN,但是不会给客户端发送RST信息,因为此时允许客户端重传SYN分节,如果返回错误信息,那么客户端将无法分清到底是服务端对应端口上没有相应应用程序还是服务端对应端口上队列已满这两种情况。