连接管理是分为两大块的: 1.建立连接:三次握手的过程 2.断开连接:四次挥手的过程
1.为了更好的保证可靠性,建立连接的过程就是让通信双方都确认验证一下各自的发送和接受能力是否能够正常 2.协商一些重要参数
假设我们现在在打电话,那么通信双方刚接通电话的时候就会有这样的情景:
在TCP的实际连接过程中,是需要经历一下过程的:
三次握手中几个重要的状态: LISTEN:相当于手机打开了,有信号了,可以随时有人打电话进来 SYN_SEND/SYN_RCND:建立简介过程期间,如果建立连接顺利,这两个状态都是一瞬间就会消失的 ESTABLISHED:表示建立连接完成,可以开始正是通信了
用两人分手的例子再来向大家做一些解释:
在TCP的实际连接过程中,是需要经历一下过程的:
对于CLOSE_WAIT的解释: 一般而言,对于服务器上出现大量的 CLOSE_WAIT 状态, 原因就是服务器没有正确的关闭 socket, 导致四次挥手没有正确完成. 这是一个 BUG. 只需要加上对应的 close 即可解决问题。(文件泄露问题)(一些文件出现相关异常也可能会导致跳过了close方法)
对于TIME_WAIT的解释: 谁主动断开连接,谁就进入了TIME_WAIT状态,到这一步的时候该主机已经完成了四次挥手的过程,但是仍然不能立刻释放资源,而是要以TIME_WAIT状态来保持一段时间的连接后在彻底释放资源(为了处理ACK丢包之后自动重传的问题,TIME_WAIT的时间是2MSL)
将三次握手改成两次行不行? 【不行,主机A还要给主机B应答,这样才能保证双方都能确认连接】 将三次握手改成四次行不行? 【行,但是没必要,因为ACK和SYN都在内核中,是同一时间发送的,把两个包合并成一个比较高效】 将四次握手改成三次行不行? 【ACK实在内核中的,FIN是需要处理完一些数据之后才会发送,ACK和FIN发送的时期不同,如果出发了延时应答机制(让ACK晚一会发送),就可以】