I.总的看法
---------------------------
网络协议提供了三方面的便利性:
1.连接的建立
2.流控制
3.再连接
“再连接”被从“连接建立”中分离出来,一方面是由于它的复杂性,另一方面是由于
我还没有怎么接触过一个完整的体现此概念的协议。
连接的建立
------------------------
连接建立的运作基本上与NWG/RFC#33中的一样。最主要的变化就是提供了独立于设施
的更加完善的交换方式,使得不包括交换过程的设施显得更加简单。
下面是连接建立的大概情况:
1. 主机A中的进程PA抢占套接口SA,并请求与套接口SB建立连接。进程PA通过一
个系统呼叫来完成此工作。
2. 与此同时,主机B中的进程PB抢占套接口SB,并请求与套接口SA建立连接
3. 在对进程PA的请求的回应中,主机A中的网络协议程序(简记为NCPA),发送一
个“请求--连接(RFC)”命令给主机B。B主机中的NCPB发送一个类似的命令给主
机A。没有默认的顺序,NCPB可以在从NCPA接收命令之前或之后向NCPA发送命令。
4. NCPA和NCPB都知道连接是在它们都收到了一个RFC命令而且都接收到了其发送出
的RFNM之后才确立的。然后它们分别通告进程PA和PB,连接已经确立。一个必
须坚持的原则就是或者是由SA作发送方接口,SB作接收方接口,或者是相反的情
况。这种状况有时被称为“SA和SB必须组成‘发送/接收’对”
5. 发送进程可以马上进行。
流控制
------------------------
为了阻止发送进程导致接收进程的溢出,接收方进程能够停止数据流就显得很有必要了(*)。
流控制被集成到网络RFNM处理中。当一个接收方主机希望限制一条单独线路上的流传输时,
该主机发送一条专用消息给它的IMP,使那条链路上的下一个RFNM被修正。发送方主机将该
消息解释为一条RFNM,当作是要求停止发送的请求。一条强制控制命令被返回。
当接收方主机预备好再次接收时,它发送一条命令(RSM)告诉发送方主机再次发送。
---------------------------------------------------
(*)BB&N坚持认为应该提供无限的缓冲机制。这当然可能成为一项适当的策略:但这与我
的思维方式完全相左,而且我对协议的设计是基于这样的假设:在每个连接的接收端只提供
了一个很小的缓冲器。
再连接
-------------------------------
由于很多理由,需要能够将一个(或两个)连接的终端从一个端口转换到另一个端口。这是
否易于实施,取决于在转换进程上施加的种种限制。为最大的满足一般性,我在此提出“动
态再连接”的方案,那意味着再连接过程即使是在流传输开始之后也能够发生。在大多数情
况下,这种方案的成本比它实际需要的要高很多,要求有下面的优点:
1. 提供交换连接的所有不同窗体。
2. 再连接过程不引入通过一个连接发送的消息进程的额外开销,也就是说,全部的开销就
在实施协议过程中。
II.数据结构
--------------------------
1. 连接表
2. 进程表
3. 输入链路表
4. 输出链路表
5. 链路分配表
连接表
------------------
此表保存了属于本地端口(SOCKET)的所有信息,无论它是否被某个连接占用,占用它的连
接正处于何种状态。入口条目由本地端口键入,但其它表也有指向本表的指针。(参见进程
表,输入链路表和输出链路表。)
每个条目都包括以下信息:
a) 本地端口(键)
b) 外来端口
c) 链接
d) 连接状态
e) 流状态和缓冲控制
f) 指向用户进程的指针
g) 再连接控制状态
h) 等待呼叫队列
本地端口是一个32位的数。假如某个特定端口的条目不存在,它会被生成为空值。
外来端口是一个40位的数。假如没有连接被建立,这个字段将不会被赋值。
链接是一个8位的数,是数据从发送方发送到接收方所经过的链接。一个套接口当且尽当它
的低位为0时,它才是接收端口。
连接状态指的是一条链接是否开放等等。下面是可能出现的情况:
a) 本地进程已经请求了一条链接
b) 异地进程已经请求了一条链接
c) 连接确立
d) 再连接进行中
e) 关闭等待
f) 再连接等待
流状态和缓冲控制指的是核实RFNM的发送及认可终止,挂起和恢复命令,和保持对数据的
流入流出的跟踪。
一个指向用户进程的指针当该进程已经请求了一条连接时是必需的。
假如再连接正在进行,保持对事件顺序的跟踪就是必要的了。被再连接进程占用的端口或者
是一个端点或者是一个中间点。假如它是一个中间点,就有必要将其它的与其连在同一个进
程上的中间点的8位的名字都储存起来,并记录下END和RDY命令的接收。
最后,假如RFC(“请求---连接”命令)当端口被占用或没有进程占用它时被接收到,RFC
将被按照“先进先出”的原则在命名的本地端口中压入堆栈队列。
进程表
----------------------
此表联系起一个进程和一个套接字端口。它被用来进行系统调用。
输入链路表
----------------------
此表将接收链路与本地套接字端口联系起来。它用来判定引入的消息的去向。
输出链路表
----------------------
此表将发送链路与本地套节字端口联系起来。它用来解释RFNM和RSM命令。
链路分配表
----------------------
链路是由接收方分配的。此表显示哪些链路是空闲的。
III.控制命令
-----------------------
命 令 一 览
0<NOP>
1<RFC><me><you>或<RFC><me><you><link>
2<CLS><me><you>
3<RSM><link>
4<SPD><link>
5<FND><me><you><asker>
6<END><link><end>
7<RDY><link>
8<ASG><me><you><link>
命 令
无操作
格式:NOP
NOP是X'00'
用途:此命令被包括进来是为了完整和方便。
请求连接
格式:<RFC><mysocket><yoursocket>
或<RFC><mysocket><yoursocket><link>
<RFC>是X'01'
<mysocket>是一个32位的套接字端口号码,属于发送方
<yoursocket>是一个32位套接字端口号码,属于接收方
<link>是一个8位的链接号码
<mysocket>和<yoursocket>必须是发送/接收成对出现。
<link>被包括进来,当且仅当<mysocket>是一个接收方套接字端口。
用途: 此命令用来初始化一个连接。当两个主机已经用同样(颠倒)的方式交换了
RFC命令时,连接被确定。链路由接收方分配。
关闭
格式:<CLS><mysocket><yoursocket>
<CLS>是X'02'
<mysocket>和<yoursocket>对<RFC>而言是相同的
用途: 此命令用来阻断一个连接。它还被用来中止一条连接的确立或用来拒绝一个请
求。这种情况发生在当被点名的两个套接字端口之间没有确立连接或是正在处
于被连接的进程中的时候。此时,<CLS>应该被丢弃。
恢复
格式: <RSM><link>
<RSM>是X'03'
用途: 此命令由一个接收方主机发送以引起发送主机在已经指出名字的链路上恢复
传输。当一个发送主机接收到一条非凡的代表某种消息的RFNM时,它会延缓发
送。(非凡的RFNM是由接收方的IMP基于其主机的要求下生成的。)
暂停
格式:<SPD><link>
<SPD>是X'04'
用途: 此命令由发送方主机发出,以确认它已经停止通过该指定链路发送。假如一个
<RSM>命令被接收到,传输将恢复。
最终终端
格式:<FND><mysocket><yoursocket><asker>
<FND>是X'05'
<mysocket>是一个32位的套接字端口号码,属于发送方
<yoursocket>是一个32位的套接字端口号码,属于接收方
<mysocket>和<yoursocket>组成一个发送/接收对。
在它们之间要确定一条连接。
<asker>是一个40位的与<mysocket>类型相同的套接字端口号码。
用途: 假如一个进程决定用将它的一个接收端口和一个发送端口连接起来的方法使
自身短路,NCP发送出两个<FND>命令──每个方向一个。每个都拥有针对<my
socket>初始化的<asker>。
一旦接收到一个<FND>命令,NCP就检查它的<yoursocket>。假如<yoursocket>
已经被一个再连接所占用,该命令就被传递到一个新的<mysocket>和<your
socket>。但是,在它被传递前,<asker>要与新的<mysocket>进行比较。如
果它们相等,就发现了一个循环,两个端口都将被关闭。
假如<yoursocket>未被一个再连接占用,它就被标记为一个再连接链的端点,
而一个<END>会被发送回来。
假如被指名的连接没在进行,一个<CLS>将被发送回来而<FND>会被丢弃。
终点找到
格式: <END><link><endsocket>
<END>是X'06'
<link>是个8位的链路号码
<endsocket>是一个40位的端口号码
用途: 此命令指明哪个端口是再连接链路的终点。它在<endsocket>生成,并通过所
有的中间端口被回送到另一个终端端口。假如<endsocket>是一个发送端口,
<link>指的就是发送方主机的发送端口和接收方主机的接收端口之间的一条
连接。假如<endsocket>是一个接收端口,<link>指的就是接收方主机的发送
端口和发送方主机的接收端口之间的一条链路。(“发送”和“接收”指的是
此控制命令的传输。)
完备
格式: <RDY><link>
<RDY>是X'07'
<link>是一个8位的链路号码
用途: 此命令被从一个发送端口发送到一个接收端口,以指明所有的消息都已经被传
送到,“再连接”可能发生。
指派新链路
格式: <ASG><mysocket><yoursocket><link>
<ASG>是X'08'
用途: 此命令完善一个“再连接”。当接收端口已经收到一个<RDY>后它就被从一个
接收端口发送到一个发送端口。一个新的连接被指派并且传输开始。