SO_LINGER作用
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的解析。
发表评论