三次握手
客户端向服务端发送SYN包,将SYN位置为1,序列号seq随机一个数为x,进入SYN_SEND状态
服务端收到SYN包,需要确认SYN包,将确认号为x+1(seq+1),同时自己也要发送一个SYN包给客户端,序列号seq随机一个数为y,(即SYN和ACK包),进入SYN_RECV状态
客户端收到SYN和ACK包,确认SYN包,将确认号为y+1(seq+1),序列号(seq = x + 1),发送ACK包给服务端,此时,客户端和服务端都进入ESTA_LISHED状态
image-20210405235357141.png
ACK:确认号是否有效
客户端和服务端,两端都可以发送关闭TCP链接的请求
过程,这里以客户端发送关闭为过程
- 客户端请求关闭连接,客户端向服务端发送FIN包,将FIN位置为1,序列号seq随机一个数为x(seq = x),进入FIN_WAIT_1状态,这表示客户端没有数据要发送给服务端了
- 服务器确认收到FIN包,并发送ACK包给客户端 ,ACK位置为1,确认号为(ack=x+1),序列号(seq = y),进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态,服务器同意关闭请求
- 等所有数据报送完毕,服务器再发送FIN和ACK包给客户端 FIN位置为1,ACK位置为1,确认号为(ack = y+1),序列号(seq = z),服务端进入LACK_ACK状态,服务器请求关闭连接
- 然后客户端确认收到FIN和ACK包,发送ACK包给服务端,ACK位置为1,确认号(ack = z+1),序列号(seq = x+1),TIME_WAIT状态,2msl后,进入CLOSED状态
参考文章