TCP三次握手的过程是怎样的?为什么是三次而不是两次或四次?

TCP三次握手

TCP是一个面向连接的协议,建立连接的过程通过所谓的“三次握手”来完成。三次握手是客户端和服务器在通信之前用来建立可靠连接的过程,确保双方都准备好进行数据传输。

三次握手的步骤
  1. 第一次握手(客户端 -> 服务器)
    • 目的: 客户端向服务器发送连接请求,初始化连接。
    • 过程:
      • 客户端发送一个 SYN(同步序列编号) 标志位为 1 的数据包,告诉服务器客户端希望建立连接。此数据包中还会包含一个客户端的 初始序列号(Seq)。
      • 客户端进入 SYN_SENT 状态,等待服务器的响应。 SYN 包结构:
      • 标志位:SYN = 1
      • 序列号:Seq = 客户端初始序列号(比如 1000)
  2. 第二次握手(服务器 -> 客户端)
    • 目的: 服务器响应客户端的连接请求,确认收到并准备建立连接。
    • 过程:
      • 服务器收到客户端的 SYN 包后,表示同意建立连接,于是服务器会回复一个包含 SYN 和 ACK(确认)标志位的数据包,表示服务器已经接收到客户端的请求并同意连接。
      • 服务器还会在该包中包含一个 服务器的初始序列号(Seq),并且确认号(Ack)是客户端的序列号 + 1(即客户端发的包被确认)。
      • 服务器进入 SYN_RCVD 状态,等待客户端的最后确认。 SYN + ACK 包结构:
      • 标志位:SYN = 1, ACK = 1
      • 序列号:Seq = 服务器初始序列号(比如 2000)
      • 确认号:Ack = 客户端的序列号 + 1(即 1001)
  3. 第三次握手(客户端 -> 服务器)
    • 目的: 客户端确认服务器的响应,完成连接的建立。
    • 过程:
      • 客户端收到服务器的 SYN + ACK 包后,客户端会发送一个带有 ACK 标志位的数据包,表示确认收到服务器的响应。
      • 客户端将确认号(Ack)设置为服务器的序列号 + 1(即服务器发送的包被确认)。
      • 客户端进入 ESTABLISHED 状态,表示连接已经建立,可以开始数据传输。
      • 服务器在收到此确认包后,也进入 ESTABLISHED 状态,连接完成。 ACK 包结构:
      • 标志位:ACK = 1
      • 序列号:Seq = 客户端的序列号 + 1
      • 确认号:Ack = 服务器的序列号 + 1
序列号和确认号的重要性
  • 序列号
    • 序列号用于标识每个字节流的数据位置。它不仅用于追踪数据的顺序,还用于确保数据的可靠性和完整性。在三次握手中,序列号标记了客户端和服务器各自的数据流的起始位置。
    • 客户端的序列号:在第一次握手时,客户端随机选择一个序列号(例如,1000)并发送到服务器。
    • 服务器的序列号:在第二次握手时,服务器会选择一个序列号(例如,2000)并发送给客户端。
  • 确认号(Acknowledgment Number)
    • 确认号用于指示接收方已成功接收到的字节的下一个期望序列号。在三次握手过程中,确认号是为了告诉对方已经收到对方的消息。
    • 第一次握手中的确认号:在第一次握手时客户端没有确认号,因为它还没有收到服务器的回应。
    • 第二次握手中的确认号:服务器在第二次握手时将确认号设置为客户端的序列号 + 1,表示确认已收到客户端的连接请求。
    • 第三次握手中的确认号:客户端发送给服务器的确认包,确认号是服务器的序列号 + 1,表示客户端已经收到服务器的响应。
为什么是三次握手而不是两次或者四次,第三次握手报文丢失会怎么样?
  • TCP握手的本质是保障连接双方能够正常收发数据,其中第一次握手能够证明客户端能够正常发送数据,而第二次握手过程则说明第一服务端能够正常受到数据,第二也能够说明服务端能够正常发送数据;如果没有第三次握手则不能证明客户端能够正常接收数据,不能说明建立的连接可靠。而采用比三次握手更多的握手次数则会带来更多的时间开销。

  • 服务器未收到ACK,会根据其超时重传机制,重传SYN-ACK

安全问题:SYN洪泛攻击

三次握手的过程虽然能确保可靠的连接建立,但它也带来了一些安全隐患,最典型的就是 SYN洪泛攻击

  • 攻击过程:
    • 攻击者伪造大量客户端IP地址,向目标服务器发送大量的SYN请求。
    • 由于目标服务器会为每个SYN请求分配资源,并发送SYN + ACK包来等待客户端的确认。攻击者并不会发送ACK包来完成连接,导致服务器一直在等待确认。
    • 结果是服务器的连接表资源被大量占用,无法响应正常的客户端请求,从而导致服务器拒绝服务(DoS攻击)。
  • 防范措施:
    1. SYN Cookies:通过SYN Cookies技术,服务器可以不为每个SYN请求分配资源,而是生成一个特殊的加密的cookie值,放在SYN+ACK包中。如果收到的ACK包中的cookie值正确,服务器才会建立连接,从而避免无效连接占用资源。
    2. 防火墙过滤:使用防火墙、路由器等设备对异常的SYN请求进行过滤,识别和阻止伪造的请求。
    3. 限制连接请求:服务器可以设置一个限制条件,例如限制在某一时间内来自某一IP的最大连接数,防止单个IP进行攻击。
    4. 连接排队机制:使用TCP的 backlog 队列,允许服务器积压一定数量的未完成连接请求,并在连接数过多时进行丢弃。

你可能感兴趣的:(计算机网络基础知识,服务器,计算机网络,计算机八股)