无图、长文警告!!!!
文章目录
一、引言
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF(互联网工程任务组)的 RFC 793 定义。在 TCP 协议中,三次握手(Three-Way Handshake)是建立可靠连接的关键步骤。本文将详细解析 TCP 三次握手的过程、原理以及相关细节。
二、TCP 三次握手的过程
(一)第一次握手:SYN(同步序列号)
• 客户端发起请求:客户端(通常是浏览器或其他应用程序)向服务器发送一个 TCP 数据包,数据包中的 SYN(同步序列号)标志位被设置为 1,表示请求建立连接。同时,客户端会随机生成一个初始序列号(ISN,Initial Sequence Number),并将其放入 TCP 头部的序列号字段中。
• 数据包内容:
• SYN:1
• 序列号:客户端生成的随机初始序列号(ISN)
• 确认号:0(因为还没有收到服务器的任何数据)
• 其他字段:如窗口大小、最大报文段长度(MSS)等
(二)第二次握手:SYN-ACK(同步确认)
• 服务器响应:服务器收到客户端的 SYN 数据包后,会检查数据包的合法性。如果合法,服务器会发送一个 SYN-ACK 数据包作为响应。这个数据包包含两个标志位:
• SYN:1
• ACK:1
• 数据包内容:
• SYN:1
• ACK:1
• 序列号:服务器生成的随机初始序列号(ISN)
• 确认号:客户端的初始序列号+1(表示对客户端的 SYN 数据包的确认)
• 其他字段:如窗口大小、最大报文段长度(MSS)等
(三)第三次握手:ACK(确认)
• 客户端确认:客户端收到服务器的 SYN-ACK 数据包后,会发送一个 ACK 数据包作为确认。这个数据包包含:
• SYN:0
• ACK:1
• 数据包内容:
• SYN:0
• ACK:1
• 序列号:客户端的初始序列号+1
• 确认号:服务器的初始序列号+1(表示对服务器的 SYN-ACK 数据包的确认)
• 其他字段:如窗口大小等
• 连接建立:当服务器收到客户端的 ACK 数据包后,TCP 连接正式建立,双方可以开始传输数据。
三、TCP 三次握手的原理
(一)为什么需要三次握手?
• 防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误:
• 在网络中,数据包可能会因为各种原因延迟到达。如果一个连接请求(SYN)在发送后因为网络延迟或其他原因没有得到及时响应,客户端可能会重新发送这个请求。如果没有三次握手,服务器可能会误以为这是一个新的连接请求,从而导致错误。
• 通过三次握手,服务器可以确保客户端确实收到了它的 SYN-ACK 响应,并且客户端仍然希望建立连接。
• 同步双方的初始序列号:
• TCP 是一个面向字节流的协议,数据的传输需要通过序列号来确保数据的顺序和完整性。在三次握手过程中,客户端和服务器分别生成并交换初始序列号(ISN),从而确保双方在数据传输过程中能够正确地识别和确认数据包。
(二)三次握手中的序列号和确认号
• 序列号(Sequence Number):
• 序列号是 TCP 头部的一个字段,用于标识发送方发送的数据包的顺序。在三次握手过程中,客户端和服务器分别生成一个初始序列号(ISN),并将其放入相应的数据包中。
• 客户端的初始序列号(ISN)在第一次握手(SYN)中发送给服务器。
• 服务器的初始序列号(ISN)在第二次握手(SYN-ACK)中发送给客户端。
• 确认号(Acknowledgment Number):
• 确认号是 TCP 头部的一个字段,用于标识接收方期望收到的下一个数据包的序列号。在三次握手过程中,确认号用于确认对方发送的数据包。
• 在第二次握手(SYN-ACK)中,服务器的确认号是客户端的初始序列号+1。
• 在第三次握手(ACK)中,客户端的确认号是服务器的初始序列号+1。
四、TCP 三次握手的详细解析
(一)第一次握手(SYN)
• 客户端发送 SYN 数据包:
• 源 IP 地址:客户端的 IP 地址
• 目的 IP 地址:服务器的 IP 地址
• 源端口号:客户端随机选择的端口号
• 目的端口号:服务器的监听端口号(如 HTTP 的 80 端口)
• SYN:1
• 序列号:客户端生成的随机初始序列号(ISN)
• 确认号:0
• 窗口大小:客户端的接收窗口大小
• 最大报文段长度(MSS):客户端支持的最大报文段长度
(二)第二次握手(SYN-ACK)
• 服务器发送 SYN-ACK 数据包:
• 源 IP 地址:服务器的 IP 地址
• 目的 IP 地址:客户端的 IP 地址
• 源端口号:服务器的监听端口号(如 HTTP 的 80 端口)
• 目的端口号:客户端随机选择的端口号
• SYN:1
• ACK:1
• 序列号:服务器生成的随机初始序列号(ISN)
• 确认号:客户端的初始序列号+1
• 窗口大小:服务器的接收窗口大小
• 最大报文段长度(MSS):服务器支持的最大报文段长度
(三)第三次握手(ACK)
• 客户端发送 ACK 数据包:
• 源 IP 地址:客户端的 IP 地址
• 目的 IP 地址:服务器的 IP 地址
• 源端口号:客户端随机选择的端口号
• 目的端口号:服务器的监听端口号(如 HTTP 的 80 端口)
• SYN:0
• ACK:1
• 序列号:客户端的初始序列号+1
• 确认号:服务器的初始序列号+1
• 窗口大小:客户端的接收窗口大小
五、TCP 三次握手的图解
客户端 服务器
| |
| SYN (Seq=ISN1) |
|------------------------------------>|
| |
| <----------------------------------|
| SYN-ACK (Seq=ISN2, Ack=ISN1+1) |
| |
| ACK (Seq=ISN1+1, Ack=ISN2+1) |
|------------------------------------>|
| |
| 连接建立,可以开始传输数据 |
| |
六、TCP 三次握手的常见问题
(一)为什么不是两次握手?
• 防止已失效的连接请求报文段突然又传送到了服务端:
• 如果只有两次握手,服务器在收到客户端的 SYN 数据包后,直接发送 ACK 数据包确认连接。如果客户端的 SYN 数据包因为网络延迟或其他原因重新发送,服务器可能会误以为这是一个新的连接请求,从而导致错误。
• 通过三次握手,客户端在收到服务器的 SYN-ACK 数据包后,会发送一个 ACK 数据包作为确认,确保服务器知道客户端仍然希望建立连接。
(二)为什么不是四次握手?
• 效率问题:
• 四次握手会增加连接建立的时间和网络开销。三次握手已经足够确保连接的可靠性和安全性,不需要额外的确认步骤。
(三)SYN 泛洪攻击(SYN Flood)
1.攻击原理
SYN 泛洪攻击是一种常见的拒绝服务攻击(DoS)手段。攻击者向服务器发送大量的 SYN 数据包,但不发送 ACK 数据包。服务器在收到 SYN 数据包后,会发送 SYN-ACK 数据包并等待客户端的 ACK 数据包确认,但客户端永远不会发送 ACK 数据包。这会导致服务器的连接队列被占满,无法处理新的连接请求,从而导致服务不可用。
2.防御措施
• SYN Cookie:
• 原理:SYN Cookie 是一种防御 SYN 泛洪攻击的技术。服务器在收到 SYN 数据包后,不立即分配资源,而是生成一个特殊的序列号(Cookie),并将这个 Cookie 放入 SYN-ACK 数据包中发送给客户端。当客户端发送 ACK 数据包时,服务器通过验证 Cookie 的合法性来确认客户端是否是合法的连接请求。
• 优点:不需要为每个 SYN 数据包分配资源,有效减少了资源消耗。
• 缺点:在高并发场景下,可能会导致合法连接的丢包率增加。
• 限制 SYN 数据包的速率:
• 原理:通过限制单位时间内接收的 SYN 数据包数量,可以有效缓解 SYN 泛洪攻击。如果单位时间内接收到的 SYN 数据包数量超过设定的阈值,服务器将丢弃多余的 SYN 数据包。
• 优点:简单易实现,对合法连接的影响较小。
• 缺点:在高并发场景下,可能会误判合法连接。
• 使用防火墙和入侵检测系统(IDS):
• 原理:防火墙可以设置规则,限制来自特定 IP 地址或网络的 SYN 数据包数量。IDS 可以检测到异常的 SYN 数据包流量,并及时发出警报或采取措施。
• 优点:可以有效识别和阻止恶意攻击,保护服务器的安全。
• 缺点:需要专业的设备和人员进行配置和维护,成本较高。
• 增加服务器资源:
• 原理:通过增加服务器的资源(如内存、CPU 等),可以提高服务器处理 SYN 数据包的能力,从而在一定程度上缓解 SYN 泛洪攻击。
• 优点:简单直接,对合法连接的影响较小。
• 缺点:成本较高,且不能从根本上解决问题。
七、TCP 三次握手的优化
(一)快速打开(TFO)
• 原理:TCP 快速打开(TCP Fast Open,TFO)是一种优化技术,允许客户端在第一次握手(SYN)中携带数据,从而减少连接建立的时间。TFO 通过在 SYN 数据包中携带加密的 Cookie 来实现,服务器在收到 SYN 数据包后,可以直接处理数据,而不需要等待第三次握手完成。
• 优点:显著减少了连接建立的时间,提高了应用的响应速度。
• 缺点:需要客户端和服务器都支持 TFO,且安全性需要通过加密机制来保证。
(二)并行连接
• 原理:在某些场景下,客户端可以同时发起多个连接请求,从而提高数据传输的效率。例如,浏览器在加载网页时,可以并行发起多个 HTTP 请求,提高页面加载速度。
• 优点:提高了数据传输的效率,适用于高并发场景。
• 缺点:增加了服务器的负载,需要合理控制并发数量。
八、总结
TCP 三次握手是建立可靠连接的关键步骤,通过同步序列号、确认号和状态机的配合,确保了连接的可靠性和数据的完整性。三次握手不仅防止了已失效的连接请求报文段突然又传送到了服务端,还同步了双方的初始序列号,为后续的数据传输奠定了基础。
在实际应用中,三次握手可能会面临 SYN 泛洪攻击等安全威胁,通过 SYN Cookie、限制 SYN 数据包速率、使用防火墙和 IDS 等技术,可以有效防御这些攻击。此外,通过优化技术如 TCP 快速打开(TFO)和并行连接,可以进一步提高连接建立的效率和数据传输的性能。
理解 TCP 三次握手的原理和机制,有助于我们更好地设计和优化网络应用,提高系统的可靠性和性能。