一文读懂TCP 三次握手和四次挥手的过程
一文读懂TCP 三次握手和四次挥手的过程
三次握手和四次挥手是TCP协议建立和断开连接的过程,它们的目的是为了保证数据的可靠传输和资源的正确释放。
三次握手是指建立一个TCP连接时,需要客户端和服务器总共发送3个报文。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。三次握手的过程如下:
第一次握手:客户端将标志位SYN置为1,随机产生一个序号seq=x,并将该数据包发送给服务器,进入SYN_SENT状态,等待服务器确认。第二次握手:服务器收到数据包后,检查标志位SYN是否为1,确认序号是否为x,如果正确,则将标志位SYN和ACK都置为1,确认号为x+1,随机产生一个序号seq=y,并将该数据包发送给客户端,进入SYN_RCVD状态,等待客户端确认。第三次握手:客户端收到数据包后,检查标志位ACK是否为1,确认号是否为y,如果正确,则将标志位ACK置为1,确认号为y+1,并将该数据包发送给服务器,进入ESTABLISHED状态,完成三次握手。服务器收到数据包后,也进入ESTABLISHED状态,完成三次握手。
三次握手的原因是为了防止已失效的连接请求报文段被服务器接收,从而产生错误。如果只有两次握手,那么客户端发送的连接请求可能因为网络问题在服务器端延迟到了连接释放之后,导致服务器误认为是客户端发起的新的连接,从而同意连接并等待客户端的数据,浪费资源。如果有三次握手,客户端会忽略服务器端的这种错误的连接请求,不会发送确认报文,从而让服务器端自动放弃连接。
四次挥手是指断开一个TCP连接时,需要客户端和服务器总共发送4个报文。四次挥手的目的是断开客户端和服务器的连接,释放双方的资源。四次挥手的过程如下:
第一次挥手:客户端将标志位FIN置为1,随机产生一个序号seq=u,并将该数据包发送给服务器,表明客户端不再发送数据,进入FIN_WAIT_1状态,等待服务器确认。第二次挥手:服务器收到数据包后,检查标志位FIN是否为1,确认序号是否为u,如果正确,则将标志位ACK置为1,确认号为u+1,并将该数据包发送给客户端,进入CLOSE_WAIT状态,此时客户端到服务器的连接已经释放,不再接收客户端的数据,但是服务器还可以发送数据。第三次挥手:服务器将标志位FIN置为1,随机产生一个序号seq=v,并将该数据包发送给客户端,表明服务器不再发送数据,进入LAST_ACK状态,等待客户端确认。第四次挥手:客户端收到数据包后,检查标志位FIN是否为1,确认序号是否为v,如果正确,则将标志位ACK置为1,确认号为v+1,并将该数据包发送给服务器,进入TIME_WAIT状态,等待可能出现的要求重传的ACK报文。服务器收到数据包后,检查标志位ACK是否为1,确认号是否为v+1,如果正确,则释放连接,进入CLOSED状态。
四次挥手的原因是因为TCP是全双工的,即数据可以在两个方向上同时传递,所以每个方向都需要单独进行关闭。如果客户端和服务器同时发送FIN报文,可以将四次挥手简化为三次挥手,但这种情况很少见。

标签:
