目录
一、三次握手
1. 过程描述
2. 为什么不是四次握手?为什么不能两次握手?
二、四次挥手
1. 过程描述
2. 为什么是四次挥手?
一、三次握手
1. 过程描述
- ① 客户端 向 服务器 发送 SYN 报文、初始化序列号 ISN(seq=x),然后 客户端 进入 SYN_SEND 状态,等待 服务器确认。
- ② 服务端发送 ACK 确认 服务端的 SYN 报文(ack=x+1),同时 发出一个 SYN 报文,带上 自己的初始化 序列号(seq=y),然后 服务端 进入 SYN_RECV 状态。
- ③ 客户端 接收到 服务端的 SYN、ACK 报文,ACK 确认 服务端的 SYNC 报文(ACK=y+1),然后客户端 和 服务器端 都进入 ESTABLISHED 状态,完成 TCP 三次握手。
2. 为什么不是四次握手?为什么不能两次握手?
因为 三次握手 才能 保证双方 具有 接收和发送的 能力。两次握手 可能导致 资源的浪费,由于 没有第三次握手,服务端就 无法确认客户端是 否收到了 自己的回复,所以 每收到 一个 SYN,服务器 都会主动去 建立一个 连接,而 四次握手 可以优化为 三次。
二、四次挥手
1. 过程描述
- ① 客户端 发送一个 FIN 报文给 服务端,表示 自己要 断开数据传送,报文中 会指定一个 序列号(Seq=x)。然后,客户端进入 FIN_WAIT_1 状态。
- ② 服务端 收到 FIN 报文后,回复 ACK 报文给 客户端,且把 客户端的 序列号值 +1,作为ACK+1 报文的 序列号(Seq=x+1)。然后,服务端进入 CLOSE_WAIT(Seq=x+1)状态,客户端进入 FIN_WAIT_2 状态。
- ③ 服务端 也要 断开连接时,发送 FIN 报文给 客户端,且 指定一个 序列号(Seq=y+1),随后服务端进入 LAST-ACK 状态。
- ④ 客户端收到 FIN 报文后,发出 ACK 报文 进行 应答,并 把服务端的 序列号值 +1 作 ACK 报文序列号(Seq=y+2)。此时 客户端 进入 TIME_WAIT 状态。服务端 在 收到客户端的 ACK 报文 后进入 CLOSE 状态。如果 客户端 等待 2MSL 没有 收到回复,才 关闭连接。
2. 为什么是四次挥手?
TCP 是 全双工通信,可以 双向 传输数据。任何一方 都可以 在数据传送结束后 发出连接释放的 通知,待 对方确认 后进入 半关闭状态。当 另一方也 没有数据 再发送的时候,则发出 连接释放通知,对方 确认后 才会完全 关闭了 TCP 连接。
总的来说,两次握手 可以 释放一端到 另一端的 TCP 连接,完全释放 连接一共 需要 四次握手。