TCP/Socket连接的状态,为什么这样设计?怎样查看状态以及分析其问题?

1.TCP连接建立、连接释放和状态图



  • 1)粗实线箭头表示对客户进程的正常变迁
    2)粗虚线箭头表示对服务器进程的正常变迁
    3)细线箭头表示异常变迁

2.TCP三报文握手为什么不是两次或者四次?

  • 1)为什么不是两次?
    主要是为了防止已失效的连接请求报文突然又传送到了B,因为产生错误。
    A发出连接请求,第一次的连接请求在某些网络节点滞留超时,于是A再重传一次连接请求。第二次重传正常建立连接、传输数据、关闭连接。然后第一次滞留的连接请求有发送到了B。
    此时如果是两次,则B向A发送确认报文段,建立连接。但是A此时并没有建立连接的请求,不会理睬B的确认。B却一直等待A发来数据。B的资源就浪费了。
  • 2)为什么不是四次或者更多?
    首先,第三次A确认报文丢失后,并不影响正常工作,AB之间的连接不会建立,也就不会浪费资源;
    其次,这里涉及到一个无限确认的问题,如果再进行多次的确认,也无法真正确认双方的报文没有丢失,而且会导致协议复杂,资源浪费;
    最后,即使第三次ACK丢失,那么Server端该TCP连接的状态为SYN_RCVD,并且依次等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。 如果重发指定次数后,仍然未收到ACK应答,那么一段时间后,Server自动关闭这个连接。但是Client认为这个连接已经建立,如果Client端向Server写数据,Server端将以RST包响应,方能感知到Server的错误。

3.怎样利用TCP的状态诊断故障原因?

参考

  • TCP连接的状态详解以及故障排查

你可能感兴趣的:(TCP/Socket连接的状态,为什么这样设计?怎样查看状态以及分析其问题?)