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