三次握手和四次挥手
定义
三次握手指建立TCP协议时,需要在客户端和服务器端之间发送三个包,握手过程中传送的包不含任何数据,三次握手完毕后,客户端和服务器才建立起真正的连接正式开始传送数据。
四次挥手指终止TCP连接协议时,需要在客户端和服务器之间发送四个包,四次挥手完毕后,客户端与服务器端TCP连接完全断开。
SYN 创建一个连接
FIN 终结一个连接
ACK 确认接收到的数据
三次握手
**第一次握手:**客户端发送SYN包(包中SYN标志位为1,ACK=0)至服务器,并进入SYN_SENT(请求连接)状态,等待服务器确认(相当于客户端发送请求连接的包包含顺序号码,客户端请求建立连接);
**第二次握手:**服务器端收到客户端的SYN包后,发送一个ACK,同时发送自己的SYN(其中SYN\ACK标志位为1),此时服务器进入到SYN_RCVD(同步接收)状态(相当于服务端收到客户端包核对顺序号码无误后将自己的顺序号码发送给客户端并进入同步接收状态);
**第三次握手:**客户端接收到服务器发送的SYN+ACK后,进入到ESTABLISHED(连接成功,已经建立)状态,并发送SYN包的确认ACK(SYN=0, ACK=1),此时服务器接收到客户端ACK后,也进入到ESTABLISHED(连接成功,已经建立)状态(客户端收到信息后核对顺序号码无误后进入到连接成功状态,并发送SYN和顺序码给服务器端,服务器端收到核对无误后也进入到连接成功状态)。
注:
TCP是可靠连接,双方都要确保发送的信息是可靠的、准确无误的。
回传了SYN只是证明服务器收到的确实是客户端发送的信号,但是服务器到客户端之间的通道还需要ACK信号来保证信息的准确无误。
四次挥手
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
**第一次挥手:**首先客户端想要释放连接,向服务器端发送一个包(含有FIN,表示请求释放连接),随后客户端进入半关闭状态。
**第二次挥手:**服务端接收到从客户端发出的包后,确认了客户端想要释放连接,随后服务器端结束了连接状态,也进入半关闭状态并返回给客户端一个包(ACK,表示接收到客户端发送的释放连接的请求),随后服务器端开始准备释放服务器端到客户端方向上的连接。
**第三次挥手:**服务端发出第二次挥手的包后,做好了释放服务器端到客户端方向上的连接准备,再次向客户端发出一个包(FIN,ACK,表示已经准备好释放连接了),随后停止在服务器端到客户端的方向发送数据,但是可以接收客户端的数据。
**第四次挥手:**客户端收到从服务器端发来的包,并发送一个包(ACK,表示接收到服务器准备好释放连接的信号),随后客户端开始在等待2MSL(两倍的报文包最大生存时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时1MSL后将重发第三次握手的FIN包,客户端接到重发的FIN包后可以再发一个ACK应答包),服务器端收到客户端发出的最后一个包后正式关闭连接,客户端等待完2MSL后,也进入关闭,自此完成四次挥手