接收到 RST 包后的处理逻辑位于 tcp_input.c at v4.15:
1 | /* When we get a reset we do this. */ |
即根据当前 Socket 所处的状态设置不同的 sk->sk_err,随即调用了 tcp_done 函数,源码位于 tcp.c at v4.15:
1 | void tcp_done(struct sock *sk) |
即设置 Socket 状态为 CLOSE 并执行相关清理操作。其中 ECONNREFUSED 的注释为 Connection refused,EPIPE 的注释为 Broken pipe,ECONNRESET 的注释为 Connection reset by peer。