三次握手

76 阅读2分钟

TCP三次握手过程 Three-way HandShake

1.第一次握手
  • 客户端发送 SYN (Synchronize)标志的 TCP 包,表示希望与服务器建立连接,同时该包还包含客户端的初始序列号(seq = x),这个序列号用于之后的数据传输过程。
  • 这一步主要是客户端告诉服务器:“我希望与你建立连接,并且我将从序列号 x 开始发送数据。”
客户端 (SYN=1, seq=x)  --------->  服务器
2.第二次握手

服务器发送SYN、ACK

  • 服务器收到客户端发送的SYN包后,确认收到该请求,并向客户端发送一个带有 SYN 以及 ACK(Acknowledgment)标志的 TCP
  • SYN 表示已经收到同步请求,可以进行连接
  • ACK 表示确认服务器已经收到了客户端的SYN包,ACK里面包含
    • 服务器自己的初始序列号(seq = y),表示服务器将从序列号 y 开始发送数据。
    • ack = x + 1,确认客户端的初始序列号已经收到,并期望下一步收到客户端从序列号 x + 1 开始的数据。
客户端                   服务器
(SYN=1, seq=x) --------->  

(SYN=1, ACK=1, seq=y, ack=x+1)
<--------- 
3.第三次握手

客户端发送ACK 客户端收到服务器的SYN以及ACK包之后,继续向服务器发送ACK包,表示确认收到了服务器的SYN包。

  • 该ACK包中包含客户端的确认号 ack = y + 1,表示客户端已经收到了服务器的序列号 y,并准备接收服务器发送的数据。
客户端                   服务器
(SYN=1, seq=x) --------->  

(SYN=1, ACK=1, seq=y, ack=x+1)
<--------- 

(ACK=1, ack=y+1) ------->

为什么不是两次握手?

如果只有两次握手,服务器在收到 SYN 包并发出 SYN-ACK 之后,无法确认客户端是否收到这个包。可能发生的是:

  • 服务器发送的 SYN-ACK 包丢失,而服务器认为连接已经建立,开始向客户端发送数据,而客户端并未建立连接,会丢弃这些数据。为了避免这种不确定性,TCP 使用三次握手确保双方都能通信。

总结:

TCP 三次握手是为了确保客户端和服务器能够可靠地相互通信。通过三次握手,客户端和服务器可以确认彼此的接收和发送能力,并生成初始序列号,确保数据在正确的顺序中传输。