1. Introduction (简介)
传输控制协议 (Transmission Control Protocol, TCP) 旨在作为高度可靠的主机到主机协议 (host-to-host protocol),用于分组交换计算机通信网络以及互连的此类网络系统。
本文档描述了传输控制协议需要执行的功能、实现它的程序以及它与需要其服务的程序或用户的接口。
1.1. Motivation (动机)
计算机通信系统在军事、政府和民用环境中正发挥着越来越重要的作用。本文档主要关注军事计算机通信需求,特别是在通信不可靠情况下的健壮性 (robustness) 以及在拥塞情况下的可用性 (availability),但这些问题在民用和政府部门中也很常见。
随着战略和战术计算机通信网络的开发和部署,必须提供互连这些网络的方法,并提供能支持广泛应用的标准进程间通信协议 (interprocess communication protocols)。为了满足对此类标准的需求,美国国防部研究与工程副部长已宣布本文所述的传输控制协议 (TCP) 将成为国防部范围内进程间通信协议标准化的基础。
TCP的核心特点
TCP是一种面向连接的、端到端可靠的协议 (connection-oriented, end-to-end reliable protocol),设计用于适配支持多网络应用的分层协议层次结构 (layered hierarchy of protocols)。TCP在连接到不同但互连的计算机通信网络的主机计算机中的进程对之间提供可靠的进程间通信。
TCP对低层通信协议的可靠性做了非常少的假设。TCP假设它可以从低层协议获得简单的、可能不可靠的数据报服务 (datagram service)。原则上,TCP应该能够在从硬连线连接到分组交换或电路交换网络的广泛通信系统之上运行。
理论基础
TCP基于Cerf和Kahn在[1]中首次描述的概念。TCP适配在基本互联网协议 (Internet Protocol, [2]) 之上的分层协议架构,互联网协议为TCP提供了发送和接收封装在互联网数据报 (internet datagram) "信封"中的可变长度信息段 (segments) 的方法。
互联网数据报提供了一种在不同网络中寻址源和目标TCP的方法。互联网协议还处理TCP段的任何分片 (fragmentation) 或重组 (reassembly),以实现通过多个网络和互连网关的传输和交付。互联网协议还携带有关TCP段的优先级 (precedence)、安全分类 (security classification) 和隔离 (compartmentation) 的信息,以便此信息可以跨多个网络端到端地传递。
协议分层 (Protocol Layering)
+---------------------+
| higher-level | ← 应用层协议 (HTTP, FTP, SMTP等)
+---------------------+
| TCP | ← 传输层 (本协议)
+---------------------+
| Internet Protocol | ← 网络层 (RFC 791)
+---------------------+
|communication network| ← 链路层/物理层
+---------------------+
本文档大部分内容是在TCP实现与主机计算机中的高层协议共存的环境下编写的。一些计算机系统将通过前端计算机 (front-end computers) 连接到网络,前端计算机容纳TCP和互联网协议层以及网络特定软件。TCP规范描述了一个与高层协议的接口,只要实现了合适的主机到前端协议,这个接口即使对于前端情况也是可实现的。
1.2. Scope (范围)
TCP旨在在多网络环境 (multinetwork environment) 中提供可靠的进程到进程通信服务 (reliable process-to-process communication service)。TCP旨在作为在多个网络中常用的主机到主机协议。
设计目标:
- 支持多种网络拓扑
- 适应不同的网络特性
- 提供统一的传输层接口
- 实现端到端的可靠性保证
1.3. About This Document (关于本文档)
本文档代表了任何TCP实现所需行为的规范,包括其与高层协议的交互以及与其他TCP的交互。本节的其余部分提供了协议接口和操作的非常简要的概述。
文档结构
- 第2节: 总结了TCP设计的哲学基础 (philosophical basis)
- 第3节: 提供了以下详细描述:
- TCP在各种事件 (新段到达、用户调用、错误等) 发生时需要采取的行动
- TCP段格式的详细信息
1.4. Interfaces (接口)
TCP在一侧与用户或应用程序进程 (application processes) 交互,在另一侧与低层协议 (如互联网协议) 交互。
TCP/用户接口 (TCP/User Interface)
应用程序进程与TCP之间的接口以合理的细节进行了说明。此接口由一组调用组成,非常类似于操作系统为应用程序进程提供的用于操作文件的调用。
主要接口调用:
- OPEN: 打开连接
- CLOSE: 关闭连接
- SEND: 在已建立的连接上发送数据
- RECEIVE: 在已建立的连接上接收数据
TCP还可以与应用程序异步通信 (asynchronously communicate)。虽然TCP实现者有相当大的自由来设计适合特定操作系统环境的接口,但任何有效实现都需要在TCP/用户接口上提供最小功能 (minimum functionality)。
TCP/低层协议接口 (TCP/Lower Level Protocol Interface)
TCP与低层协议之间的接口基本上是未指定的 (essentially unspecified),除了假设存在一种机制,使两个级别可以异步地相互传递信息。通常,人们期望低层协议指定此接口。
TCP设计用于在非常通用的互连网络环境中工作。本文档中假设的低层协议是互联网协议 (Internet Protocol, [2])。
1.5. Operation (操作)
如上所述,TCP的主要目的是在进程对之间提供可靠的、安全的逻辑电路或连接服务 (reliable, securable logical circuit or connection service)。要在不太可靠的互联网通信系统之上提供此服务,需要在以下领域提供设施:
核心功能概述
1. Basic Data Transfer (基本数据传输)
TCP能够通过将一定数量的八位字节 (octets) 打包到段 (segments) 中以便通过互联网系统传输,从而在每个方向上在用户之间传输连续的八位字节流。通常,TCP决定何时阻塞和转发数据由它们自己决定。
PUSH功能 (Push Function): 有时用户需要确保他们提交给TCP的所有数据都已被传输。为此,定义了一个push功能。为了确保提交给TCP的数据实际被传输,发送用户指示它应该被推送 (pushed) 到接收用户。push会导致TCP立即将数据转发并交付给接收方。确切的push点可能对接收用户不可见,push功能不提供记录边界标记 (record boundary marker)。
2. Reliability (可靠性)
TCP必须从互联网通信系统损坏、丢失、重复或乱序交付的数据中恢复。这是通过为每个传输的八位字节分配一个序列号 (sequence number),并要求接收TCP提供肯定确认 (positive acknowledgment, ACK) 来实现的。
可靠性机制:
- 超时重传: 如果在超时间隔内未收到ACK,则重新传输数据
- 排序: 在接收方,使用序列号正确排序可能乱序接收的段
- 去重: 消除重复的段
- 校验和: 通过向每个传输的段添加校验和 (checksum) 来处理损坏,在接收方检查它,并丢弃损坏的段
只要TCP继续正常运行,并且互联网系统不会完全分割 (completely partitioned),任何传输错误都不会影响数据的正确传递。TCP从互联网通信系统错误中恢复。
3. Flow Control (流量控制)
TCP为接收方提供了一种控制发送方发送的数据量的方法。这是通过在每个ACK中返回一个"窗口" (window) 来实现的,该窗口指示超出最后成功接收的段的可接受序列号范围。
滑动窗口 (Sliding Window): 窗口指示发送方在接收进一步许可之前可以传输的允许八位字节数。
4. Multiplexing (多路复用)
为了允许单个主机内的许多进程同时使用TCP通信设施,TCP在每个主机内提供了一组地址或端口 (ports)。与来自互联网通信层的网络和主机地址连接,这形成了一个套接字 (socket)。一对套接字唯一标识每个连接。也就是说,一个套接字可以同时在多个连接中使用。
端口绑定 (Port Binding):
- 端口到进程的绑定由每个主机独立处理
- 频繁使用的进程 (例如"logger"或分时服务) 附加到固定套接字,这些套接字对公众公开
- 可以通过已知地址访问这些服务
- 建立和学习其他进程的端口地址可能涉及更动态的机制
5. Connections (连接)
上述可靠性和流量控制机制要求TCP为每个数据流初始化和维护某些状态信息 (status information)。这些信息的组合,包括套接字 (sockets)、序列号 (sequence numbers) 和窗口大小 (window sizes),称为连接 (connection)。每个连接由标识其两侧的一对套接字唯一指定。
连接生命周期:
- 建立: 当两个进程希望通信时,它们的TCP必须首先建立连接 (初始化每一侧的状态信息)
- 使用: 数据传输阶段
- 终止: 当通信完成时,连接被终止 (terminated) 或关闭 (closed) 以释放资源供其他使用
三次握手 (Three-Way Handshake): 由于必须在不可靠的主机之间以及通过不可靠的互联网通信系统建立连接,因此使用基于时钟的序列号的握手机制 (handshake mechanism with clock-based sequence numbers) 来避免连接的错误初始化。
6. Precedence and Security (优先级和安全)
TCP的用户可以指示其通信的安全性和优先级。当不需要这些功能时,提供了默认值。
实现考虑 (Implementation Considerations)
最小功能要求
任何有效的TCP实现必须提供:
- 连接管理 (建立、维护、终止)
- 可靠数据传输 (确认、重传、排序)
- 流量控制 (滑动窗口)
- 多路复用 (端口管理)
- 错误检测 (校验和)
灵活性
虽然本规范定义了TCP的行为,但实现者在以下方面有相当大的自由:
- 内部数据结构设计
- 与操作系统的集成方式
- 性能优化策略
- 用户接口的具体形式
与其他协议的关系 (Relation to Other Protocols)
应用层: HTTP, FTP, SMTP, Telnet, etc.
↓
传输层: TCP (本协议) | UDP (RFC 768)
↓
网络层: IP (RFC 791)
↓
链路层: Ethernet, Wi-Fi, etc.
TCP位于协议栈的传输层,为应用层提供可靠的端到端通信服务,依赖网络层的IP协议进行路由和寻址。
下一章: 2. Philosophy (哲学) - 深入探讨TCP的设计哲学和理论基础