在socket编程中,任何一方执行close()操作即可产生挥手操作,即关闭socket链接。由于TCP是全双工的,关闭一端需要两次挥手,关闭两端共需要四次挥手。
TCP报文头部格式中有以下标志位
(1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
需要注意的是:
(A)不要将确认序号Ack与标志位中的ACK搞混了。
(B)确认方Ack=发起方Req+1,两端配对。
具体挥手过程:
主机A主动请求关闭A到B的链接。
第一次:主机A发送位码为FIN=1,seq number=X 的数据包到B主机,表示请求中断主机A到主机B的链接,主机B由SYN=1知道,A要求关闭连接;
第二次:主机B收到关闭连接请求后,向A发送ack=1,ack number=X+1(主机A的seq+1) 和seq=Y的包;
接下来B主机重复 第一次和第二次的握手来关闭B到A的链接。
第三次:主机B发送位码为FIN=1,seq number=Y+1 的数据包到A主机,表示请求中断主机B到主机A的链接,主机A由SYN=1知道,B要求关闭连接;
第四次:主机A收到关闭连接请求后,向B发送ack=1,ack number=Y+2 (主机B的seq+1) 和seq=X+1的包;
至此,TCP链接关闭。