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