三次握手:
- 第一次握手:server确认自己的收信能力和client的发信能力
- client(客户端)发送了一个SYN(J)包给server(服务器),然后等待server的ACK回复,client进入 SYN-SENT 状态 即主动半打开状态。
- 第二次握手:client确认自己的发信能力和server的收信能力
- server接收到SYN(seq=J)包后就返回一个ACK (J+1)包以及一个自己的SYN(K)包,然后等待client的ACK回复,server进入 SYN-RECIVED 状态 即被动半打开状态。
- 第三次握手:server确认自己的发信能力和client的收信能力
- client接受到server发回的ACK(J+1)包后,client进入 ESTABLISHED (确认)状态。然后根据server发来的SYN(K)包,返回给等待中的server一个ACK(K+1)包。等待中的server收到ACK回复,也罢自己的状态设为 ESTABLISHED 。到此TCP三次握手完成。
注:
- 三次握手是为了满足“在不可靠信道上可靠的传输信息”。
四次挥手:
- 第一次挥手:client主动请求结束连接
- 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请求结束连接
- server向client发送FIN(N)包,请求关闭连接,同时server进入 LAST-ACK 状态。
- 第四次挥手:client回复server,表示同意结束连接,server关闭,client4分钟后自动关闭
- client收到server发送的FIN(N)包,进入 TIME-WAIT 状态。向server发送ACK(N+1)包,server收到client的ACK(N+1)包以后,进入 CLOSE 状态;client等待 一段时间 还没有得到回复后,判断server已经正式关闭,进入 CLOSE 状态。
注:
- 一段时间:
- 一般为4分钟,4分钟就是2个MSL(最长报文寿命)。
- 四次挥手中间两次不合并:
- 握手过程,通信只需要处理连接。而挥手过程,通信需要处理 数据+连接。
- 当收到客户端断开连接请求时(第一次挥手),服务器端可能还在处理客户端的数据 / 向客户端发送数据,如果二三次挥手合并,此时客户端需等待服务器端处理完数据,造成资源浪费。