TCP¶
关闭连接¶
正确的关闭逻辑如下,建议用这种方式代替SO_LINGER:
发送方:send() → shutdown(WR) → recv() == 0(由接收方 close 导致) → close()
接收方:recv() == 0(由发送方 shutdown 导致) → more to send? → close()
FIN_WAIT1¶
当客户端程序异常,一直不处理报文,导致tcp server端发送缓冲区塞满了数据,客户端自己的接收缓冲区也填满了数据。然后server端由于收发包失败会 调用close,于是server端tcp状态机进入FIN_WAIT1,但FIN也发不出去(被憋死)。这种情况叫做orphaned connection
通过设置
proc/sys/net/ipv4/tcp_max_orphans
、/etc/sysctl.conf
可以限制orphaned connection的最大数量
TIME_WAIT¶
通过设置net.ipv4.tcp_tw_recycle = 1
可以将tcp中的TIME_WAIT快速回收,默认为0