注:TCP 连接的建立和释放在网络协议中是比较重要的,由于本人理解也不是很透彻,欢迎各位批评指正。
前言
TCP 是面向连接的、可靠的字节流协议。因此,在传输数据之前通信双方必须建立一个 TCP 连接,建立 TCP 连接需要在服务器和客户端之间进行三次握手。通信双方数据传输完毕之后进行连接释放,释放连接需要在通信双方之间进行四次挥手。
TCP 状态机
TCP 所谓的“连接”,只是通信双方维护一个“连接状态”,让它看上去好像有连接一样,其实 TCP 连接是虚拟的连接,不是电路连接。首先看下 TCP 的状态机,状态机是 TCP 连接与释放的全过程。如下图所示:
下面针对 TCP 状态机所出现的各个状态进行简要的分析:
- CLOSED:表示初始状态。对服务端和客户端双方都一样。
- LISTEN:表示监听状态。服务端调用了 listen 函数使其处于监听状态,此时可以开始 accept (接收)客户端的连接。
- SYN_SENT:表示客户端已经发送了 SYN 报文段,则会处于该状态。当客户端调用 connect 函数发起连接请求时,首先发 SYN 给服务端,然后自己进入 SYN_SENT 状态,并等待服务端发送 ACK+SYN 作为请求应答。
- SYN_RCVD:表示服务端收到客户端发送 SYN 报文段。服务端收到这个报文段后,进入 SYN_RCVD 状态,然后发送 ACK+SYN 给客户端。
- ESTABLISHED:表示 TCP 连接已经成功建立,通信双方可以开始传输数据。服务端发送完 ACK+SYN 并收到来自客户端的 ACK 后进入该状态,客户端收到来自服务器的 SYN+ACK 并发送 ACK 后也进入该状态。
- FIN_WAIT_1: