TCP listen()函数内幕

函数原型:

1 int listen(int sockfd,int backlog);

第二个参数规定了内核应该为相应套接字排队的最大连接个数

为了理解其中的backlog 参数,我们必须认识到内核为任何一个给定的监听套接字维护着两个队列

(1):未完成连接队列。每个这样的syn分节对应其中一项:已由某个客户发出到达服务器,而服务器正在等待完成相应的TCP三鹿握手的过程,这些套接字处于SYN_RCVD状态。

(2):已完成连接队列。每个已经完成的三路握手的客户对应其中的一员,这些套接字处于ESTABLISHED状态。

当来自客户的syn到达的时候,TCP在未完成连接队列创建一个新项,当三次握手全部正常完成的时候该项就从未完成队列离开,移到已连接队列的队尾,当进程下次调用accept的时候,已完成连接队列的对头将返回给调用进程,如果队列为空,那么进程将被投入睡眠,直到有新的数据项到来才唤醒他。

对于backlog的最大值的问题,其值是可以修改的,指定一个很大的甚至大于内核所支持的值也是可以接受的,不过,内核会把该值设置成为自己能够支持的最大值。而不返回错误。

原文地址:https://www.cnblogs.com/coversky/p/7847009.html