TCP连接的几种异常情况

  • TIME_WAIT作用:
    1、若是LAST_ACK丢失(丢失的周期1个TTL),需要重新发送FIN;
    2、防止同ip和port过早复用连接,导致收到上一个连接的数据。

  • EINTR
    accept、read等慢系统调用,在挂起的过程中,若是进程收到信号,则此挂起系统调用可能返回 EINTR

  • tcp建立连接中涉及2个队列:一个已经完成连接队列(ESTABLISHED),一个未完成连接队列(SYN_RCVD)

  • 服务端accept返回前中止,三次握手刚刚完成,服务端阻塞于accept,此时客户却发送了一个RST,此时accept会返回错误ECONNECTABORT或EPROTO

  • 服务进程中止,
    服务进程中止,内核会关闭其sock,则会向客户端发送一个FIN,并收到客户端的ACK。此时再向客户端sock发送数据,数据到达服务端时,内核发现其接收进程已经不存在,故返回客户进程一个RST。一般客户调用write后,立即调用read。若read在收到RST之前返回,则read返回值为EOF;若read在收到RST之后返回,则read返回错误ECONNREST

  • SIGPIPE,
    若向已经接收到RST的sock继续写入数据,则内核会向该进程发送一个SIGPIPE信号,该信号默认为中止进程。且写操作返回错误EPIPE

  • 服务器主机崩溃
    若是到达主机,所在局域网,则12min后read返回ETIMEOUT,若在中间路由器不可达,则read返回EHOSTUNREACH或ENETUNREACH

  • 服务器主机崩溃后重启
    客户端在服务器奔溃后重启后再发送数据时,会收到一个RST,则read返回ECONNREST

  • 服务器主机主动关机
    linux关机时,init首先会给所有进程发送 SIGTERM(可捕捉)信号,等待一段时间后,然后向仍在运行的进程发送SIGKILL(不可捕捉),则收到信号的进程都会关闭sock。

你可能感兴趣的:(TCP连接的几种异常情况)