TCP三次握手过程
第一次握手,客户端向服务器发送一个SYN标志置位1的TCP报文段。报文段包含了客户端的初始序列号client_isn,以及一些其它选项,SYN表示客户端希望与服务器建立连接
第二次握手,服务器接收到客户端发送的SYN报文段,需要确认连接请求。服务器向客户端发送一个ACK标志至1的TCP报文段,同时初始化自己的序列号ISN,将客户段的初始序列号+1(client_isn + 1)作为确认应答号填入,将SYN置位1,表示接受连接请求
第三次握手,客户端接收到服务器的响应后,发送一个ACK标志置位1的TCP报文段,将服务器的初始序列号 + 1(server_isn + 1)作为应答,该报文段不包含SYN标志,确认信号服务器连接已成功。
一旦完成三次握手,双方都处于
ESTABLISHED
状态,此时连接就已建立完成,客户端和服务端就可以相互发送数据了。
为什么不是两次握手?
1. 三次握手确认双方的接收能力
- 在三次握手中才能互相确认客户端和服务端具有接收能力,以确保双方都具备发送和接收数据的能力
- 第一次握手,客户端向服务端发送请求,但服务端不能确定客户端是否具备接收数据能力
- 第二次握手,服务端确认了客户端的请求并告诉客户端自己准备好了,但客户端无法知道服务端是否准备好
- 只有第三次握手,客户端才能确认服务器的准备状态,从而确认服务端的准备状态,才可以开始传输数据
2. 避免已失效的连接请求
- 如果两次握手,第一次连接请求因为某种原因(网络阻塞后),由客户端重新发送一个请求给服务端
- 如果服务端先是接收到了第一个网络阻塞后的请求,于是向客户端发送了第二次握手,但服务端不知道这个是失效的连接,会直接建立连接发送数据,这时候就会造成服务器资源的浪费和安全问题
- 两次握手会造成消息滞留情况下,服务端重复接受无用的连接请求
SYN
报文,而造成重复分配资源。
3. 同步双方初始序列号
- TCP连接三次握手中,需要客户端和服务端在握手过程中,交换自己的初始序列号,这些初始序列号用于标识每个TCP报文段的数据,以确保数据的有序传输和可靠接收
- 接收方可以通过序列号去除重复的数据
- 接收方可以通过序列号进行有序接收
- 可以标识发送的数据哪些已被对方接受,通过确认ACK报文中的确认号(ACK Num)可知道,
为什么不是四次握手?
- 三次握手就已经初始化双方的序列号和确认号,就可以确保数据在两个方向上进行传输。
- 如果采用四次握手,会给通信增加了延迟,还可能引入不必要的复杂性。