TCP握手

建立TCP连接需要发送三个包才能建立,而断开连接则需要发送四个包,所以被称为TCP三次握手四次挥手。

三次握手

第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
在这里插入图片描述

四次挥手

客户端→服务端:发送FIN报文,表示没有要发送的数据,并询问服务端有无没有发送的数据。如果还有没发送完的数据可不必关闭socket,继续发送。
服务端→客户端:发送ACK表示还未确定是否有未发送完的数据,Client端进入FIN_WAIT状态。
服务端→客户端:Server端确认数据发送完成后发送FIN报文,表示Client端可以关闭连接了。
客户端→服务端:发送ACK后进入TIME_WAIT状态,Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭。
注意:为什么建立连接需要三次握手而解除需要四次挥手呢?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步挥手。

在这里插入图片描述
与UDP不同的是,TCP通过三次握手四次挥手避免了掉包情况的发生