状态解释
- SYN_SENT:客户端状态,发送tcp连接请求,等待服务端返回
- SYN_RECV:服务端状态,服务端收到客户端连接请求,发送确认请求
- ESTABLISHED 连接已建立
- FIN-WAIT-1:客户端状态,发送释放连接请求
- CLOSE-WAIT:服务端状态,收到客户端释放连接请求,发送确认报文,进入此状态
- FIN-WAIT-2:客户端状态,客户端收到释放连接确认报文,等待服务端发送连接释放报文,之前还需要接受服务端发送的最后数据
- LAST-ACK:服务端状态,服务端最后的数据发送完毕,发送连接释放报文,服务端进入此状态
- TIME-WAIT:客户端状态,客户端收到服务器的连接释放报文后,发出确认,进入次状态,注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态
- CLOSED:服务端只要收到客户端确认报文,进入此状态,客户端需等待2msl时间
问题
-
为什么四次挥手?
服务端收到释放请求后,可能还有剩余任务需要处理,需要等待处理完成后才能释放连接
-
为什么客户端在收到服务端释放连接请求后,不马上断开?
网络不可靠,最后一个ack可能丢失,服务端如果没有收到,会不断重复发送fin,所以客户端不能直接close
-
客户端故障会怎么样?
tcp 设有一个保活计时器,服务端每收到客户端请求就会重置计时器,时间通常为2个小时,如果2个小时没收到客户端请求,服务端就会发送一个探测报文段,以后每个75秒发送一次,若连续10次都没有反应,则关闭连接