SO_LINGER作用

2013年1月10日 | 分类: 操作系统, 编程技术, 网络性能 | 标签:

haproxy中有so_linger的选项,这是tcp的一个选项,可以改变tcp的在关闭时的行为。
默认情况下,调用close关闭一个连接:close 函数会立即返回,但当socket发送缓冲区残留数据时,close 函数向缓冲区中写入FIN后,虽然返回了,但是这些数据究竟会怎么样,就不得而知了,只能靠TCP的尽力发送来完成这些数据传输。
因此我们需要一种方法,可以控制close的行为,优雅的处理关闭,这也就是SO_LINGER的作用:

typedef struct linger {
  u_short l_onoff;    //开关,零或者非零
  u_short l_linger;   //优雅关闭最长时限
} linger;

分为3种情况:
1.l_onoff为零,选项被关闭,close的默认行为,进入time_wait。
2.l_onoff非零,而l_linger为零,close清空发送区的数据,向缓冲区写入RST,然后直接返回,这样不会进入time_wait状态。
3.l_onoff和l_linger均非零,close不会立即返回,会阻塞直到:缓冲区的数据和FIN发送出去,并且得到对端确认;或者l_linger的超时时间生效;之后close才返回。(如果tcp设置的是非阻塞模式,close还是会立即返回的)。
第三种可以使得客户端主动发起关闭,避免因为timeout状态造成的服务器端的服务能力下降,参见由于timewait的解析

本文的评论功能被关闭了.