TCP三次握手与四次挥手过程解析
字数 1986 2025-11-03 08:33:37

TCP三次握手与四次挥手过程解析

题目描述
TCP(传输控制协议)是互联网核心协议之一,负责在不可靠的网络环境中提供可靠的、面向连接的字节流传输服务。其连接的建立与释放过程分别通过"三次握手"和"四次挥手"机制实现。面试中常要求详细解释这两个过程的步骤、每个步骤中传输的数据包内容(特别是标志位和序列号的变化)以及为什么需要三次握手(而非两次或四次)和四次挥手(而非三次)。

解题过程循序渐进讲解

第一步:理解TCP报文头部关键字段
在分析握手挥手过程前,需先掌握TCP报文头部几个核心字段:

  • 序列号(Sequence Number, seq):标识发送端数据字节流的起始编号,用于数据排序和去重。
  • 确认号(Acknowledgment Number, ack):接收方期望收到的下一个字节的序列号,其值为收到的seq+1,表示之前数据已正确接收。
  • 标志位(Flags)
    • SYN:同步位,置1表示请求建立连接。
    • ACK:确认位,置1表示确认号字段有效。
    • FIN:终止位,置1表示要求释放连接。

第二步:三次握手建立连接过程
假设客户端(Client)主动向服务器(Server)发起连接:

  1. 第一次握手(SYN=1, seq=x)

    • 客户端发送一个TCP报文,设置SYN标志位为1,随机生成初始序列号(seq=x)。此时不携带应用数据。
    • 客户端进入SYN-SENT状态,等待服务器确认。
    • 作用:客户端向服务器表达连接意向,并同步初始序列号。
  2. 第二次握手(SYN=1, ACK=1, seq=y, ack=x+1)

    • 服务器收到报文后,若同意连接,则回复一个报文。设置SYN和ACK标志位均为1,随机生成服务器的初始序列号(seq=y),确认号设为客户端序列号+1(ack=x+1)。
    • 服务器进入SYN-RCVD状态。
    • 作用:服务器确认客户端的连接请求,同时同步自己的初始序列号。
  3. 第三次握手(ACK=1, seq=x+1, ack=y+1)

    • 客户端收到服务器的回复后,需再次发送确认报文。设置ACK标志位为1,序列号变为x+1(因为第一次握手消耗一个序列号),确认号设为服务器序列号+1(ack=y+1)。此报文可携带应用数据。
    • 服务器收到后,双方进入ESTABLISHED状态,连接建立成功。
    • 作用:客户端确认服务器的同步请求,防止已失效的连接请求突然传到服务器导致错误。

为什么需要三次握手?

  • 核心原因:避免历史重复连接初始化造成的资源浪费。如果只有两次握手,当客户端延迟的重复SYN报文到达服务器时,服务器会误认为新连接已建立并分配资源,导致资源空耗。第三次握手让客户端有机会判断连接是否最新(通过确认号验证),从而拒绝历史请求。
  • 此外,三次握手确保了双方初始序列号可靠同步,为后续可靠传输奠定基础。

第三步:四次挥手断开连接过程
假设客户端主动发起关闭:

  1. 第一次挥手(FIN=1, seq=u)

    • 客户端发送FIN报文(FIN=1),序列号为u(等于之前已传数据最后一个字节序号+1)。客户端进入FIN-WAIT-1状态。
    • 作用:客户端通知服务器数据发送完毕,要求关闭客户端到服务器的数据通道。
  2. 第二次挥手(ACK=1, seq=v, ack=u+1)

    • 服务器收到FIN后,立即回复ACK报文(ACK=1),确认号ack=u+1,序列号为v。服务器进入CLOSE-WAIT状态。
    • 此时客户端到服务器的连接已关闭,但服务器到客户端可能仍有数据待发送。
    • 客户端收到ACK后进入FIN-WAIT-2状态,等待服务器的FIN报文。
  3. 第三次挥手(FIN=1, ACK=1, seq=w, ack=u+1)

    • 服务器完成剩余数据发送后,发送FIN+ACK报文(FIN=1, ACK=1),序列号为w(可能比v大),确认号仍为u+1。服务器进入LAST-ACK状态。
    • 作用:服务器通知客户端其数据也已发送完毕,要求关闭服务器到客户端的数据通道。
  4. 第四次挥手(ACK=1, seq=u+1, ack=w+1)

    • 客户端收到FIN后,回复ACK报文(ACK=1),确认号ack=w+1,序列号为u+1。客户端进入TIME-WAIT状态,等待2MSL(最大报文段生存时间)后关闭连接。
    • 服务器收到ACK后立即关闭连接。
    • 作用:客户端确认服务器的关闭请求,确保服务器能正常关闭。

为什么需要四次挥手?

  • 因为TCP连接是全双工的,数据发送和接收通道相互独立。关闭连接时,一方发送FIN仅表示自己不再发送数据(但可能还要接收数据)。因此,关闭过程需双方分别发起FIN和确认ACK,从而比建立连接多一次交互。
  • TIME-WAIT状态的作用:确保最后一个ACK能到达服务器(若丢失,服务器会重传FIN);让本连接持续时间内产生的所有报文从网络中消失,避免影响新连接。
TCP三次握手与四次挥手过程解析 题目描述 TCP(传输控制协议)是互联网核心协议之一,负责在不可靠的网络环境中提供可靠的、面向连接的字节流传输服务。其连接的建立与释放过程分别通过"三次握手"和"四次挥手"机制实现。面试中常要求详细解释这两个过程的步骤、每个步骤中传输的数据包内容(特别是标志位和序列号的变化)以及为什么需要三次握手(而非两次或四次)和四次挥手(而非三次)。 解题过程循序渐进讲解 第一步:理解TCP报文头部关键字段 在分析握手挥手过程前,需先掌握TCP报文头部几个核心字段: 序列号(Sequence Number, seq) :标识发送端数据字节流的起始编号,用于数据排序和去重。 确认号(Acknowledgment Number, ack) :接收方期望收到的下一个字节的序列号,其值为收到的seq+1,表示之前数据已正确接收。 标志位(Flags) : SYN :同步位,置1表示请求建立连接。 ACK :确认位,置1表示确认号字段有效。 FIN :终止位,置1表示要求释放连接。 第二步:三次握手建立连接过程 假设客户端(Client)主动向服务器(Server)发起连接: 第一次握手(SYN=1, seq=x) 客户端发送一个TCP报文,设置SYN标志位为1,随机生成初始序列号(seq=x)。此时不携带应用数据。 客户端进入SYN-SENT状态,等待服务器确认。 作用 :客户端向服务器表达连接意向,并同步初始序列号。 第二次握手(SYN=1, ACK=1, seq=y, ack=x+1) 服务器收到报文后,若同意连接,则回复一个报文。设置SYN和ACK标志位均为1,随机生成服务器的初始序列号(seq=y),确认号设为客户端序列号+1(ack=x+1)。 服务器进入SYN-RCVD状态。 作用 :服务器确认客户端的连接请求,同时同步自己的初始序列号。 第三次握手(ACK=1, seq=x+1, ack=y+1) 客户端收到服务器的回复后,需再次发送确认报文。设置ACK标志位为1,序列号变为x+1(因为第一次握手消耗一个序列号),确认号设为服务器序列号+1(ack=y+1)。此报文可携带应用数据。 服务器收到后,双方进入ESTABLISHED状态,连接建立成功。 作用 :客户端确认服务器的同步请求,防止已失效的连接请求突然传到服务器导致错误。 为什么需要三次握手? 核心原因 :避免历史重复连接初始化造成的资源浪费。如果只有两次握手,当客户端延迟的重复SYN报文到达服务器时,服务器会误认为新连接已建立并分配资源,导致资源空耗。第三次握手让客户端有机会判断连接是否最新(通过确认号验证),从而拒绝历史请求。 此外,三次握手确保了双方初始序列号可靠同步,为后续可靠传输奠定基础。 第三步:四次挥手断开连接过程 假设客户端主动发起关闭: 第一次挥手(FIN=1, seq=u) 客户端发送FIN报文(FIN=1),序列号为u(等于之前已传数据最后一个字节序号+1)。客户端进入FIN-WAIT-1状态。 作用 :客户端通知服务器数据发送完毕,要求关闭客户端到服务器的数据通道。 第二次挥手(ACK=1, seq=v, ack=u+1) 服务器收到FIN后,立即回复ACK报文(ACK=1),确认号ack=u+1,序列号为v。服务器进入CLOSE-WAIT状态。 此时客户端到服务器的连接已关闭,但服务器到客户端可能仍有数据待发送。 客户端收到ACK后进入FIN-WAIT-2状态,等待服务器的FIN报文。 第三次挥手(FIN=1, ACK=1, seq=w, ack=u+1) 服务器完成剩余数据发送后,发送FIN+ACK报文(FIN=1, ACK=1),序列号为w(可能比v大),确认号仍为u+1。服务器进入LAST-ACK状态。 作用 :服务器通知客户端其数据也已发送完毕,要求关闭服务器到客户端的数据通道。 第四次挥手(ACK=1, seq=u+1, ack=w+1) 客户端收到FIN后,回复ACK报文(ACK=1),确认号ack=w+1,序列号为u+1。客户端进入TIME-WAIT状态,等待2MSL(最大报文段生存时间)后关闭连接。 服务器收到ACK后立即关闭连接。 作用 :客户端确认服务器的关闭请求,确保服务器能正常关闭。 为什么需要四次挥手? 因为TCP连接是全双工的,数据发送和接收通道相互独立。关闭连接时,一方发送FIN仅表示自己不再发送数据(但可能还要接收数据)。因此,关闭过程需双方分别发起FIN和确认ACK,从而比建立连接多一次交互。 TIME-WAIT状态的作用 :确保最后一个ACK能到达服务器(若丢失,服务器会重传FIN);让本连接持续时间内产生的所有报文从网络中消失,避免影响新连接。