TCP是面向连接的协议,因此每个TCP连接都有三个阶段:连接建立、数据传送和连接释放。
TCP采用客户服务器模式。主动发起连接建立的应用进程称为客户,而被动连接建立的应用进程称为服务器。
在了解三次握手前,先了解TCP的首部格式。
TCP报文的首部
TCP首部中序号和确认号的含义:
序号:seq。TCP连接中传送的字节流中的每个字节都要按顺序编号,序号字段值指的是本报文段发送的第一个字节的序号。
确认号:ack。期望收到对方下一个报文的第一个字节的序号。如果确认号是N,则表明到序号N-1为止的所有数据都已经正确收到。
TCP首部中确认位,同步位与终止位。
确认位:ACK。当确认位ACK=1时,确认号字段才有效。ACK=0时,确认号无效。
同步位:SYN。当同步位SYN=1时,表示这是一个连接请求或连接接受报文。
终止位:FIN。用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放连接。
TCP建立连接的三次握手:
TCP三次握手:
第一步:客户端向服务器端发送TCP连接请求报文段。
第二步:服务端的TCP收到连接请求报文段后,如果同意建立连接,则向客户机发回确认,并为TCP连接分配缓存和变量。
第三步:客户端收到服务端的确认报文后,向服务器给出确认,并为TCP连接分配缓存。
举一个简单的例子,就如同两个同学约定某一天在餐厅聚餐。同学A:请问你要和我一起去聚餐吗?同学B收到邀约,抽出时间,并回复:“已收到邀约,我同意去聚餐,你收到了吗”?同学A回复:“已收到你的同意”。随即,同学A也抽出时间。
TCP释放连接的四次挥手
第一步:客户机打算关闭连接时,向其TCP发送释放连接报文段,并且停止发送数据,主动关闭TCP连接,该报文段的终止位FIN置1。
第二步:服务器收到连接释放报文段后发出确认,然后服务器进入CLOSE_WAIT状态,此时客户机到服务器这个方向的连接就已经关闭。TCP此时连接处于半关闭状态,当服务器向客户端发送数据时,客户端依然要接收数据。
第三步:如果服务器已经没有向客户机发送的数据,就通知TCP释放连接,此时发送FIN=1的连接释放报文段。
第四步:客户机收到连续释放报文段后,必须发出确认,之后进入TIME-WAIT状态。客户机进入TIME_WAIT状态后,还需要等待2MSL(最长报文段寿命)后,才能进入CLOSED状态。