📜  TCP 中的服务和段结构

📅  最后修改于: 2021-09-27 15:07:03             🧑  作者: Mango

传输控制协议是最常见的传输层协议。它与 IP 一起工作,并使用 IP 协议提供的网络层服务在进程之间提供可靠的传输服务。
TCP向应用层提供的各种服务如下:

  1. 进程间通信——
    TCP 提供进程间通信,即数据传输发生在终端系统上执行的各个进程之间。这是使用端口号或端口地址完成的。端口号为 16 位长,有助于识别主机上哪个进程正在发送或接收数据。
  2. 面向流——
    这意味着数据以字节流的形式发送和接收(不像 UDP 或 IP 将位分成数据报或数据包)。然而,为 TCP 提供服务的网络层发送的是信息包而不是字节流。因此,TCP 将许多字节组合成一个段,并为每个添加一个标头,然后将这些段传送到网络层。在网络层,这些段中的每一个都封装在一个 IP 数据包中进行传输。 TCP 标头具有控制目的所需的信息,这些信息将与段结构一起讨论。
  3. 全双工服务 –
    这意味着可以同时在两个方向上进行通信。
  4. 面向连接的服务——
    与 UDP 不同,TCP 提供面向连接的服务。它定义了 3 个不同的阶段:
    • 连接建立
    • 数据传输
    • 连接终止
  5. 可靠性——
    TCP 是可靠的,因为它使用校验和进行错误检测,尝试通过重传、确认策略和计时器来恢复丢失或损坏的数据包。它利用字节数、序列号和确认号等特征来保证可靠性。此外,它使用拥塞控制机制。
  6. 多路复用——
    TCP 在发送端和接收端分别进行复用和解复用,因为可以通过物理连接在端口号之间建立许多逻辑连接。

字节号、序列号和确认号:
所有要传输的数据字节都有编号,编号的开头是任意的。序列号被赋予这些段,以便在接收端重新组合字节,即使它们以不同的顺序到达。段的序列号是正在发送的第一个字节的字节号。由于 TCP 提供全双工服务,因此需要确认号。确认编号是接收器期望接收的下一个字节编号,它也为接收前一个字节提供确认。
例子:

在这个例子中我们看到,A 发送确认号 1001,这意味着它已经收到数据字节直到字节号 1000 并期望接下来接收 1001,因此 B 下一次发送从 1001 开始的数据字节。类似地,由于 B 已经收到数据字节,直到在从 A 到 B 的第一次数据传输之后,字节编号为 13001,因此 B 发送确认编号 13002,即它希望接下来从 A 接收的字节编号。

TCP 段结构 –
TCP 段由要发送的数据字节和 TCP 添加到数据中的标头组成,如下所示:

TCP 段的标头的范围可以是 20-60 个字节。 40 个字节用于选项。如果没有选项,则标头为 20 字节,否则最多为 60 字节。
标题字段:

  • 源端口地址 –
    16 位字段,保存正在发送数据段的应用程序的端口地址。
  • 目的端口地址 –
    16 位字段,用于保存正在接收数据段的主机中应用程序的端口地址。
  • 序列号 –
    保存序列号的 32 位字段,即在该特定段中发送的第一个字节的字节号。如果收到的段乱序,它用于在接收端重新组装消息。
  • 确认编号 –
    32 位字段,保存确认号,即接收方接下来希望接收的字节数。它是对先前字节成功接收的确认。
  • 标题长度 (HLEN) –
    这是一个 4 位字段,通过报头中 4 字节字的数量指示 TCP 报头的长度,即,如果报头为 20 字节(TCP 报头的最小长度),则该字段将容纳 5(因为5 x 4 = 20) 和最大长度:60 字节,那么它将保存值 15(因为 15 x 4 = 60)。因此,该字段的值始终介于 5 和 15 之间。
  • 控制标志 –
    这些是 6 个 1 位控制位,用于控制连接建立、连接终止、连接中止、流量控制、传输模式等。它们的函数是:
    • URG:紧急指针有效
    • ACK:确认号有效(用于累计确认)
    • PSH:请求推送
    • RST:重置连接
    • SYN:同步序列号
    • FIN:终止连接
  • 窗口大小 –
    该字段以字节为单位告诉发送 TCP 的窗口大小。
  • 校验和 –
    该字段保存错误控制的校验和。与 UDP 不同,它在 TCP 中是强制性的。
  • 紧急指针——
    该字段(仅在设置了URG控制标志时才有效)用于指向需要最早到达接收进程的急需数据。将该字段的值与序列号相加得到最后一个紧急字节的字节数。

TCP 连接 –
TCP 是面向连接的。 TCP 连接是通过 3 次握手建立的。