设计TCP服务器,采用如下规则:
1.正等待连接请求的一端有一个固定长度的连接队列,该队列中的连接已被TCP接受(完成三次握手),但还没有被应用层接受。注意:TCP接受一个连接是将其放入这个队列,而应用层接受连接是将其从该队列中移出。也就是使用***.accept()函数来阻塞等待客户的请求。
2.应用层指明该队列的最大长度,这个值被称为“积压值(backlog)”,范围为0~5。也就是使用***.listen(5)函数来指定的队列长度。通常取值5
3.当一个连接请求到达时,TCP使用一个算法,根据当前连接队列中的连接数来确定是否接收这个连接。这不同于积压值,积压值说明的是TCP监听的端点已被TCP接受而等待应用层接受的最大连接数。这个积压值对系统所允许的最大连接数,或者并发服务器所能并发处理的客户数,并无影响。
4.如果对于新的连接请求,该TCP监听的端点的连接队列中还有空间,TCP模块将对SYN进行确认并完成连接的建立。但应用层只有在三次握手中的第三个报文段收到后才会知道这个新连接。另外,当客户进程的主动打开成功但服务器的应用层还不知道这个新连接时,它可能会认为服务器进程已经准备好接受数据了。此后,如果客户程序发送数据,服务器的TCP模块会将接收的数据放入缓存队列。
5.如果对于新的连接请求,连接队列中已没有空间,TCP将不理会收到的SYN,也不发回任何报文段(包括RST),这是一个软错误,而不是一个硬错误。如果应用层不能及时接受.listen(5)中的连接,达到积压值(5),客户的主动打开最终也将超时。