抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

TCP三次握手过程

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)可知道,

为什么不是四次握手?

  • 三次握手就已经初始化双方的序列号和确认号,就可以确保数据在两个方向上进行传输。
  • 如果采用四次握手,会给通信增加了延迟,还可能引入不必要的复杂性。

评论