一般情况下,服务器端的TCP socket在收到客户端发回的第一个ACK,完成3次握手后,就进入可读状态,即有新建立的连接可以accept。但是,通常这个新建立的连接并没有数据可读,导致accept后再次阻塞在read系统调用(当然,如果服务器需要首先发送数据,则不需要阻塞)。显而易见,只为一个accept就唤醒进程,有些不太值得。
为此,BSD系列操作系统引入了框架,和三个具体的accept filter实例:
- : listen socket在收到client的数据后才可读。
- : listen socket在收到一个完整的DNS请求后才可读。
- : listen socket在收到一个完整的HTTP请求后才可读。
Linux上的对应实现为TCP socket选项TCP_DEFER_ACCEPT (since Linux 2.4):
Allow a listener to be awakened only when data arrives on the
socket. Takes an integer value (seconds), this can bound the
maximum number of attempts TCP will make to complete the connec-
tion. This option should not be used in code intended to be
portable. |
其效果等同于accf_data. Linux没有实现特定协议的accept filter,可能是因为不想维护应用协议特定代码,和很多客户端请求都能放进一个TCP数据包里面。
EOF
阅读(6163) | 评论(2) | 转发(0) |