2. 主机-主机过程
2.1 概述
基本思想是,某一主机 (HOST) 上的若干用户可以同时通过分时使用网络的物理设施来利用网络。
这意味着在每个主机操作系统中都必须有一个特殊程序,它把来自用户的出站报文复用送入网络,并把入站报文分发给相应的用户。我们把这一特殊程序称为网络程序 (Network program)。
2.2 链路与连接(见图 1)
2.2.1 定义
为方便起见,可以把网络看作一个黑箱——一个行为已知但机制未知的系统——用于在远程用户之间而不是在成对的主机计算机之间传递报文。
(a) 逻辑连接
我们把逻辑连接定义为连接远程主机上两个用户的通信路径。
有了这一概念,主机计算机中的用户(用户程序)可以 (1) 与任意远程主机用户建立若干条逻辑连接,并 (2) 通过这些连接发送或接收报文。
连接对用户呈现为全双工。
网络程序的目的之一就是为用户服务,帮助他们建立、标识和维护这些连接。
(b) 逻辑链路
每条逻辑连接由一对有向链路构成:一条用于发送,另一条用于接收。
这些链路称为逻辑链路,由网络程序建立并使用。
这里请注意,用户只关心连接,对链路完全无感知。链路与连接之间的关系由网络程序处理。
把连接定义为一对有向链路的优点之一是,主机能够通过其 IMP 环回到自身(即向自身打开一条连接)。这一特性对调试很有用。
在本文后续部分,当提到链路或连接时,我们将不再使用「逻辑」这一限定词。
2.2.2 连接类型
为了在使用网络时获得高度灵活性,对连接进行分类是有益的。
区分三种连接类型:(a) 控制连接,(b) 主连接,以及 (c) 辅助连接。
(a) 控制连接
这种连接具有特殊地位,在一对主机之间是唯一的,例如,若网络包含 x 台主机,则从一台主机发出的控制连接至多有 x 条。
这种连接供远程网络程序来回传递控制报文。控制报文是建立/删除标准连接的基础。(见 2.4.2)
这里请注意,这条控制连接是唯一不被主机用户使用的连接。
现在我们来描述标准连接。
(b) 主连接
这些连接连接远程用户。
一条主连接:
- 在一对用户之间是唯一的,并且是最先建立的。
- 是「类电传打字机」的,即:
- 传输的是 ASCII 字符;
- 回显由远程主机产生;
- 接收方主机会扫描中断字符;
- 传输速率较慢(低于每秒 20 个字符)。
- 主要用于传输控制命令,例如用于登录远程主机操作系统。
(c) 辅助连接
这些连接同样连接远程用户:
一条辅助连接:
- 与主连接并行打开,且不是唯一的,即用户之间可以建立若干条辅助连接。
- 用于传输大量数据(面向文件)。
- 既可用于二进制传输,也可用于字符传输。
[图 1 - 链路与连接 - 见 PDF 文件]
2.3 报文结构
各主机之间通过报文相互通信。一条报文的长度最多可达 8095 位(结构见下文)。因此,更大的传输必须由主机用户拆分为这样一串报文。
报文结构如图 2 所示。
它包括以下部分:
(1) 一个首部(32 位):报文类型、源/目的主机、链路号。(见 BBN 第 1822 号报告,第 13、17 页)
(2) 一个标记(由 Sigma 7 发送时为 32 位),用于使报文正文从字边界开始。(见 BBN 第 1822 号报告,第 17、19 页)
(3) 报文正文(对 Sigma 7 而言最大为 8015 位)。它主要由用户正文构成。不过,它也可能表示供网络程序使用的信息。(控制报文,见 2.4.2)
(4) 一个校验和(16 位)。其目的是在主机一级检查报文是否正确传输。(用于检测位模式变化或分组换位;分组定义见 BBN 第 1763 号报告第 13 页)校验和的计算见下文。
(5) 一段填充,用于解决字长不匹配问题。(见 BBN 第 1822 号报告,第 17、19 页。)就软件而言,填充只在接收报文时用于划定报文的结束。(在发送时,填充由硬件处理。)
备注:
校验和的计算:
主机发送的每条报文的最后 16 位是校验和。该校验和基于整条报文计算,包括其中的标记,但不包括 32 位的首部和任何填充。校验和的计算方法如下:
- 把报文视为已用零填充至 8640 位长度。
- 把这 8640 位划分为六个 1440 位的段,S0、S1……S5。
- 把每个 1440 位的段 S 划分为 90 个 16 位元素,T0、T1……T89。
- 定义一个函数 [(+)],它以两个 16 位元素为输入,输出一个 16 位元素。该函数定义如下
Tm [(+)] Tn = Tm [(+)] Tn,若 Tm + Tn < 2[exp 16]
Tm [(+)] Tn = Tm [(+)] Tn - 2[exp 16] + 1,若 Tm + Tn >= 2[exp 16]
- 对每个 1440 位的段 Si 计算 Ci = K(Si),其中
K(S) = T0 [(+)] T1 + ..... T89
- 计算 C = C0[(+)]C1[(+)]C1[(+)]C2[(+)]C2[(+)]C2[(+)]C2....[(+)]C5
(注意,C1[(+)]C1 就是把 C1 循环左移一位)
数 C 即为校验和。对 Ci 循环移位 i 位,是为了检测分组换位。
[图 2 - 由 Sigma 7 发送的报文格式 - 见 PDF 文件]
2.4 用户事务
根据以上讨论,网络在用户看来就是一组连接。下面我们说明如何使用这些连接。
首先,我们将描述用户为了使用连接设施而应当能够访问的一组事务。
然后,我们将说明网络程序在执行这些事务中所起的作用。这将涉及一个主机-主机协议,其中控制报文在网络程序之间交换。
为便于说明,这些事务在用户一级以子程序调用和参数的形式表示。然而,这绝不意味着实现会严格遵循这一模式。(这里我们更侧重于描述而非实现方面,见第 3 章。)
2.4.1 事务列表
下面列出的是可供用户使用的子程序说明,用于创建/断开连接以及通过连接发送/接收数据。这组子程序可以看作用户级与网络程序级之间的一种接口。
(a) 打开主连接:
OPENPRIM (CONNECTID, HOSTID, BUFFADDR, [OPT]) CONNECTID:连接标识号 HOSTID:远程主机标识号 BUFFADDR:用于接收入站报文的缓冲区地址。OPT:选项,例如连接成功建立后需要发送报文、「全回显」(每条报文都由远程主机发回以进行检查)等。
备注:[ ] 表示可选
(b) 打开辅助连接
OPENAUX (CONNECTID, BUFFADDR, N, [OPT]) CONNECTID:连接标识号,即相应主连接的标识(用户必须先打开一条主连接)。BUFFADDR:含义同上。N:应当打开的辅助连接数目。OPT:含义同上。
(c) 通过连接发送
TRANSM (CONNECTID, NO, BUFFADDR, N, [OPT]) CONNECTID:连接标识号 NO:连接号。主连接始终称为 NO=0。辅助连接号对应于其建立的次序。(打开的第一条辅助连接称为 NO=1,第二条称为 NO=2,依此类推。)BUFFADDR:待发送报文的缓冲区地址。N:报文大小(字节数)OPT:选项,例如数据类型(字符还是二进制)、跟踪位等。
(d) 关闭连接
CLOSE (CONNECTID, [N], [NO]) CONNECTID:连接标识号。N:要关闭的连接数目。若省略,则关闭该用户使用的所有连接,包括主链路。NO:当 N 不为零时,该数字指出要关闭的辅助连接号。
2.4.2 主机-主机协议与控制报文
主机-主机协议由网络程序执行。它主要涉及上述事务(由用户发起)的执行,并涵盖一段主机-主机对话。
这段对话完成打开或断开连接的控制过程,其方式是经控制链路交换控制报文。控制报文的结构与普通报文相同;它与之唯一的区别在于正文,正文是供网络程序而非用户使用的。
我们要强调,这一控制过程与 IMP 计算机中实现的传输控制过程完全无关。我们这里处于主机一级(网络程序),因此下面将要描述的控制报文像普通报文一样经由 IMP 传输。
现在考察前面的事务,并针对每一项说明在哪些链路上交换哪些报文。每种情形都将用简单的例子加以解释。
我们假设 HOST(x) 的一个用户想要连接远程 HOST(y) 上一个名为 URSA 的程序。
(a) 打开主连接:(OPENPRIM)
HOST (x) 的网络程序被用户唤醒(见 3.3)以打开主连接,随后与 HOST (y) 的网络程序开始一段对话。
(i) HOST(x) 发送以下控制报文:
HOST(x) Control link HOST(y)
-------------------->
ENQ PRIM 0 1 2
ENQ:用于建立连接的询问(一个 ASCII 字符)PRIM:连接类型:主连接(一个特殊字符)0 1 2:出站链路号。它是一个十进制数(3 个 ASCII 字符),例如链路 #12。
该链路号由 HOST(x) 的网络程序确定(见实现部分:3.3)
(ii) HOST(y) 通过发回以下控制报文来确认:
HOST(x) Control link HOST(y)
<------------------------
ACK ENQ PRIM 0 1 2 0 1 5
ACK:肯定确认(一个 ASCII 字符)ENQ PRIM 0 1 2:含义同上。报文的这一部分被发回以进行检查。0 1 5:入站链路号。它遵循与出站链路号相同的格式。该链路号由 HOST(y) 的网络程序确定。
现在连接已经建立;它将使用链路 #12 和 15 交换用户报文。该连接被称为处于登录前状态,即远程 HOST(y) 期待其标准登录过程。
(b) 通过主连接发送:(TRANSM)
借助引用主连接的 TRANSM 子程序,HOST(x) 的用户能够登录 HOST(y) 的操作系统,然后调用 URSA 程序(HOST(y) 的用户程序)。
两端的网络程序将使用链路 #12 和 #15 传递报文。这些报文是标准报文,其内容用于登录序列。
一个简单的例子可以是:
HOST(x) Prim. Link #12 HOST(y)
---------------------------->
! S I G N - I N : X X
HOST(x) Prim. Link #15 HOST(y)
<--------------------------
! ! R E A D Y
HOST(x) Prim. Link #12 HOST(y)
---------------------------->
! U R S A
(c) 打开辅助连接:(OPENAUXI)
以与 (a) 非常相似的方式,在 HOST(x) 与 HOST(y) 之间建立一条辅助连接。为此,控制报文经控制链路交换。
HOST(x) Control link HOST(y)
------------------------------>
ENQ AUX 0 2 5
HOST(x) Control link HOST(y)
<--------------------------------
ACK ENQ AUX 0 2 5 0 2 1
现在辅助连接已经建立,它将使用链路 #25 和 21 交换标准报文。
(d) 通过辅助连接发送:(TRANSM)
借助引用辅助连接的 TRANSM 子程序,两端的用户可以交换数据:
HOST(x) Aux. Link #25 HOST(y)
-------------------------------->
X X ..... X X
HOST(x) Aux. Link #21 HOST(y)
<--------------------------------
X ......... X
等等……
(e) 关闭连接:(CLOSE)
这以与 (a) 相似的方式完成。用户调用 CLOSE 子程序,随后两端的网络程序交换控制报文。
HOST(x) Control Link HOST(y)
----------------------------->
EOT 0 0 1 0 1 2
EOT:传输结束(一个 ASCII 字符)0 0 1:要关闭的连接数目(3 个十进制 ASCII 字符)0 1 2:要关闭的出站链路号。
随后 HOST(y) 如 (a) 中那样发回确认。
HOST(x) Control Link HOST(y)
<-----------------------------
ACK EOT 0 0 1 0 1 2 0 1 5
备注 1 - 在 (a)、(c) 和 (e) 中,HOST(y) 可能回送一条包含否定确认字符 NAK 而非 ACK 的报文。这有许多不同的原因,例如:顺序错误、连接已打开,等等。该报文可以是 NAK IND,其中 IND 是一个字母数字字符,以编码形式指出前一个块被拒绝的原因。收到这样的确认后,HOST(x) 将重发其报文,直到 HOST(y) 接受为止。若连续出现过多的「NAK 报文」,将启动应急过程。
备注 2 - 在上述每个图示(箭头)中,只表示了报文正文。实际上,在这些链路上交换的是完整的报文(带有首部、标记、填充……)。