tcp连接断开的一些面试常识

在三次握手阶段,主动连接方式依次经历: SYN_SENT ESTABLISHED状态,被动连接依次经历:SYN_RECEIVED   ESTABLISHED状态,主动连接放发送同步SYN报文后会进入STNC_SENT状态,被动连接方收到SYN报文后会发送SYN和 ACK报文并进入SYN_RECEIVED状态,等主动连接方收到这个SYNACK确认报文后会再次返回一个 ACK报文,使得双方建立起连接,这里面有一些面试中基本的问题

1.为什么需要第三次握手?

 如果两次握手,若有延时的SYN报文到达被动连接方后,被动连接方返回一个 SYNACK给主动连接方,但是主动连接方已经跟和被动连接端连接了,所以主动连接方会丢弃这个包,但是对于被动连接方来说,会保持这个连接(若只有两次握手,发送SYNACK后会立即进入ESTABLISHED状态),相当于浪费服务器的连接资源!


在断开连接的四次挥手中,主动断开方依次经历:FIN_WAIT1 FIN_WAIT2 WAIT_OUT CLOSE状态,被动断开方依次经历:CLOSE_WAIT LASC_ACK CLOSED状态,主动段开方断开时向被动断开方发送FIN报文并进入FIN_WAIT1状态,被动断开方收到FIN报文后回复ACK并进入CLOSE_WAIT状态,被动断开方再发送FIN给主动段开方并进入LAST_ACK状态,主动段开方收到FIN后发送最后的ACK并进入TIME_WAIT状态,被动断开方收到最后的 ACK报文后进入CLOSED状态

1.TIME_WAIT状态存在的意义

 网络是不可靠的,无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文,客户端发送的ACK在网路上丢失,这样服务器端收不到最后的ACK,重传定时器超时,将重传FIN到客户端,由于客户端关于该连接的所有资源都释放,收到重传的FIN后,它没有关于这个FIN的任何信息,所以向服务器端发送一个RST报文端,服务器端收到RST后,认为搞连接出现了异常(而非正常关闭)

你可能感兴趣的:(tcp连接断开的一些面试常识)