TCP三次握手和四次挥手是传输控制协议(Transmission Control Protocol,简称TCP)中非常重要的概念,它们用于建立和终止一个TCP连接。
TCP三次握手
TCP三次握手(Threeway Handshake)是指建立一个TCP连接时,需要客户端和服务器总共发送3个包以确认连接的建立,在这个过程里主要有以下三个步骤:
1、SYN:客户端选择一个初始的序列号x,然后发送一个SYN段(synchronize sequence numbers)到服务器,其中包含该序列号。
2、SYNACK:服务器接收到来自客户端的SYN后,会确认客户端的SYN(ACK=x+1),同时也会发送自己的SYN(seq=y)。
3、ACK:客户端收到服务器的SYNACK后,会向服务器发送确认包ACK(ACK=y+1)。
以上三个步骤完成后,客户端和服务器就建立了一个全双工的TCP连接。
步骤 | 描述 |
客户端发送SYN | 客户端发送一个SYN包给服务器,开始建立连接。 |
服务器返回(SYN+ACK) | 服务器回应一个SYN和ACK包,确认收到客户端的SYN,并发送自己的SYN。 |
客户端发送ACK | 客户端回应一个ACK包,确认收到服务器的SYN。 |
TCP四次挥手
TCP四次挥手(Fourway Wavehand)是指断开一个TCP连接时所需要使用的4个包,它的过程如下:
1、FIN:主机A(假设为客户端)完成数据发送后,发送一个FIN段给主机B(假设为服务器),用来关闭从A到B的数据传送。
2、ACK:主机B收到来自A的FIN后,返回一个ACK段给主机A,确认序号为收到序号加1。
3、FIN:主机B完成数据发送后,发送一个FIN段给主机A,用来关闭从B到A的数据传送。
4、ACK:主机A收到来自B的FIN后,返回一个ACK段给主机B,确认序号为收到序号加1。
以上四个步骤完成后,主机A与主机B之间的TCP连接就正式关闭了。
步骤 | 描述 |
客户端发送FIN | 客户端发送一个FIN包给服务器,请求关闭连接。 |
服务器返回ACK | 服务器回应一个ACK包,确认收到了客户端的FIN。 |
服务器发送FIN | 服务器向客户端发送一个FIN包,表明自己也将关闭连接。 |
客户端返回ACK | 客户端回应一个ACK包,确认收到了服务器的FIN。 |
在TCP三次握手和四次挥手的过程中,TCP连接的状态会发生变化,以下是TCP连接状态的变化过程:
CLOSED:表示没有连接,处于关闭状态。
LISTEN:表示服务端的某个Socket正在监听这个端口,可以在此处接受新的连接。
SYN_SENT:表示请求连接,并且已经发出了SYN报文。
SYN_RECEIVED:表示收到了SYN报文,并且发出了确认报文。
ESTABLISHED:表示双方已经建立连接并可以进行数据传输。
FIN_WAIT_1:表示主动关闭连接的一方,已经发出过FIN报文,等待对方确认。
CLOSE_WAIT:表示被动关闭连接的一方,已经收到了对方的FIN报文,等待关闭连接。
LAST_ACK:表示被动关闭的一方,已经发出了FIN报文,等待对方的确认。
TIME_WAIT:表示已经完成了数据传输,等待一段时间后彻底关闭连接。
相关问题与解答
Q1: 为什么需要三次握手而不是两次握手?
A1: 三次握手可以防止失效的连接请求报文突然又传送到了服务端,因而产生错误。
Q2: 为什么需要四次挥手而不是三次挥手?
A2: 四次挥手可以确保双方都能够关闭连接,并且处理了最后一方发出的数据包。
Q3: 在四次挥手中如果最后一次ACK丢失了怎么办?
A3: 如果B没收到A发出的最后一个ACK,B会重新发送FIN,A收到重发的FIN后会再次发送ACK,直到B收到为止。
Q4: 为什么TIME_WAIT状态下还需要等待一段时间再关闭连接?
A4: 这主要是为了处理网络中可能存在的延迟的重复分组,避免新的连接受到干扰。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/462984.html