TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。
建立连接的过程需要做到三次数据交流,称为三次握手。之后才能传输数据。
当数据传输完毕后,需要断开此连接,在此过程中又要做到四次挥手。


三次握手

过程比如两个人打电话:甲问对方:“你是乙么”; 乙回答:“我是乙,你是甲么”; 甲回答:“我是甲, 我们可以说话了”

第一次握手:客户端请求建立连接

第二次握手:服务器应答客户端,并请求建立连接

第三次握手:客户端针对服务器请求确认应答

TCP三次握手  四次挥手_三次握手


四次挥手

四次挥手是为了保证数据传输的完整性, 如果打电话的两个人中甲说完了,还没等到乙说话就直接挂掉电话,那信息传送肯定是不完整的。

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,“告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息”。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,“告诉Client端,好了,我这边数据发完了,准备好关闭连接了”。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,“就知道可以断开连接了”。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
TCP三次握手  四次挥手_数据_02


序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。

标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN

URG:紧急指针(urgent pointer)有效。

ACK:确认序号有效。

PSH:接收方应该尽快将这个报文交给应用层。

RST:重置连接。

SYN:发起一个新连接。

FIN:释放一个连接。