Skip to content

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