Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2033956
  • 博文数量: 369
  • 博客积分: 10093
  • 博客等级: 上将
  • 技术积分: 4271
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-21 00:59
文章分类

全部博文(369)

文章存档

2013年(1)

2011年(2)

2010年(10)

2009年(16)

2008年(33)

2007年(146)

2006年(160)

2005年(1)

分类: 系统运维

2010-08-01 17:43:50

一般情况下,服务器端的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) |
给主人留下些什么吧!~~

xiaosuo2010-12-15 14:43:39

才发现,原文忘记把具体的tcp选项加入了,汗。

chinaunix网友2010-12-14 17:44:30

linux中有个叫defer accept的东西