TCP建立连接是三次握手的理由:
- 第一次client—>server client发送一个SYN(J)包给server,server接收到之后server可以确认client的发送和自己的接收是没有问题的;
- 第二次server—>client server接收到SYN(seq=J)包后就返回一个ACK(J+1)包以及一个自己的SYN(K)包,client端接收到后client可以确认server的发送和自身的接收是没有问题的;( 注:这个时候server端并不能确定自己的发送是否有问题,加入恰巧server端的发送时存在问题的那么在这时server端给client端发包就是对资源的浪费,所以需要第三次握手。)
- 第三次client—>server client接收到server发回的ACK(J+1)包后,进入ESTABLISHED状态。然后根据server发来的SYN(K)包,返回给等待中的server一个ACK(K+1)包,server端确认自己的发送也是没有问题的,这时连接已经建立,可以开始正式的通信。
TCP断开连接时的四次挥手:
- 第一次client—>server client发送一个FIN(M)包,此时client进入FIN-WAIT-1状态,表明client已经没有要发送的包;
- 第二次server—>client server收到了client发来的FIN(M)包后,向client发回一个ACK(M+1)包,此时server进入CLOSE-WAIT状态,client进入FIN-WAIT-2状态;
- 第三次server—>client server向client发送FIN(N)包,请求关闭连接,同时server进入LAST-ACK状态;
- 第四次client—>server client收到server发送的FIN(N)包,进入TIME-WAIT状态。向server发送ACK(N+1)包,server收到client的ACK(N+1)包以后,进入CLOSE状态;client等待一段时间还没有得到回复后判断server已正式关闭,进入CLOSE状态。
client请求关闭连接并收到server的确认后只是代表client端不在发送数据但仍可以接收server端发来的数据,只有server发来关闭连接请求client发出确认,client等待一段时间还没有得到回复后client才才关闭连接,此时双向连接关闭。