三次握手的过程:
-
第一次握手:客户端 向 服务器 发送一个 SYN(也就是同步序列编号报文),请求建立连接。随后,客户端 进入 SYN_SENT 状态;服务器收到 SYN 之后,由 LISTEN 状态变为 SYN_RCVD
-
第二次握手:服务器 发送 SYN、ACK (同步确认报文) 作为响应。客户端收到 SYN 后,状态变为 ESTABLISHED
-
第三次握手:客户端 会发送一个 ACK 作为最终响应。服务端收到后,状态也变为 ESTABLISHED。此时,双方可以开始通信了
为什么需要三次握手:
- 首要原因是为了阻止历史连接的干扰
- 如果两次握手就建立连接的话,假如服务端收到的SYN来自历史连接,那么此时服务端会进入ESTABLISHED状态。这时,服务端就可以向客户端发送信息了。
- 虽然客户端收到信息后会及时中止连接,但是之前服务器发送的信息却浪费了服务器的资源。所以说,三次握手的首要原因是为了阻止历史连接的干扰
- 第二个原因是 为了确保双方的初始序列号都能被正确接收
- 如果是两次握手的话,服务器向客户端发送了ACK,可以保证服务器能正确接收客户端的序列号
- 但是由于第三次握手被忽略了,客户端没有向服务器发送ACK,所以不能保证客户端能正确接收服务器的序列号
- 第三个原因是 为了避免资源的浪费
- 如果是两次握手,由于缺少第三次握手,服务器不能确定客户端是否收到了自己的 SYN。这样会导致,每当服务器收到一个SYN时,都会向客户端发起第二次握手。
- 如果因为网络拥堵,客户端重复发送了多个SYN,那么服务器也会发起多个二次握手,造成资源浪费