setsockopt() 函数中的 SO_LINGER 选项
一个典型的关闭SO_LINGER选项的原因就是避免最終大量的连接处于TIME_WAIT 状态,从而消耗掉服务器的可用资源,致使新的請求不被接受。
当一个TCP 连接正常关闭时, 发起关闭的一方(active close)发送FIN,
并会在接下来的几分钟内 处于TIME_WAIT 状态,
这会导致大量的很短生存周期的连接存在于系统中导致问题。
当SO_LINGER关闭后,timeout 被設定为0,
TCP栈不会去等待还没有发送出去的数据,而是直接发送RST,
这也会使得TCP 连接产生一个错误。
其实一个比较理想的关闭连接的方法是,设计你的程序协议,
使得服务器要求客户端发起关闭,调用close().
如果要说什么时候使用SO_LINGER选项,
比如用户的错误行为,超时、 返回了一个错误数据时, 都可以设置SO_LINGER
从而避免使连接最終沦为CLOSE_WAIT 和 TIME_WAIT状态