传输控制协议

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


特点

  • TCP是可靠的协议。 也就是说,接收方总是向发送方发送关于数据包的肯定或否定确认,以便发送方始终清楚地知道数据包是到达目的地还是需要重新发送。

  • TCP 确保数据按照发送顺序到达预期目的地。

  • TCP 是面向连接的。 TCP 要求在发送实际数据之前建立两个远程点之间的连接。

  • TCP 提供错误检查和恢复机制。

  • TCP 提供端到端的通信。

  • TCP 提供流量控制和服务质量。

  • TCP 以客户端/服务器点对点模式运行。

  • TCP 提供全双工服务器,即它可以同时扮演接收者和发送者的角色。


TCP 头

TCP 头的长度最小为 20 字节,最大为 60 字节。

TCP 头
  • 源端口(16 位)  - 识别发送设备上应用程序进程的源端口。

  • 目标端口(16 位) - 标识接收设备上应用程序进程的目标端口。

  • 序列号(32 位) - 会话中段的数据字节的序列号。

  • 确认号(32 位)  - 设置 ACK 标志时,此编号包含预期数据字节的下一个序列号,并用作对先前接收到的数据的确认。

  • 数据偏移量(4 位)  - 该字段包含 TCP 标头(32 位字)的大小和当前数据包中数据在整个 TCP 段中的偏移量。

  • 保留(3 位)  - 保留供将来使用,默认情况下全部设置为零。

  • 标志(每个 1 位)

    • NS - 显式拥塞通知信令过程使用 Nonce Sum 位。

    • CWR - 当主机接收到设置了 ECE 位的数据包时,它会设置 Congestion Windows Reduced 以确认 ECE 已收到。

    • ECE - 它有两个含义:

      • 如果 SYN 位清为 0,则 ECE 表示 IP 数据包已设置其 CE(拥塞体验)位。

      • 如果 SYN 位设置为 1,则 ECE 表示设备支持 ECT。

    • URG - 表示Urgent Pointer字段有重要数据,需要处理。

    • ACK - 它表明Acknowledgement 字段是有意义的。 如果 ACK 清为 0,则表明该数据包不包含任何确认。

    • PSH - 设置后,它是对接收站的请求,将数据(一旦到达)推送到接收应用程序而不缓冲它。

    • RST - 复位标志具有以下特点:

      • 它用于拒绝传入的连接。

      • 它用于拒绝段。

      • 它用于重新启动连接。

    • SYN - 该标志用于建立主机之间的连接。

    • FIN - 该标志用于释放连接,此后不再交换数据。 由于带有 SYN 和 FIN 标志的数据包具有序列号,因此它们会按正确的顺序进行处理。

  • Windows Size  - 该字段用于两个站之间的流量控制,并指示接收方为段分配的缓冲区数量(以字节为单位),即接收方期望的数据量。

  • Checksum - 该字段包含 Header、Data 和 Pseudo Headers 的校验和。

  • Urgent Pointer  - 如果 URG 标志设置为 1,则它指向紧急数据字节。

  • Options  - 它促进了常规标题未涵盖的其他选项。 选项字段总是以 32 位字描述。 如果该字段包含小于 32 位的数据,则使用填充来覆盖剩余的位以达到 32 位边界。


寻址

两个远程主机之间的 TCP 通信是通过端口号 (TSAP) 完成的。 端口号范围为 0 – 65535,分为:

  • 系统端口 (0 – 1023)
  • 用户端口 (1024 – 49151)
  • 专用/动态端口 (49152 – 65535)

连接管理

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

TCP 握手

Establishment

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

Release

服务器和客户端都可以发送 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 时间:

  • 此计时器用于检查连接的完整性和有效性。

  • 当keep-alive时间到期时,主机会发送一个探测来检查连接是否仍然存在。

Retransmission 时间:

  • 此计时器维护已发送数据的有状态会话。

  • 如果在Retransmission时间内没有收到发送数据的确认,则重新发送数据段。

Persist 时间:

  • 任一主机都可以通过发送 Window Size 0 来暂停 TCP 会话。

  • 要恢复会话,主机需要发送具有较大值的 Window Size。

  • 如果这个段永远不会到达另一端,那么两端可能会无限期地等待对方。

  • 当 Persist 计时器到期时,主机重新发送其窗口大小以让另一端知道。

  • Persist 时间有助于避免通信中的死锁。

Timed-Wait 时间:

  • 释放连接后,任一主机都会等待 Timed-Wait 时间以完全终止连接。

  • 这是为了确保另一端已经收到其连接终止请求的确认。

  • 超时最长可达 240 秒(4 分钟)。


崩溃恢复

TCP 是非常可靠的协议。 它为分段发送的每个字节提供序列号。 它提供了反馈机制,即当主机接收到一个数据包时,它绑定到 ACK 该数据包具有预期的下一个序列号(如果它不是最后一个段)。

当 TCP 服务器在通信中途崩溃并重新启动其进程时,它会向其所有主机发送 TPDU 广播。 然后主机可以发送最后一个从未被确认的数据段并继续。