三次握手是TCP连接的过程
过程
- 第一次握手,客户端将请求中SYN设置为1,初始化序列号,发送给服务端。
- 第二次握手,服务端接收到信息后,将SYN和ACK设置为1,并将Ack设置为接收到的序列号+1,再初始化自己的序列号,发送给客户端。
- 第三次握手,客户端接收到信息后,将ACK设置为1,同时Ack设置接收到的序列号+1,发送给服务端。
为什么需要三次握手
回答这个问题我们需要了解TCP连接的作用或者目的。
TCP:用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括 Socket、序列号和窗口大小称为连接。
以上我们知道,TCP是为了保证可靠的的连接。
三次握手可以阻止重复历史连接的初始化
三次握手将是否建立连接的权力交给了发送者。因为只有发送者有足够的上下文来判断当前连接是否错误或者过期。这也是TCP使用三次握手建立连接的最主要原因。
- 如果当前连接是历史连接,即SEQ过期或者超时,那么发送方就会直接发送RST控制消息中止这一次连接。
- 如果当前连接不是历史连接,那么发送方就会发送ACK控制消息,通信双方就会成功建立连接。
这也是为什么HTTP连接不能两次握手的原因。
三次握手可以同步双方的初始序列号
TCP需要在不稳定的网络环境中构建一个可靠的传输层,网络的不确定性可能会导致数据包的丢失和顺序颠倒,重复等问题。三次握手可以使通信双方初始化序列号。
有了数据包对应的序列号:
- 接收方可以通过序列号对重复的数据包去重
- 发送方会在对应数据包未被ACK时进行重复发送
- 接收方可以根据数据包的序列号对他们进行重新排序
三次握手可以避免资源浪费
使用三次握手是建立连接所需要的最小次数。四次,五次也可以但是那样做有点浪费了。