TCP的三次握手:
第一次握手(SYN):客户端发送一个带有SYN(同步)标志的数据包给服务器,请求建立连接。此时客户端进入SYN_SENT状态。
第二次握手(SYN+ACK):服务器收到客户端的SYN请求后,发送一个带有SYN和ACK(确认)标志的数据包给客户端,表示同意建立连接。此时服务器进入SYN_RECEIVED状态。
第三次握手(ACK):客户端收到服务器的SYN+ACK包后,向服务器发送一个带有ACK标志的数据包,表示已收到服务器确认的消息。此时客户端和服务器都进入ESTABLISHED(已建立连接)状态,可以开始数据传输了。
为什么是三次握手,而不是两次握手或者四次握手:
假如是两次握手,当客户端第一次发送带有SYN标志的数据包时遇到黑客拦截或者网络中断,数据包会停留在中间的某个网络节点,客户端为了建立连接会重新发送一个SYN包,这次的SYN包成功到达服务器,服务器回复一个SYN+ACK包建立连接。但第一个SYN包又重新连接并送达服务器,服务器会认为这是客户端又发起的一个新的连接。服务器进入等待连接状态,服务端认为是两个连接,而客服端认为是一次连接,造成状态不一致。四次握手则会浪费资源,加重服务器负担。三次握手就很好的解决了网络信道不可靠的问题。
四次断开:
第一次断开(FIN):一方(通常是客户端)发送一个带有FIN(结束)标志的数据包给另一方(通常是服务器),表示请求关闭连接。此时发送方进入FIN_WAIT_1状态。
第二次断开(ACK):另一方收到关闭请求后,发送一个带有ACK标志的数据包给发送方,表示确认收到关闭请求。此时接收方进入CLOSE_WAIT状态。
第三次断开(FIN):另一方(通常是服务器)发送一个带有FIN标志的数据包给请求方(通常是客户端),表示同意关闭连接。此时接收方进入LAST_ACK状态,发送方进入FIN_WAIT_2状态。
第四次断开(ACK):请求方(通常是客户端)收到关闭确认后,发送一个带有ACK标志的数据包给另一方。此时发送方进入TIME_WAIT状态,等待一段时间后进入CLOSED状态,接收方在收到ACK后立即进入CLOSED状态,完成断开。