LiSheng's blog LiSheng's blog
首页
笔记
个人简历
随笔集
GitHub (opens new window)
首页
笔记
个人简历
随笔集
GitHub (opens new window)
  • golang

  • cplus

  • leetcode

  • 存储技术

  • 分布式系统

  • 计算机网络

    • tcp通信
    • tcp三次握手及其状态变化
      • tcp四次挥手及其状态变化
      • http
    • Linux操作系统

    • Redis

    • 其他

    • 笔记
    • 计算机网络
    lisheng
    2024-09-10
    目录

    tcp三次握手及其状态变化

    TCP 的三次握手(Three-Way Handshake)是建立可靠 TCP 连接的重要过程。在这个过程中,客户端和服务器通过一系列的状态变化互相确认对方的可用性,以确保连接的可靠性。以下是 TCP 三次握手的详细过程及连接状态变化。

    # 三次握手过程

    # 阶段 1:连接请求

    1. 客户端准备建立连接,发送一个 SYN(Sync)报文段到服务器。这个报文中包含客户端生成的初始序列号(seq)。
      • 状态变化:
        • 客户端状态:CLOSED → SYN_SENT
        • 服务器状态:CLOSED

    # 阶段 2:连接确认

    1. 服务器接收到客户的 SYN 报文段,回应一个 SYN-ACK(Sync-Acknowledgment)报文段。这个报文中包含服务器生成的初始序列号(seq),并确认客户端的 SYN 报文(确认号 ack 为客户端的初始序列号 + 1)。
      • 状态变化:
        • 客户端状态:SYN_SENT(继续保持)
        • 服务器状态:CLOSED → SYN_RECEIVED

    # 阶段 3:连接确认

    1. 客户端接收到服务器的 SYN-ACK 报文段后,发送一个 ACK(确认)报文段给服务器,确认号为 ack += 1,表示连接建立完成。
      • 状态变化:
        • 客户端状态:SYN_SENT → ESTABLISHED
        • 服务器状态:SYN_RECEIVED → ESTABLISHED

    # 总结连接状态变化

    操作 客户端状态 服务器状态
    Start Connection CLOSED → SYN_SENT CLOSED
    Recieve SYN SYN_SENT CLOSED → SYN_RECEIVED
    Send SYN-ACK SYN_SENT SYN_RECEIVED
    Recieve ACK SYN_SENT → ESTABLISHED SYN_RECEIVED → ESTABLISHED

    # 握手示意图

    以下是 TCP 三次握手的示意图:

    Client                                               Server
       |     SYN(seq=x) ----------------------------------> |
       |                                                  |
       |     <----------------- SYN-ACK(seq=y, ack=x+1) ---|
       |                                                  |
       |     ACK(ack=y+1) --------------------------------> |
       |                                                  |
       |                  Connection Established          |
    
    1
    2
    3
    4
    5
    6
    7
    8

    # 可能的异常情况

    在 TCP 三次握手过程中,虽然通常情况下连接的建立是顺利的,但在网络环境中,可能会出现各种异常场景。以下是一些可能的异常情况及其相应的描述:

    # 1. 重复的 SYN 请求

    • 场景:客户端由于网络延迟或者重试机制,可能会重复发送同一个 SYN 报文。
    • 影响:服务器可能会将其视为正常的连接请求,并返回多次 SYN-ACK。这种情况不会影响最终的连接建立,因为服务器最终会等待客户端的有效 ACK。

    # 2. 丢失的 SYN-ACK 响应

    • 场景:在第一步中,客户端发送 SYN 请求后,服务器发送 SYN-ACK 报文段,但这个 ACK 报文在传输过程中丢失。
    • 影响:客户端因未收到 SYN-ACK,会在超时后重新发送 SYN 请求,导致连接重试。服务器会响应新的 SYN 请求。

    # 3. 没有确认的连接(ACK 丢失)

    • 场景:客户端的 ACK 报文段可能在传输中丢失,导致服务器未收到确认。
    • 影响:此时,服务器会在超时后认为连接没有建立,并可能关闭等待状态,或重新发送 SYN-ACK 报文。

    # 4. 伪装的 SYN 攻击

    • 场景:网络攻击者产生大量伪造的 SYN 请求,攻击的目标是耗尽服务器的资源。
    • 影响:服务器会因接收到大量的 SYN 请求而处于半连接状态,最终可能导致拒绝服务(DoS)。这会造成正常用户无法建立连接。

    # 5. TCP 连接请求到错误的端口

    • 场景:客户端尝试连接到服务器的一个不存在的端口。
    • 影响:服务器将返回一个 RST(重置)报文段。客户端会立即感知连接失败。

    # 6. 序列号冲突

    • 场景:如果客户端重启并重新发送先前的连接请求,而一个新的 SYN 报文段的序列号与之前的连接请求重复。
    • 影响:服务器可能无法正确识别这个请求,因为它可能误认为这是个重发的连接请求,从而导致旧连接的状态混淆。

    # 7. MTU(最大传输单元)问题

    • 场景:网络中的 MTU 设置不一致,导致 SYN 或 SYN-ACK 报文过大被损坏或丢失。
    • 影响:连接建立失败,客户端无法收到其请求的确认。

    # 8. 主动端的网络分区

    • 场景:客户端在发送 SYN 且等待 SYN-ACK 期间失去与服务器的网络连接。
    • 影响:相同的情形会使连接无法建立,导致重试和超时。

    # 9. 拒绝连接

    • 场景:服务器由于负载过重、策略限制或防火墙阻挡拒绝新的连接请求。
    • 影响:服务器可能返回一个 RST 报文,客户端会知道连接请求被拒绝。

    # 总结

    TCP 三次握手过程中可能出现的异常情况主要都与网络不稳定、丢包、攻击以及服务器的资源管理有关。在设计和实施 TCP 连接时,因此要考虑这些潜在的问题,并根据实际应用的需求进行合理的异常处理和保障措施,以确保网络连接的可靠性和安全性。

    编辑 (opens new window)
    上次更新: 2024/09/13, 11:59:12
    tcp通信
    tcp四次挥手及其状态变化

    ← tcp通信 tcp四次挥手及其状态变化→

    最近更新
    01
    ceph分布式存储-对象存储(RGW)搭建
    10-27
    02
    ceph分布式存储-集群客户端连接
    10-27
    03
    ceph分布式存储-管理crushmap
    10-27
    更多文章>
    Theme by Vdoing
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式