Skip to content

tcp连接的三次握手

  • TCP标记
    • 大小:占6位,每位各有不同意义
      图示
      1. URG:Urgent 紧急位,URG = 1,表示紧急数据
      2. ACKAcknowledgement 确认位,ACK = 1,确认号才生效
      3. PSH:Push 推送位,PSH = 1,尽快的把数据交付给应用层
      4. RST:Reset 重置位,RST = 1,重新建立连接
      5. SYNSynchronization 同步位,SYN = 1 表示连接请求报文
      6. FINFinish 终止位,FIN = 1 表示释放连接

连接的建立

图示

  • 三次握手
    1. 首先客户端向服务器发送一个 SYN 包,并等待服务器确认,其中
      • 标志位为 SYN,表示请求建立连接;
      • 序号为 seq = x(x 一般取随机数);
      • 随后客户端进入 SYN-SENT 阶段(同步已发送)。
    2. 服务器接收到客户端发来的 SYN 包后,对该包进行确认后结束 LISTEN 阶段,并返回一段 TCP 报文,其中:
      • 标志位为 SYN 和 ACK,表示确认客户端的报文 seq 序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接;
      • 序号为 seq = y;
      • 确认号为 ack = x + 1,表示收到客户端的序号 seq 并将其值加 1 作为自己确认号 ack 的值,随后服务器端进入 SYNC-RCVD 阶段(同步已接收)。
    3. 客户端接收到发送的 SYN + ACK 包后,明确了从客户端到服务器的数据传输是正常的,从而结束 SYN-SENT 阶段。并返回最后一段报文。其中:
      • 标志位为 ACK,表示确认收到服务器端同意连接的信号;
      • 序号为 seq = x + 1,表示收到服务器端的确认号 ack,并将其值作为自己的序号值;
      • 确认号为 ack= y + 1,表示收到服务器端序号 seq,并将其值加 1 作为自己的确认号 ack 的值。
      • 随后客户端进入 ESTABLISHED(建立连接)。

为什么发送方要发出第三个确认报文呢

  • 三次握手主要是避免已经失效的连接请求报文传送到对方,引起错误

    图示
    以上,由于第一次握手发送的请求过了很久才到达接收方,但是发送方以认为请求超时为由,第二次发送了握手请求,第二次连接成功,第一次发送的就称为失效的请求报文了
    图示
    首次完成三次握手的链路生效,未完成、后续完成的链路tcp会默认忽略