TCP三次握手

在计算机网络体系中,TCP(Transmission Control Protocol)作为面向连接、可靠传输的传输层协议,被广泛应用于 HTTP、FTP、SMTP 等主流应用层协议。TCP 通信的前提是通信双方建立稳定、可靠的连接,而三次握手正是 TCP 建立连接的标准流程。本文将从原理、报文结构、详细流程、设计意义等方面,对 TCP 三次握手进行全面解析。

TCP 连接建立的背景

TCP 是全双工通信协议,通信双方可以同时发送和接收数据。在正式传输数据之前,客户端与服务端必须确认彼此的发送能力、接收能力正常,并完成初始序列号(ISN)的同步,以保证后续数据按序、可靠传输。三次握手就是为实现这一目标而设计的最小交互次数。

TCP 报文核心标识位与字段

在三次握手过程中,以下报文段字段最为关键:

  1. SYN:同步序列号标志位,用于发起连接并同步初始序列号。
  2. ACK:确认标志位,用于标识确认号字段有效。
  3. seq:序列号,标识当前报文段的起始编号。
  4. ack:确认号,表示期望接收的下一个报文段的起始序列号。

TCP 三次握手详细流程

假设客户端主动发起连接,服务端处于监听状态,完整流程如下:

1. 第一次握手:客户端 → 服务端

  • 客户端状态:CLOSED → SYN_SENT
  • 报文:SYN=1,ACK=0,seq=x
  • 含义:客户端向服务端发送连接请求报文,告知服务端本方初始序列号为 x,请求建立连接。
  • 作用:服务端确认客户端发送能力正常。

2. 第二次握手:服务端 → 客户端

  • 服务端状态:LISTEN → SYN_RCVD
  • 报文:SYN=1,ACK=1,seq=y,ack=x+1
  • 含义:服务端确认客户端的连接请求,同时向客户端发起连接,本方初始序列号为 y。
  • 作用:客户端确认服务端发送、接收能力均正常。

3. 第三次握手:客户端 → 服务端

  • 客户端状态:SYN_SENT → ESTABLISHED
  • 报文:ACK=1,seq=x+1,ack=y+1
  • 含义:客户端确认服务端的连接请求,连接正式建立。
  • 作用:服务端确认客户端接收能力正常。
  • 服务端收到报文后,状态从 SYN_RCVD → ESTABLISHED。

至此,双方均进入连接已建立状态,可以开始传输应用数据。

为什么必须是三次握手?

1. 确认双方收发能力正常

  • 一次握手:仅能确认客户端发送能力正常。
  • 二次握手:无法确认客户端接收能力正常。
  • 三次握手:可完整确认客户端与服务端发送、接收能力均正常。

2. 同步初始序列号(ISN)

TCP 依靠序列号实现数据排序、去重、重传。三次握手完成双方初始序列号的交换与确认,为可靠传输奠定基础。

3. 防止历史过期连接导致资源错误分配

网络中可能存在延迟到达的旧连接请求报文。若仅两次握手,服务端收到过期 SYN 后会直接建立连接,造成资源浪费与逻辑错误。三次握手可让客户端拒绝过期连接,避免服务端无效分配资源。

相关推荐
hz567891 小时前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
广州浮点FLOATLIC1 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
优橙教育1 小时前
零基础学AI应用开发要多久?3个月能到什么水平
服务器·开发语言·网络·php
IT研究所2 小时前
AI-ITR平台如何减少客户问题反复升级?
大数据·运维·人工智能·低代码·自然语言处理·安全架构·企微
AIgorithmGEEK2 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Nil2082 小时前
leetcode 139单词拆分
linux·运维·服务器
Starry-sky(jing)2 小时前
BUG: unable to handle kernel paging request 完整排查:dmesg 四要素与三路定罪
linux·运维·服务器·内核·排障
mounter6252 小时前
从硬件互连到操作系统变革:CXL 技术演进与 Linux 内核工程挑战
linux·运维·服务器
zhengqweasd2 小时前
机房托管服务器怎么选硬盘,机械盘和 SSD 托管场景差异
运维·服务器·github