2. 设计哲学 (Philosophy)
本章总结了 TCP 设计的哲学基础, 阐述了 TCP 在互联网环境中的定位、设计原则和核心概念.
2.1. 互联网系统的要素 (Elements of the Internetwork System)
互联网环境由连接到网络的主机组成, 这些网络又通过网关 (gateway) 互联. 这里假设网络可以是局域网 (例如 ETHERNET) 或大型网络 (例如 ARPANET), 但无论如何都基于分组交换技术. 产生和消费消息的活跃代理是进程 (process). 网络、网关和主机中各级协议支持一个进程间通信系统, 该系统在进程端口之间的逻辑连接上提供双向数据流.
核心概念 (Core Concepts)
- 进程 (Processes): 产生和消费消息的活跃代理
- 进程间通信系统 (Interprocess Communication System): 网络、网关和主机中各级协议支持进程端口之间逻辑连接上的双向数据流
术语数据包 (packet) 在此泛指主机与其网络之间一次事务的数据. 网络内交换的数据块格式通常不在我们的关注范围之内.
术语定义 (Terminology Definitions)
| 术语 | 定义 |
|---|---|
| 主机 (Host) | 连接到网络的计算机, 从通信网络的角度来看, 是数据包的源和目的地 |
| 进程 (Process) | 主机计算机中的活跃元素 (按照进程作为正在执行的程序的相当普遍的定义) |
| 端口 (Port) | 进程通信的逻辑端点; 一个进程可以有多个端口 |
重要说明: 所有通信都被视为进程间通信. 即使是终端和文件或其他 I/O 设备, 也被视为通过使用进程相互通信.
由于一个进程可能需要区分它与另一个进程 (或多个进程) 之间的多个通信流, 我们设想每个进程可以有多个端口, 通过这些端口与其他进程的端口通信.
2.2. 操作模型 (Model of Operation)
数据传输流程 (Data Transmission Flow)
发送进程 (Sending Process)
↓ [调用 TCP, 传递数据缓冲区]
发送 TCP (Sending TCP)
↓ [将数据打包成段]
互联网模块 (Internet Module)
↓ [封装成互联网数据报]
本地网络 (Local Network)
↓ [嵌入本地网络数据包]
... (经过分组交换机、网关) ...
↓
目标本地网络 (Destination Local Network)
↓ [解包]
目标互联网模块 (Destination Internet Module)
↓ [提取 TCP 段]
接收 TCP (Receiving TCP)
↓ [将数据放入用户缓冲区]
接收进程 (Receiving Process)
详细描述 (Detailed Description)
发送方 (Sending Side):
- 进程通过调用 TCP 并将数据缓冲区作为参数传递来传输数据
- TCP 将这些缓冲区中的数据打包成段
- TCP 调用互联网模块将每个段传输到目标 TCP
接收方 (Receiving Side):
- 接收 TCP 将段中的数据放入接收用户的缓冲区
- 接收 TCP 通知接收用户
控制信息 (Control Information):
- TCP 在段中包含控制信息, 用于确保可靠的有序数据传输
互联网通信模型 (Internet Communication Model)
[TCP 段] → [互联网数据报] → [本地网络数据包] → ...网关转发... → [目标]
互联网模块 (Internet Module):
- 与每个 TCP 关联
- 提供到本地网络的接口
- 将 TCP 段封装在互联网数据报中
- 将这些数据报路由到目标互联网模块或中间网关
本地网络传输 (Local Network Transmission):
- 为了通过本地网络传输数据报, 将其嵌入本地网络数据包中
- 分组交换机可能执行进一步的打包、分片或其他操作, 以将本地数据包交付到目标互联网模块
网关操作 (Gateway Operation)
在网络之间的网关处:
- 解包 (Unwrapping): 互联网数据报从其本地数据包中"解包"
- 检查 (Examination): 确定互联网数据报下一步应通过哪个网络传输
- 重新封装 (Rewrapping): 互联网数据报被"封装"在适合下一个网络的本地数据包中
- 路由 (Routing): 路由到下一个网关或最终目标
分片机制 (Fragmentation Mechanism):
- 如果通过下一个网络传输需要, 网关可以将互联网数据报分解为更小的互联网数据报片段
- 为此, 网关生成一组互联网数据报, 每个携带一个片段
- 片段可能在后续网关处进一步分解为更小的片段
- 互联网数据报片段格式设计为使目标互联网模块可以将片段重组为互联网数据报
最终目标 (Final Destination):
- 目标互联网模块从数据报中解包段 (必要时在重组数据报之后)
- 将其传递给目标 TCP
服务类型 (Type of Service)
这个简单的操作模型忽略了许多细节. 一个重要特性是服务类型 (type of service). 它向网关 (或互联网模块) 提供信息, 指导其选择在下一个网络中使用的服务参数.
服务类型信息包括 (Included in type of service information):
- 数据报的优先级 (Precedence of the datagram): 处理的优先级
- 安全信息 (Security information): 允许在多级安全环境中运行的主机和网关为安全考虑正确隔离数据报
2.3. 主机环境 (The Host Environment)
TCP 被假定为操作系统中的一个模块. 用户访问 TCP 的方式与访问文件系统的方式类似. TCP 可以调用其他操作系统功能, 例如管理数据结构.
网络接口 (Network Interface):
- 到网络的实际接口假定由设备驱动程序模块控制
- TCP 不直接调用网络设备驱动程序
- 而是调用互联网数据报协议模块, 后者可能反过来调用设备驱动程序
前端实现 (Front-End Implementation):
- TCP 的机制不排除在前端处理器中实现 TCP
- 但是, 在这种实现中, 主机到前端协议必须提供功能以支持本文档中描述的 TCP 用户接口类型
2.4. 接口 (Interfaces)
TCP/用户接口 (TCP/User Interface)
TCP/用户接口提供用户在 TCP 上进行的调用:
- OPEN 或 CLOSE 连接
- SEND 或 RECEIVE 数据
- 获取连接的状态 (STATUS)
这些调用类似于用户程序在操作系统上的其他调用, 例如打开、读取和关闭文件的调用.
TCP/互联网接口 (TCP/Internet Interface)
TCP/互联网接口提供调用以发送和接收寻址到互联网系统中任何地方主机上 TCP 模块的数据报. 这些调用具有传递以下内容的参数:
- 地址 (Address)
- 服务类型 (Type of service)
- 优先级 (Precedence)
- 安全性 (Security)
- 其他控制信息
2.5. 与其他协议的关系 (Relation to Other Protocols)
下图说明了 TCP 在协议层次结构中的位置:
+------+ +-----+ +-----+ +-----+
|Telnet| | FTP | |Voice| ... | | 应用层 (Application Level)
+------+ +-----+ +-----+ +-----+
| | | |
+-----+ +-----+ +-----+
| TCP | | RTP | ... | | 主机层 (Host Level)
+-----+ +-----+ +-----+
| | |
+-------------------------------+
| Internet Protocol & ICMP | 网关层 (Gateway Level)
+-------------------------------+
|
+---------------------------+
| Local Network Protocol | 网络层 (Network Level)
+---------------------------+
协议关系图 (Protocol Relationships)
关键点 (Key Points):
- 预期 TCP 能够高效支持高层协议
- 应该很容易将 ARPANET Telnet 或 AUTODIN II THP 等高层协议与 TCP 接口
2.6. 可靠通信 (Reliable Communication)
在 TCP 连接上发送的数据流在目标处可靠且有序地交付.
可靠性机制 (Reliability Mechanisms)
序列号与确认 (Sequence Numbers and Acknowledgments):
- 通过使用序列号和确认来实现可靠传输
- 从概念上讲, 每个数据字节都被分配一个序列号
- 段中第一个数据字节的序列号随该段一起传输, 称为段序列号 (segment sequence number)
- 段还携带确认号 (acknowledgment number), 即反向传输中下一个预期数据字节的序列号
重传 (Retransmission):
- 当 TCP 传输包含数据的段时, 它将副本放入重传队列并启动计时器
- 当收到该数据的确认时, 从队列中删除该段
- 如果在计时器超时之前未收到确认, 则重新传输该段
重要说明 (Important Note):
- TCP 的确认并不保证数据已交付给最终用户
- 它只意味着接收 TCP 已承担这样做的责任
流量控制 (Flow Control)
为了控制 TCP 之间的数据流, 采用了流量控制机制:
- 接收 TCP 向发送 TCP 报告一个"窗口"
- 该窗口指定从确认号开始, 接收 TCP 当前准备接收的字节数
2.7. 连接的建立与清除 (Connection Establishment and Clearing)
套接字寻址 (Socket Addressing)
端口标识符 (Port Identifier):
- 为了标识 TCP 可能处理的独立数据流, TCP 提供了端口标识符
- 由于端口标识符由每个 TCP 独立选择, 它们可能不是唯一的
套接字创建 (Socket Creation):
- 为了在每个 TCP 内提供唯一地址, 我们将标识 TCP 的互联网地址与端口标识符连接起来创建一个套接字 (socket)
- 套接字在所有互联网络中将是唯一的
连接规范 (Connection Specification):
- 连接由两端的套接字对完全指定
- 本地套接字可以参与到不同外部套接字的多个连接
- 连接可以用于双向传输数据, 即它是"全双工 (full duplex)"的
端口与进程关联 (Port and Process Association)
端口所有权 (Port Ownership):
- TCP 可以自由地以任何方式将端口与进程关联
- 但是, 任何实现中都需要几个基本概念:
- 必须有知名套接字 (well-known sockets), TCP 通过某种方式仅将其与"适当"的进程关联
- 我们设想进程可以"拥有"端口
- 进程只能在其拥有的端口上发起连接
OPEN 调用中的连接规范 (Connection Specification in OPEN Call):
- 连接在 OPEN 调用中由本地端口和外部套接字参数指定
- 作为回报, TCP 提供一个 (简短的) 本地连接名称, 用户在后续调用中通过该名称引用连接
传输控制块 (Transmission Control Block, TCB)
为了存储连接信息, 我们设想有一个称为传输控制块 (Transmission Control Block, TCB) 的数据结构:
- 一种实现策略是将本地连接名称作为指向此连接 TCB 的指针
- OPEN 调用还指定是主动追求连接建立, 还是被动等待
被动 OPEN (Passive OPEN):
- 被动 OPEN 请求意味着进程希望接受传入的连接请求, 而不是尝试发起连接
- 通常, 请求被动 OPEN 的进程将接受来自任何调用者的连接请求
- 在这种情况下, 使用全零的外部套接字表示未指定的套接字
- 未指定的外部套接字仅允许在被动 OPEN 上使用
2.8. 数据通信 (Data Communication)
一旦建立连接, 数据就可以在进程之间双向流动. TCP 确保此数据流:
- 可靠 (Reliable): 数据正确到达
- 有序 (Ordered): 数据以正确的顺序到达
- 流量受控 (Flow controlled): 接收端不会被压垮
2.9. 优先级与安全 (Precedence and Security)
TCP 提供处理以下内容的机制:
- 优先级 (Precedence): 流量的优先级
- 安全分类 (Security classifications): 在多级安全环境中运行
- 分区 (Compartmentation): 不同安全域的隔离
这些特性从互联网协议层继承, 并通过 TCP 连接端到端维护.
2.10. 健壮性原则 (Robustness Principle)
TCP 实现的指导原则是健壮性原则 (Robustness Principle), 通常表述为:
"发送时保守, 接收时宽容" (Be conservative in what you send, be liberal in what you accept)
这意味着:
- TCP 实现在发送数据时应严格遵守规范
- 但在接收数据时应宽容灵活, 尽可能尝试解释即使略有格式错误的输入
这一原则有助于确保不同实现之间的互操作性, 并促进互联网的整体稳定性.
下一节: 3. 功能规范 - TCP 操作和段格式的详细规范