ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

计算机网络之 TCP 三次握手详解

计算机网络之 TCP 三次握手详解

一、TCP 简介

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接、可靠的传输层协议

TCP 的主要特点:

  • 面向连接
  • 可靠传输
  • 字节流传输
  • 全双工通信
  • 拥塞控制

TCP 通信过程主要包括:

  1. 建立连接(三次握手)
  2. 数据传输
  3. 断开连接(四次挥手)

二、为什么需要三次握手?

TCP 是可靠通信协议,通信双方在传输数据之前,需要确认:

  1. 双方的发送能力是否正常
  2. 双方的接收能力是否正常
  3. 初始序列号是否同步

因此 TCP 在正式传输数据前,需要通过三次握手建立连接。


三、TCP 三次握手过程

TCP 三次握手过程如下:


第一次握手

客户端发送 SYN

客户端向服务器发送 SYN 报文:

SYN = 1 Seq = x

表示:

客户端请求建立连接,并告诉服务器自己的初始序列号。

状态变化:

客户端:

CLOSED -> SYN_SENT

服务器:

LISTEN

第二次握手

服务器回复 SYN + ACK

服务器收到客户端 SYN 后:

  1. 回复确认 ACK
  2. 同时发送自己的 SYN

报文:

SYN = 1 ACK = 1 Seq = y Ack = x + 1

含义:

  • Ack = x + 1表示已经收到客户端 SYN
  • Seq = y表示服务器自己的初始序列号

状态变化:

服务器:

LISTEN -> SYN_RCVD

第三次握手

客户端发送 ACK

客户端收到服务器 SYN+ACK 后:

发送确认报文:

ACK = 1 Seq = x + 1 Ack = y + 1

表示:

已经收到服务器的 SYN,可以开始通信。

状态变化:

客户端:

SYN_SENT -> ESTABLISHED

服务器收到 ACK 后:

SYN_RCVD -> ESTABLISHED

此时 TCP 连接建立完成。


四、为什么是三次握手?两次可以吗?

两次握手的问题

假设只有两次:

服务器收到 SYN 后认为连接建立。

但是:

如果客户端发送的 SYN 因网络延迟没有到达,而之后重新发送旧 SYN:

服务器可能误认为:

客户端又发起了一次新的连接。

导致资源浪费。

三次握手可以让双方确认:

  • 防止历史连接
  • 客户端发送能力正常
  • 服务端发送能力正常
  • 服务端接收能力正常
  • 客户端接收能力正常

保证双方状态同步。


五、三次握手过程中可能出现的问题

SYN 洪泛攻击(SYN Flood)

攻击者发送大量 SYN 请求:

客户端 ---- SYN ----> 服务器

服务器回复 SYN+ACK 后等待 ACK。

但是攻击者不发送 ACK。

导致:

  • 半连接队列占满
  • 正常用户无法连接

解决方法:

  • 增大TCP半连接队列
  • 开启SYN Cookie
  • 限制连接数量
  • 调大netdev_max_backlog

六、TCP 三次握手状态变化

客户端:

CLOSED -> SYN_SENT -> ESTABLISHED

服务器:

LISTEN -> SYN_RCVD -> ESTABLISHED

七、面试常见问题

1. 为什么需要三次握手?

答案:

TCP 三次握手主要用于确认双方的发送和接收能力,同时同步双方的初始序列号,保证后续数据可靠传输。


2. 第三次握手可以携带数据吗?

可以。

客户端发送 ACK 时可以携带数据。

但是通常不会立即发送业务数据,而是连接建立后再传输。


3. 服务端收到 SYN 后处于什么状态?

收到第一次握手:

LISTEN -> SYN_RCVD

4. SYN 和 ACK 分别表示什么?

标志位含义
SYN请求建立连接
ACK确认收到数据

总结

TCP 三次握手是 TCP 建立可靠连接的重要机制。

整个过程:

第一次: 客户端发送 SYN 第二次: 服务器发送 SYN+ACK 第三次: 客户端发送 ACK

通过三次握手,TCP 完成:

  • 连接建立
  • 序列号同步
  • 双方状态确认

这是计算机网络中非常重要的基础知识,也是 C/C++ 后端、网络编程岗位面试中的高频考点。

返回列表