计算机网络 - 传输控制协议 (TCP)

  • 简述

    传输控制协议 (TCP) 是 Internet 协议套件中最重要的协议之一。它是互联网等通信网络中使用最广泛的数据传输协议。
  • 特征

    • TCP是可靠的协议。也就是说,接收方总是向发送方发送关于数据包的肯定或否定确认,以便发送方始终清楚地知道数据包是到达目的地还是需要重新发送。
    • TCP 确保数据按照发送顺序到达预期目的地。
    • TCP是面向连接的。TCP 要求在发送实际数据之前建立两个远程点之间的连接。
    • TCP 提供错误检查和恢复机制。
    • TCP 提供端到端的通信。
    • TCP 提供流量控制和服务质量。
    • TCP 在客户端/服务器点对点模式下运行。
    • TCP 提供全双工服务器,即它可以同时扮演接收者和发送者的角色。
  • Header

    TCP 标头的长度最小为 20 字节,最大为 60 字节。
    TCP 标头
    • Source Port (16-bits)  - 它识别发送设备上应用程序进程的源端口。
    • Destination Port (16-bits) - 它识别接收设备上应用程序进程的目标端口。
    • Sequence Number (32-bits) - 会话中段的数据字节的序列号。
    • Acknowledgement Number (32-bits)  - 当 ACK 标志被设置时,该数字包含预期数据字节的下一个序列号,并用作对先前接收到的数据的确认。
    • Data Offset (4-bits)  - 该字段包含 TCP 标头(32 位字)的大小和当前数据包中数据在整个 TCP 段中的偏移量。
    • Reserved (3-bits)  - 保留供将来使用,默认情况下全部设置为零。
    • Flags (1-bit each)
      • NS- 显式拥塞通知信令过程使用现时和位。
      • CWR- 当主机接收到设置了 ECE 位的数据包时,它会设置 Congestion Windows Reduced 以确认 ECE 已接收。
      • ECE- 它有两个含义:
        • 如果 SYN 位清为 0,则 ECE 表示 IP 数据包已设置其 CE(拥塞体验)位。
        • 如果 SYN 位设置为 1,则 ECE 表示设备支持 ECT。
      • URG- 表示紧急指针字段有重要数据,应进行处理。
      • ACK- 表示Acknowledgement 字段有意义。如果 ACK 清为 0,则表明该数据包不包含任何确认。
      • PSH- 设置时,它是对接收站的请求,将数据(一旦到达)推送到接收应用程序而不缓冲它。
      • RST- 复位标志具有以下特点:
        • 它用于拒绝传入连接。
        • 它用于拒绝一个段。
        • 它用于重新启动连接。
      • SYN- 此标志用于在主机之间建立连接。
      • FIN- 该标志用于释放连接,此后不再交换数据。因为带有 SYN 和 FIN 标志的数据包具有序列号,所以它们会以正确的顺序进行处理。
    • Windows Size  - 该字段用于两个站之间的流量控制,并指示接收方为段分配的缓冲区量(以字节为单位),即接收方期望的数据量。
    • Checksum - 此字段包含 Header、Data 和 Pseudo Headers 的校验和。
    • Urgent Pointer  - 如果 URG 标志设置为 1,则它指向紧急数据字节。
    • Options  - 它促进了常规Header未涵盖的其他选项。选项字段总是以 32 位字描述。如果该字段包含小于 32 位的数据,则使用填充来覆盖剩余的位以达到 32 位边界。
  • 寻址

    两个远程主机之间的 TCP 通信是通过端口号 (TSAP) 完成的。端口号范围为 0 – 65535,分为:
    • 系统端口 (0 – 1023)
    • 用户端口 (1024 – 49151)
    • 专用/动态端口 (49152 – 65535)
  • 连接管理

    TCP 通信在服务器/客户端模型中工作。客户端启动连接,服务器接受或拒绝它。三向握手用于连接管理。
    TCP 握手

    设立

    客户端启动连接并发送带有序列号的段。服务器用自己的序列号和客户端段的 ACK 确认它,该段比客户端的序列号多一个。客户端在收到其段的 ACK 后发送一个服务器响应的确认。

    发布

    服务器和客户端都可以发送 FIN 标志设置为 1 的 TCP 报文段。当接收端通过 ACK 确认 FIN 回复它时,该 TCP 通信方向关闭并释放连接。
  • 带宽管理

    TCP 使用窗口大小的概念来适应带宽管理的需要。窗口大小告诉远端的发送方,本端接收方可以接收的数据字节段数。TCP 通过使用窗口大小 1 来使用慢启动阶段,并在每次成功通信后以指数方式增加窗口大小。
    例如,客户端使用大小为 2 的 windows 并发送 2 个字节的数据。当收到此段的确认时,窗口大小加倍为 4,下一次发送时,发送的段将是 4 个数据字节长。当收到 4 字节数据段的确认时,客户端将窗口大小设置为 8,依此类推。
    如果确认丢失,即数据在传输网络中丢失或收到 NACK,则窗口大小减半并重新开始慢启动阶段。
  • 错误控制∧流控制

    TCP 使用端口号来了解它需要哪个应用程序进程来切换数据段。除此之外,它还使用序列号与远程主机同步。所有数据段都使用序列号发送和接收。当 Sender 收到 ACK 时,Sender 知道 Receiver 收到了最后一个数据段。Receiver通过参考最近接收到的数据包的序号知道Sender发送的最后一个段。
    如果最近接收到的段的序列号与接收方期望的序列号不匹配,则将其丢弃并发回 NACK。如果两个段以相同的序列号到达,则比较 TCP 时间戳值以做出决定。
  • 多路复用

    在一个会话中组合两个或多个数据流的技术称为多路复用。当 TCP 客户端初始化与服务器的连接时,它总是引用一个明确定义的端口号,该端口号指示应用程序进程。客户端本身使用从私有端口号池中随机生成的端口号。
    使用 TCP 多路复用,客户端可以在单个会话中与多个不同的应用程序进程进行通信。例如,客户端请求一个网页,该网页又包含不同类型的数据(HTTP、SMTP、FTP 等),TCP 会话超时增加,会话保持打开更长时间,因此三次握手开销可以避免。
    这使客户端系统能够通过单个虚拟连接接收多个连接。如果超时时间过长,这些虚拟连接对服务器不利。
  • 拥塞控制

    当大量数据被馈送到无法处理的系统时,就会发生拥塞。TCP通过Window机制控制拥塞。TCP 设置一个窗口大小,告诉另一端要发送多少数据段。TCP 可以使用三种算法进行拥塞控制:
    • 加法增加,乘法减少
    • 慢启动
    • 超时反应
  • 定时器管理

    TCP 使用不同类型的定时器来控制和管理各种任务:

    保活定时器:

    • 此计时器用于检查连接的完整性和有效性。
    • 当keep-alive时间到期时,主机发送一个探测来检查连接是否仍然存在。

    重传定时器:

    • 此计时器维护已发送数据的有状态会话。
    • 如果在Retransmission时间内没有收到发送数据的确认,则重新发送数据段。

    持续计时器:

    • 任一主机都可以通过发送 Window Size 0 来暂停 TCP 会话。
    • 要恢复会话,主机需要发送具有较大值的 Window Size。
    • 如果该段从未到达另一端,则两端可能会无限期地等待对方。
    • 当 Persist 计时器到期时,主机重新发送其窗口大小以让另一端知道。
    • Persist Timer 有助于避免通信中的死锁。

    定时等待:

    • 释放连接后,任何一个主机都会等待 Timed-Wait 时间以完全终止连接。
    • 这是为了确保另一端已收到其连接终止请求的确认。
    • 超时最长可达 240 秒(4 分钟)。
  • 崩溃恢复

    TCP是非常可靠的协议。它为分段发送的每个字节提供序列号。它提供了反馈机制,即当主机接收到一个数据包时,它必须确认该数据包具有预期的下一个序列号(如果它不是最后一个段)。
    当 TCP 服务器在通信中途崩溃并重新启动其进程时,它会向其所有主机发送 TPDU 广播。然后主机可以发送最后一个从未被确认的数据段并继续。