传输控制协议
传输控制协议 (TCP) 是 Internet 协议套件中最重要的协议之一。它是 Internet 等通信网络中数据传输最广泛的协议。
特点
TCP 是可靠的协议。也就是说,接收方始终向发送方发送有关数据包的肯定或否定确认,因此发送方始终清楚数据包是否到达目的地或是否需要重新发送。
TCP 确保数据按照发送的顺序到达预定目的地。
TCP 是面向连接的。 TCP 要求在发送实际数据之前建立两个远程点之间的连接。
TCP 提供错误检查和恢复机制。
TCP 提供端到端通信。
TCP 提供流量控制和服务质量。
TCP 以客户端/服务器点对点模式运行。
TCP 提供全双工服务器,即它可以同时充当接收方和发送方的角色。
标头
TCP 标头的长度最小为 20 字节,最大为 60 字节。
源端口(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 - 表示紧急指针字段有重要数据,需要处理。
ACK - 表示确认字段有重要数据。如果 ACK 被清除为 0,则表示数据包不包含任何确认。
PSH - 设置后,请求接收站将数据(一到达)推送到接收应用程序而不进行缓冲。
RST - 重置标志具有以下功能:
用于拒绝传入连接。
用于拒绝段。
用于重新启动连接。
SYN - 此标志用于在主机之间建立连接。
FIN - 此标志用于释放连接,此后不再交换任何数据。由于带有 SYN 和 FIN 标志的数据包具有序列号,因此它们会按正确的顺序进行处理。
Windows Size - 此字段用于两个站之间的流量控制,并指示接收器为某个段分配的缓冲区量(以字节为单位),即接收器期望接收多少数据。
校验和- 此字段包含报头、数据和伪报头的校验和。
紧急指针- 如果 URG 标志设置为 1,则指向紧急数据字节。
选项- 它有助于提供常规报头未涵盖的附加选项。选项字段始终以 32 位字描述。如果此字段包含的数据少于 32 位,则使用填充来覆盖剩余位以达到 32 位边界。
寻址
两个远程主机之间的 TCP 通信是通过端口号 (TSAP) 完成的。端口号范围为 0 – 65535,分为:
- 系统端口 (0 – 1023)
- 用户端口 ( 1024 – 49151)
- 私有/动态端口 (49152 – 65535)
连接管理
TCP 通信在服务器/客户端模型中工作。客户端发起连接,服务器接受或拒绝连接。三次握手用于连接管理。
建立
客户端发起连接并发送带有序列号的段。服务器用自己的序列号和客户端段的 ACK 进行确认,ACK 比客户端的序列号多一个。客户端在收到其段的 ACK 后,发送对服务器响应的确认。
释放
服务器和客户端都可以发送 FIN 标志设置为 1 的 TCP 段。当接收端通过确认 FIN 进行响应时,该方向的 TCP 通信将关闭并释放连接。
带宽管理
TCP 使用窗口大小的概念来满足带宽管理的需要。窗口大小告诉远程端的发送者,此端的接收者可以接收的数据字节段数。TCP 使用窗口大小 1 的慢启动阶段,并在每次成功通信后成倍增加窗口大小。
例如,客户端使用窗口大小 2 并发送 2 个字节的数据。当收到此段的确认时,窗口大小加倍为 4,并且下次发送的段将为 4 个数据字节长。当收到 4 字节数据段的确认时,客户端将窗口大小设置为 8,依此类推。
如果确认丢失,即数据在传输网络中丢失或收到 NACK,则窗口大小将减小一半,并重新开始慢启动阶段。
错误控制和流量控制
TCP 使用端口号来了解需要哪个应用程序进程来交接数据段。除此之外,它还使用序列号将自身与远程主机同步。所有数据段都使用序列号发送和接收。发送方在收到 ACK 时知道接收方收到了哪个最后一个数据段。接收方通过参考最近收到的数据包的序列号来了解发送方发送的最后一个段。
如果最近收到的段的序列号与接收方期望的序列号不匹配,则丢弃该段并返回 NACK。如果两个段具有相同的序列号,则比较 TCP 时间戳值以做出决定。
多路复用
在一个会话中组合两个或多个数据流的技术称为多路复用。当 TCP 客户端初始化与服务器的连接时,它总是引用一个明确定义的端口号,该端口号指示应用程序进程。客户端本身使用从私有端口号池中随机生成的端口号。
使用 TCP 多路复用,客户端可以在单个会话中与多个不同的应用程序进程进行通信。例如,客户端请求一个网页,而该网页又包含不同类型的数据(HTTP、SMTP、FTP 等),TCP 会话超时会增加,会话保持打开状态的时间会更长,从而可以避免三次握手开销。
这使客户端系统能够通过单个虚拟连接接收多个连接。如果超时时间太长,这些虚拟连接对服务器来说并不好。
拥塞控制
当大量数据被输入到无法处理的系统中时,就会发生拥塞。TCP 通过窗口机制控制拥塞。TCP 设置窗口大小,告诉另一端要发送多少数据段。TCP 可以使用三种算法进行拥塞控制:
加法增加,乘法减少
慢启动
超时反应
计时器管理
TCP 使用不同类型的计时器来控制和管理各种任务:
保持活动计时器:
此计时器用于检查连接的完整性和有效性。
当保持活动时间到期时,主机将发送探测以检查连接是否仍然存在。
重传计时器:
此计时器维护已发送数据的状态会话。
如果在重传时间内未收到已发送数据的确认,则发送数据段再次。
持久计时器:
任一主机都可以通过发送窗口大小 0 来暂停 TCP 会话。
要恢复会话,主机需要发送具有较大值的窗口大小。
如果此段从未到达另一端,则两端可能会无限期地等待对方。
当持久计时器到期时,主机会重新发送其窗口大小以告知另一端。
持久计时器有助于避免通信死锁。
定时等待:
释放连接后,任一主机都会等待定时等待时间来终止连接完全。
这是为了确保另一端已收到其连接终止请求的确认。
超时时间最长为 240 秒(4 分钟)。
崩溃恢复
TCP 是非常可靠的协议。它为分段中发送的每个字节提供序列号。它提供反馈机制,即当主机收到数据包时,它必然会确认具有下一个预期序列号的数据包(如果它不是最后一个分段)。
当 TCP 服务器在通信中途崩溃并重新启动其进程时,它会向其所有主机发送 TPDU 广播。然后,主机可以发送从未被取消确认的最后一个数据段并继续前进。