Data Communication Computer Network 简明教程

Transmission Control Protocol

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

Features

  1. TCP 是可靠的协议。也就是说,接收者始终向发送者发送有关数据包的肯定或否定确认,以便发送者始终清楚数据包是否到达目的地或是否需要重新发送。

  2. TCP 确保数据以发送顺序到达预定目的地。

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

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

  5. TCP provides end-to-end communication.

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

  7. TCP 以客户/服务器点对点模式工作。

  8. TCP 提供全双工服务器,即它可以执行接收者和发送者的角色。

Header

TCP 报头的长度最少为 20 字节,最长为 60 字节。

TCP Header
  1. Source Port (16-bits) - 它用于标识发送设备上应用程序进程的源端口。

  2. Destination Port (16-bits) - 它用于标识接收设备上应用程序进程的目标端口。

  3. Sequence Number (32-bits) - 会话中某个报文分段中数据字节的序号。

  4. Acknowledgement Number (32-bits) - 当 ACK 标志位被设置时,此数字包含下一个预期数据字节的序号,并用作对前一个已收到的数据的确认。

  5. Data Offset (4-bits) - 这个字段既指 TCP 标头的长度(32 位字),也指当前数据包中数据在整个 TCP 报文分段中的偏移量。

  6. Reserved (3-bits) - 保留供将来使用,并且全部默认为零。

  7. Flags (1-bit each)

NS - 随机数和位由显式拥塞通知信令进程使用。 CWR - 当主机收到带有 ECE 比特位的报文时,它会设置拥塞窗口减小,以确认已收到 ECE。 ECE - 它具有两个含义:如果 SYN 比特位清除为 0,那么 ECE 表示 IP 数据包设置了其 CE(拥塞体验)比特位。如果 SYN 比特位设置为 1,则 ECE 表示该设备具有 ECT 功能。 URG - 它表明紧急指针字段具有重要数据,应予以处理。 ACK - 它表明确认字段具有重要意义。如果 ACK 被清除为 0,它表示数据包不包含任何确认。 PSH - 设置时,它是向接收站发出请求,要求将其(只要一到达)推送(push)到接收应用程序,而不要对其进行缓冲。 RST - 重置标志具有以下特点:它用于拒绝传入连接。它用于拒绝报文分段。它用于重启连接。 SYN - 此标志用于在主机之间建立连接。 FIN - 此标志用于释放连接,此后不再交换数据。由于具有 SYN 和 FIN 标志的数据包具有序号,因此将按正确顺序对其进行处理。

  1. Windows Size - 此字段用于在两个工作站之间进行流量控制,并指示接收方为报文分段分配的缓冲区大小(以字节为单位),即接收方期望接收多少数据。

  2. Checksum - 此字段包含报头、数据和伪报头的校验和。

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

  4. Options - 它有助于使用常规报头未涵盖的其他选项。选项字段总是用 32 位字来描述。如果此字段包含的数据少于 32 位,则使用填充来覆盖剩余的位,以达到 32 位边界。

Addressing

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

  1. 系统端口(0 到 1023)

  2. 用户端口(1024 到 49151)

  3. 私有/动态端口(49152 到 65535)

Connection Management

TCP 通信以服务器/客户端模式工作。客户端发起连接,服务器要么接受要么拒绝连接。使用三向握手来进行连接管理。

TCP handshake

Establishment

客户端发起连接并发送带有序号的报文分段。服务器用自己的序号对其进行确认,并对客户端的报文分段进行 ACK,其值比客户端的序号大 1。客户端在收到其报文分段的 ACK 后,对服务器的响应发送确认。

Release

服务器和客户端都可以发送设置 FIN 标志为 1 的 TCP 报文分段。当接收端通过确认 FIN 来对其进行响应时,该方向的 TCP 通信即关闭,并且连接被释放。

Bandwidth Management

TCP 使用窗口大小的概念来满足带宽管理的需求。窗口大小告知远程端的发送方,此端接收方可以接收的数据字节段数。TCP 使用窗口大小 1 通过慢启动阶段,并在每次成功通信后以指数方式增加窗口大小。

例如,客户端使用窗口大小 2,并发送 2 个字节的数据。当收到此段的确认时,窗口大小会加倍为 4,而下一次发送的段长度将为 4 个数据字节。当收到 4 字节数据段的确认后,客户端将窗口大小设置为 8,依此类推。

如果错失确认(即数据在传输网络中丢失或收到 NACK),则窗口大小将减半,并重新启动慢启动阶段。

Error Control &and Flow Control

TCP 使用端口号来了解它需要将数据段移交到哪个应用程序进程。除此之外,它还使用序列号来与远程主机同步。所有数据段都带有序列号进行发送和接收。发送方通过获得 ACK 时,了解接收方收到的上一个数据段是什么。接收方通过查阅最近收到的数据包的序列号而了解发送方发送的上一个数据段。

如果最近收到的数据段的序列号与接收方预期的序列号不匹配,则该段将被丢弃,并发送回 NACK。如果两个段带有相同的序列号到达,则将比较 TCP 时间戳值以做出决策。

Multiplexing

将两个或多个数据流合并到一个会话中的技术称为多路复用。当 TCP 客户端与服务器初始化连接时,它始终会指代一个明确的端口号,该端口号表示该应用程序进程。客户端本身使用从专用端口号池中随机生成的端口号。

通过使用 TCP 多路复用,一个客户端可以在单个会话中与多个不同的应用程序进程通信。例如,客户端请求一个网页,该网页包含不同类型的数据(HTTP、SMTP、FTP 等),TCP 会话超时被增加,会话将被保持开放更长时间,从而可以避免三路握手开销。

这使用户系统能够通过单个虚拟连接接收多个连接。如果超时时间太长,这些虚拟连接并不适用于服务器。

Congestion Control

当系统中输入大量的数据而系统无法处理时,就会发生拥塞。TCP 通过窗口机制来控制拥塞。TCP 设置窗口大小,告诉另一端发送多少数据段。TCP 可使用三种算法来控制拥塞:

  1. Additive increase, Multiplicative Decrease

  2. Slow Start

  3. Timeout React

Timer Management

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

Keep-alive timer:

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

  2. 当保活时间到期时,主机将发送探测,以检查连接是否仍然存在。

Retransmission timer:

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

  2. 如果发送的数据确认没有在重传时间内收到,则将重新发送数据段。

Persist timer:

  1. TCP 会话可以由任一主机通过发送窗口大小 0 来暂停。

  2. 要恢复会话,主机需要发送带有较大值窗口大小。

  3. 如果此段从未到达另一端,则两端可能会无限期地等待对方。

  4. 当维持计时器到期时,主机重新发送其窗口大小,以告知另一端。

  5. 维持计时器有助于避免通信中的死锁。

Timed-Wait:

  1. 在释放连接后,任一主机都会等待一个等待时间段以完全终止连接。

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

  3. 等待超时最长为 240 秒(4 分钟)。

Crash Recovery

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

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