呼入连接请求队列-TCP

本文摘自: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接受的连接,这些

连接可能占满整个连接队列,客户的主动打开最终将超时。

你可能感兴趣的:(c,算法,服务器)