TCP三次握手
-
客户端发送SYN给服务端, 并指明初始化序列号ISN(c), 此时客户端为SYN_SENT状态
-
服务端接收到客户端的SYN报文, 并将客户端的ISN+1作为ACK的值发送给客户端, 此时服务端的的状态为SYN_RCVD
-
客户端接收到SYN报文后,同时返回ACK给服务端,此时客户端的状态时为ESTABLISHED, 服务端接收到ACK后状态也变成了ESTABLISHED
为什么需要三次握手,而不是两次?
在第一次挥手时,客户端发送报文后,验证了客户端的发送能力和服务端的接收能力,第二次挥手验证了服务端的发送能力,但客户端的接收能力,无法在两次握手时告诉服务端; 同时客户端在发送消息时,会有信道不稳定的状态,延时阻塞的信息会多次请求建立连接, 浪费服务器的资源。
TCP四次挥手
-
客户端从ESTABLISHED状态,向服务端发送断开连接的请求,附带FIN和序列号的一个报文,此时状态为FIN_WAIT1
-
服务端接收后,会发送接收的序列号+1作为ACK的值给客户端,代表自己已经接收到断开连接的请求,此时服务端的状态为CLOSE_WAIT
-
服务端也同意断开连接,则和第一次挥手一样,发送FIN及序列号给客户端,状态为LAST_ACK
-
客户端收到后表示好了,我收到了,咱们断开吧,于是状态为TIME_WAIT,服务器:好咧,断开!CLOSED,确保服务器收到了,此时客户端也安心的CLOSED了
为什么需要四次挥手,而不是三次?
服务端在收到客户端断开连接Fin
报文后,并不会立即关闭连接,而是先发送一个ACK
包先告诉客户端收到关闭连接的请求,只有当服务器的所有报文发送完毕之后,才发送FIN
报文断开连接,因此需要四次挥手