本文摘自:TCPIP详解卷1
当服务器在创建一个新的进程时,或操作系统正忙于处理优先级更高的进程时,到达
多个连接请求。当服务器正处于忙时, T C P是如何处理这些呼入的连接请求?
在伯克利的T C P实现中采用以下规则:
1) 正等待连接请求的一端有一个固定长度的连接队列,该队列中的连接已被T C P接受
(即三次握手已经完成),但还没有被应用层所接受。
注意区分T C P接受一个连接是将其放入这个队列,而应用层接受连接是将其从该队列
中移出。
2) 应用层将指明该队列的最大长度,这个值通常称为积压值( b a c k l o g )。它的取值范围是
0 ~ 5之间的整数,包括0和5(大多数的应用程序都将这个值说明为5)。
3) 当一个连接请求(即S Y N)到达时,T C P使
用一个算法,根据当前连接队列中的连接数
来确定是否接收这个连接。我们期望应用层
说明的积压值为这一端点所能允许接受连接
的最大数目,但情况不是那么简单。图1 8 - 2 3
显示了积压值与传统的伯克利系统和S o l a r i s
2 . 2所能允许的最大接受连接数之间的关系。
注意,积压值说明的是T C P监听的端点已
被T C P接受而等待应用层接受的最大连接数。这个积压值对系统所允许的最大连接数,
或者并发服务器所能并发处理的客户数,并无影响。
在这个图中,S o l a r i s系统规定的值正如我们所期望的。而传统的B S D系统,将这个
本地地址远端地址描述
限制到一个客户进程(通常不支持)
限制为到达一个本地接口:Local IP的连接
接收发往Lport的所有连接
值(由于某些原因)设置为积压值乘3除以2,再加1。
4) 如果对于新的连接请求,该T C P监听的端点的连接队列中还有空间(基于图1 8 - 2 3),
T C P模块将对S Y N进行确认并完成连接的建立。但应用层只有在三次握手中的第三个
报文段收到后才会知道这个新连接时。另外,当客户进程的主动打开成功但服务器的
应用层还不知道这个新的连接时,它可能会认为服务器进程已经准备好接收数据了
(如果发生这种情况,服务器的T C P仅将接收的数据放入缓冲队列)。
5) 如果对于新的连接请求,连接队列中已没有空间, T C P将不理会收到的S Y N。也不发
回任何报文段(即不发回R S T)。如果应用层不能及时接受已被T C P接受的连接,这些
连接可能占满整个连接队列,客户的主动打开最终将超时。