TCP三次握手 建立连接
1)Client 将标志位 SYNC 置为 1,随机生成一个值 seq=J,并将该数据包发送给 Server,Client 进入 SYNC_SENT 状态,等待 Server 确认。
如果 Client 超时没有接收到 ACK,重发数据包。
2)Server 收到数据包后由标志位 SYNC=1 知道 Client 请求建立连接,Server 将标志位 SYNC 和 ACK 都置为 1,ack=J+1,随机产生一个值 seq=K,并将该数据包发送给 Client 以确认连接建立,Server 进入 SYN_RCVD 状态。
如果此时 Server 重新收到 Client 建立请求的消息,重发 ACK 包。
如果超时没有接收到 Client 的 ACK 响应,重发 ACK 包。
3)Client 收到确认后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将标志位 ACK 置为 1,ack=K+1,并将该数据包发送给 Server,Client 进入 Established 状态,Server 检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功,Server 进入 Established 状态,随后 Client 与 Server 之间可以开始传输数据了。
Client 进入 Established 状态后,如果收到 Server 重发的 ACK 消息,重发自己的 ACK。
这样最后 Client 与 Server 都进入了 Established 状态,可以开始传输数据。
TCP 四次挥手 断开连接
由于 TCP 连接是全双工的,因此,每个方向都必须要单独关闭,这一原则是当一方完成数据发送任务后,发送一个 FIN 来终止这一方向的连接。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
1)Client 发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入 FIN_W