对于通信工程师来说,TCP/IP的三次握手和四次握手是很常见的问题,但对于小白来说却是不明觉厉的难题,为了更好的帮助小白学习,今天搜集信息,归纳总结,为小白一一解惑。
三次握手
三次握手外文名为three-way handshake,全称为需要三个步骤才能建立握手/连接的机制,进行三次握手的主要目的是确认双方的接收能力和发送能力是否正常,制定自己的初始化序列号,为后面的可靠性传输做准备。
如图所示:
第一次握手:客户端将标志位SYN置为1,随机产生一个值为J的seq,并将该数据包发送给服务器端,客户端进入SYN——SENT状态,等待服务器端确认。
第二次握手:服务器端受到数据包后,由标志位SYN=1直到客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值为K的seq,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
第三次握手:客户端受到确认好,检查ack是否相当于J+1,ACK是否相当于1,若正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否等于K+1,ACK是否等于1,如果正确则表示连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,最后客户端和服务器端可进行数据传输。
四次握手
四次握手外文名为Four-way handshake,建立一个TCP连接需要三次握手,但终止一个TCP的连接却需要四次握手,这是由于TCP的半关闭特性所决定的。所谓的四次握手即TCP连接的释放(解除),连接的释放必须是一方主动释放,另一方被动释放。
如图所示:
第一次握手:客户端发送一个值为M的FIN,用来关闭客户端到服务器端的数据传送,客户进入FIN_WAIT_1状态,这相当于客户端发送信息通知服务器端“客户端已没有数据要发送,若服务器端仍有数据还没发送,不必急着关闭数据可继续发送。”
第二次握手:服务器端接收到FIN后,将发送ack=M+1,通知客户端已接收到信息,但仍未准备好,请继续接收到服务器的信息,这时客户端将进入FIN_WAIT_2状态,急需等待服务器端的FIN报文。
第三次握手:当服务器端已确认数据发送完成,将向客户端发送FIN=N报文,通知客户端已发送完所有信息,将准备关闭连接。之后服务器端进入LAST_ACK状态。
第四次握手:当客户端受到值为N的FIN报文后,即可关闭连接,但以防万一将向服务器端发送ack=N+1后进入TIME_WAIT状态,若服务器端没收到ACK则表示可以重传。若服务器接收到ACK将断开连接,而客户端将等待一段时间仍未收到回复,则证明服务器端已正常关闭,也将进入关闭连接,最终完成四次握手。