跳到正文HisnLabs
← TCP/IP:地址、端口和连接

第 3 课,共 4 课 · 7 分钟

TCP 握手与一次连接的一生

两台计算机在发送真正的数据之前是如何商定通信的、它们又是如何结束这场对话的,以及中间的防火墙实际上能看到什么。

在你的 Mac 发送网页请求的第一个字节之前,它已经与服务器交换过三条简短的消息。这次交换,也就是 TCP 三次握手,正是把上一课中 TCP 所承诺的可靠性,变成两台机器之间一条真实、可追踪连接的关键。

第一句话之前的三条消息

当前的 TCP 规范 RFC 9293 把这个过程描述为一次同步交换:“同步要求双方各自发送自己的初始序列号,并从对方的 TCP 端收到对该序列号的确认。”

  1. SYN。发起连接的设备发送一个设置了 SYN 标志位的报文段,携带一个起始序列号。
  2. SYN-ACK。对方回复自己的 SYN,并对第一个序列号进行确认。
  3. ACK。发起方对这次回复进行确认。RFC 9293 指出:“由于步骤 2 和步骤 3 可以合并为一条消息,这个过程被称为三次(或三条消息)握手。”一旦完成,双方都会把这条连接标记为“已建立”(ESTABLISHED),并开始发送真正的数据。

Cloudflare 学习中心用电子邮件作为例子,给出了同一个概念的通俗版本:“首先,源端向目标服务器发送一个 SYN‘初始请求’数据包,以开始这次对话。接着,目标服务器发送一个 SYN-ACK 数据包表示同意这个过程。最后,源端向目标发送一个 ACK 数据包确认这个过程,之后就可以发送消息内容了。”

干净利落地结束一条连接

结束一条连接比建立它更为谨慎。RFC 9293 解释说,在连接结束之前,“正常的 TCP 关闭流程会在双向上都可靠地送达已缓冲的数据”:每一方在没有更多数据要发送时,会发送一个 FIN 报文段,对方对其进行确认,只有在双向都完成之后,连接才会彻底关闭。随后会有一段短暂的等待期(TIME-WAIT),以确保旧连接中任何滞留、延迟到达的数据包,不会被误认为属于一条新连接。

中间的防火墙能看到什么

有状态防火墙——大多数路由器以及 macOS 自身内置的那种——不需要检查每一个数据包就能做出判断。Cloudflare 对防火墙的解释是这样的:它“保存关于已建立连接的信息,并利用这些信息来分析进出的流量,而不是逐一检查每个数据包”。实际操作中,这意味着它会留意开启一条连接的 SYN,记住这个应用在等待一个回复,然后悄悄放行与之匹配的 SYN-ACK 返回;一个与任何已发出的 SYN 都不匹配的回复则会被丢弃。这也是防火墙能够分辨一个正常回复与一次凭空冒出、未经请求的连接尝试的方式,也是屏蔽不需要的入站流量的基础。

这整个交换过程本身并没有被 TCP 加密;SYN、SYN-ACK 和 ACK 都以明文形式,对任何监视网络路径的一方可见,包括你的 Wi-Fi 路由器。什么被隐藏、什么没有被隐藏,取决于 TCP 之上的那一层,例如 HTTPS 网站所使用的 TLS,这一点在“互联网是如何运作的”课程中另有讲解。

要点

  • 根据 RFC 9293,TCP 连接以三次握手开启:先是 SYN,然后是 SYN-ACK,再是 ACK。
  • 只有握手完成之后,双方才会开始交换真正的数据。
  • 关闭一条连接是一次双向的 FIN 报文段交换,确保缓冲的数据在连接结束前被送达。
  • 有状态防火墙会跟踪发出过哪些 SYN,从而能识别并放行与之匹配的回复,并丢弃未经请求的回复。
  • 握手过程本身并未加密;网络路径上的任何一方都能看到它。

自我检测

  1. 1. TCP 三次握手的正确顺序是什么?

    • ACK、SYN、SYN-ACK
    • SYN、SYN-ACK、ACK — 正确。
    • SYN-ACK、SYN、ACK
    • FIN、SYN、ACK

    RFC 9293 描述的是发起连接的一方先发送 SYN,对方回复 SYN-ACK,然后发起方再用 ACK 加以确认。

  2. 2. TCP 连接上,真正的应用数据是从什么时候开始流动的?

    • 在 SYN 发送之前
    • 只有在三次握手完成之后 — 正确。
    • 在 SYN-ACK 阶段
    • 数据持续流动,不需要握手

    握手的存在是为了在双方都足够信任这条连接、愿意发送真正的数据之前,先同步好序列号。

  3. 3. 有状态防火墙是如何决定放行一个入站回复数据包的?

    • 默认放行所有入站数据包
    • 检查该数据包是否匹配这台设备此前发出的一个 SYN 所对应的连接 — 正确。
    • 检查数据包内容中是否含有关键词
    • 只看目标端口,从不考虑连接状态

    Cloudflare 把有状态防火墙描述为会“保存关于已建立连接的信息”的防火墙,借此识别合法的回复,而不是从头检查每一个数据包。

  4. 4. TCP 握手本身是加密的吗?

    • 是的,始终加密
    • 不是,它是明文的,网络路径上的任何一方都能看到 — 正确。
    • 只有 SYN 是加密的
    • 只有在 HTTPS 连接中才加密

    TCP 提供的是顺序性和可靠性,而不是保密性。如果存在加密,那也是来自 TCP 之上的一层,例如 TLS。

用 FireAI 动手做

在你自己的 Mac 上练习这节课的内容。

来源

在你的 Mac 上实践

免费试用全部功能 17 天,无需绑定银行卡。

下载 Mac 版 文档