TCP 简介

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由RFC 793定义。

TCP 一旦 建立会话,它便可以跟踪该会话中的对话。 由于 TCP 能够跟踪实际对话,它被视为状态协议。 状态协议是跟踪通信会话状态的协议。 例如,当使用 TCP 传输数据时,发送方期望目标确认收到数据。 TCP 跟踪已发送的信息和已确认的信息。 如果数据未被确认,发送方会假设数据未到达并重新发送数据。 状态会话开始于会话建立时,结束于会话终止时。

**注意:**维护此状态信息需要某些资源,而对于 UDP 等无状态协议是不需要的。

TCP 实现这些功能会产生额外的开销。 如图(TCP 数据报头)所示,每个 TCP 数据段都有 20 字节的开销用于在报头中封装应用层数据。 这比 UDP 数据段要高很多,UDP 只有 8 字节的开销。 额外的负载包括:

  • 序列号(32 位) - 用于数据重组。

  • 确认号(32 位) - 表示收到的数据。

  • 报头长度(4 位) - 称为“数据偏移量”。 表示 TCP 数据段报头的长度。

  • 保留(6 位) - 此字段留作将来使用。

  • 控制位(6 位) - 包括位码或标志,表示 TCP 数据段的用途和功能。

  • 窗口大小(16 位) - 表示可以一次接受的数据段的数量。

  • 校验和(16 位) - 用于数据段报头和数据的错误检查。

  • 紧急(16 位) - 表示数据是否紧急。

使用 TCP 的典型应用是 Web 浏览器、电子邮件和文件传输。

TCP 数据报头

image-20210809162154505

TCP 通信

TCP 通信的可靠性通过使用面向连接的会话来实现。 主机使用 TCP 协议发送数据到另一主机前,TCP 会启动一个进程,用于创建与目的主机之间的连接。 通过该状态连接,可以跟踪主机之间的会话或者通信数据流。 同时,该进程还确保每台主机都知道并为通信数据流做好准备。

会话创建后开始传输数据,目的主机针对收到的数据段向源主机发送确认信息。 在 TCP 会话中,这些确认信息构成了可靠性的基础。 源主机收到确认信息时,即表明数据成功发送,且可以退出数据跟踪。 如果源主机未在规定时间内收到确认信息,它将向目的主机重新传输数据。

使用 TCP 协议的额外系统开销部分源自确认信息和重新传输信息产生的网络流量。 建立会话产生的其他数据段交换也会构成系统开销。 此外,主机在跟踪待确认的数据和重新发送过程中也会产生额外开销。

TCP 连接的建立和终止

当两台主机采用 TCP 协议进行通信时,在交换数据前将建立连接。通信完成后,将关闭会话并终止连接。连接和会话机制保障了 TCP 的可靠性功能。

主机跟踪会话过程中的每个数据段,并使用 TCP 报头信息交换已接收数据的相关信息。 TCP 是全双工协议,每个连接都代表两个单向通信数据流或会话。 若要建立连接,主机应执行三次握手。 TCP 报头中的控制位指出了连接的进度和状态。 三次握手:

  • 确认目的设备存在于网络上;
  • 确认目的设备有活动的服务,并且正在源客户端要使用的目的端口号上接受请求;
  • 通知目的设备源客户端想要在该端口号上建立通信会话。

在 TCP 连接中,主机客户端与服务器建立连接。 TCP 连接创建的过程分为三个步骤:

第 1 步: 源客户端请求与服务器进行客户端-服务器通信会话。

第 2 步: 服务器确认客户端-服务器通信会话,并请求服务器-客户端通信会话。

第 3 步: 源客户端确认服务器-客户端通信会话。

在 TCP 数据段报头中,有六个包含控制信息的 1 比特字段,用于管理 TCP 进程。这些字段分别是:

  • URG - 紧急指针字段(重要)

  • ACK - 确认字段(重要)

  • PSH - 推送功能

  • RST - 重置连接

  • SYN - 同步序列号

  • FIN - 发送方已传输完所有数据

ACK 和 SYN 字段均与我们的三次握手分析相关。

三次握手过程

步骤 1:

TCP 客户端发送带同步序列号 (SYN) 控制标志设置的数据段,指示包含在报头中的序列号字段的初始值,用以开启三次握手。 序列号的初始值称为初始序列号 (ISN),由系统随机选取,并用于跟踪会话过程中从客户端到服务器的数据流。 在会话过程中,每从客户端向服务器发送一个字节的数据,数据段报头中包含的 ISN 值就要加 1。

步骤 2:

TCP 服务器必须确认从客户端处收到 SYN 数据段,从而建立从客户端到服务器的会话。 为了达到此目的,服务器应向客户端发送带确认 (ACK) 标志设置的数据段,表明确认号有效。 客户端将这种带确认标志设置的数据段理解为确认信息,即服务器已收到从 TCP 客户端发出的 SYN 信息。

确认号字段的值等于 ISN 加 1。 此时创建从客户端到服务器的会话。 ACK 标志在会话期间保持设置。 回想一下,客户端和服务器之间的会话实际上是由两个单向的会话组成的:一个是从客户端到服务器的会话,另一个则正好相反。 在三次握手过程的第二步中,服务器必须发起到客户端的响应。 为开启会话,服务器应采用与客户端同样的方法使用 SYN 标志。 该操作设置报头中的 SYN 控制标志,从而建立从服务器到客户端的会话。 SYN 标志表明序列号字段的初始值已包含在报头中, 且该值用于跟踪会话过程中从服务器返回客户端的数据流。

步骤 3:

最后,TCP 客户端发送包含 ACK 信息的数据段,以示对服务器发送的 TCP SYN 信息的响应。 在该数据段中,不包括用户数据。 确认号字段的值比从服务器接收的 ISN 值大 1。 一旦在客户端和服务器之间建立了双向会话,该通信过程中交换的所有数据段都将包含 ACK 标志设置。

image-20210809163150006

四次挥手过程

若要关闭连接,数据段报头必须设置完成 (FIN) 控制标志。 为终止每个单向 TCP 会话,需采用包含 FIN 数据段和 ACK 数据段的二次握手。 因此,若要终止 TCP 支持的整个会话过程,需要实施四次交换,以终止两个双向会话。

注意:在本部分中,为了更容易理解,采用了客户端和服务器这两个术语进行说明。实际上,终止的过程可以在任意两台具有开放会话的主机之间展开:

第 1 步:当客户端的数据流中没有其他数据要发送时,它将发送带 FIN 标志设置的数据段;

第 2 步:服务器发送 ACK 信息,确认收到从客户端发出的请求终止会话的 FIN 信息;

第 3 步:服务器向客户端发送 FIN 信息,终止从服务器到客户端的会话;

第 4 步:客户端发送 ACK 响应信息,确认收到从服务器发出的 FIN 信息。

当客户端没有其他要传输的数据时,它将在数据段报头中设置 FIN 标志。 然后,会话中的服务器端发送包含 ACK 标志设置的一般数据段信息,通过确认号确认已经收到所有数据。 当所有数据段得到确认后,会话关闭。

另一方向的会话采用相同的方式关闭。 接收方在数据段的报头中设置 FIN 标志,然后发送到发送方,表明没有其他需要发送的数据。 返回的确认信息确定已接收所有数据,随即该方向的会话关闭。

也可以通过三次握手方式关闭连接。 当客户端没有其他要传输的数据时,它将向服务器发送 FIN 信息。 如果服务器也没有其他要传输的数据,它将发送同时包含 FIN 和 ACK 标志设置的响应信息,将两步并作一步。 最后,客户端返回 ACK 信息。

image-20210809163301248

由于时间仓促,错误与疏忽之处在所难免,希望各位朋友们以邮件的形式反馈问题给我,再次表示感谢!