三次握手
1. 第一次握手:建立连接。客户端发送连接请求报文段,将SYN设置为1,Seq为x,然后,客户端进入 SYN_SEND 状态,等待服务器的确认
2. 第二次握手:服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置 Ack 为 x+1(seq+1);同时,自己还要发送 SYN 请求信息, 将SYN设置为1,Seq设置为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段中),一并发送给客户端,此时服务器进入SYN_RCVD状态。
3. 第三次握手:客户端收到服务端的SYN+ACK报文段。然后将Ack设置为y+1,向服务器发送Ack报文段,这个报文段发送完毕之后,客户端和服务端都进入ESTABLISHED状态,完成TCP三次握手。
图解三次握手
为什么要三次握手?
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送和接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收机能正常。
第一次握手:Client什么都不能确认,Server确认了对方发送正常和自己的接收正常。
第二次握手:Client确认了,自己发送、接收正常,对方发送、接收正常;Server确认了,自己接收正常,对方发送正常,不能确认自己发送正常。
第三次握手:Client确认了,自己发送、接收正常,对方发送、接收正常;Server确认了自己发送、接收正常,对方发送接收正常。
四次挥手
1. 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
2. 第二次挥手:此时服务器端可能还要给客户端传送数据,不能急着关闭。Server收到FIN后,发送一个ACK给Client,确认序号为收到序号seq+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
3. 第三次挥手:服务器端数据传输完成后,Server发送一个FIN,用来关闭Server到Client的数据传输,Server进入LAST_ACK状态。
4. 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
图解四次挥手:
我们在图中可以看到 Client 在进入TIME_WAIT 状态后等待了 2MSL 的时间才关闭,为什么要等待这个时间呢?
为了保证A发送的最后一个 ACK 报文段能够到达B。首先,Client 发送的这段报文是有一定可能丢失的,如果丢失的话,那么 Server 就收不到对 已发送的 FIN + ACK 报文的确认。那么Server就会超时重传这个 FIN + ACK 的报文段,而 Client 就可以在 2MSL 的时间内收到这个重传的 FIN + ACK 报文段。接着 A 重新传一次确认,再重新开始 2MSL 的计时器。最后 Client 和 Server 都正常的进入了CLOSED状态。
假设Client没有在 TIME_WAIT 状态下等待 2MSL 再关闭,而是再发送完 ACK 报文段后直接释放连接,那么 Client 就无法收到 Server 重传的 FIN+ACK 报文段,也不会再重新发送一次确认字 报文段。这样 Server 就无法通过正常的步骤进入 CLOSED 状态。
为什么要四次挥手?
根本原因:一方发送FIN表示自己发完了所有要发的数据,但是还允许对方继续把没发完的数据发过来。
来源:CSDN
作者:heyanxi0101
链接:https://blog.csdn.net/heyanxi0101/article/details/80369438