简单的 NCP 协议( 三 )


当远程NCP收到ABEND消息的时候,它就会停止向链路发送消息,并且拒绝接受来自其用户进程的新消息 。空缓冲被回收 。等待被接受的输出消息被销毁,相应的缓冲也被回收 。只要用户进程同意,那么输入信息就会注入用户进程中 。当输入被同意接收后,其缓冲也会被要求归还 。提交的DEC消息会将回收的缓冲删除 。当用户进程不再输入时,输入消息会被销毁,其缓冲也会被回收 。实际上链路中每端的所有缓冲最终都会被回收 。这是该连接就能被关闭,同时相应的套接口号也可以被重新分配而不会造成混乱 。
在这个提议的协议构造下,上述四个功能包括了一个网络NCP必须具有的所有功能 。假如只在一个缓冲空间被释放后才又进行缓冲的分配工作,那么就不会有“溢出”的错误发生,也不需要为消息流加上更多的限制 。对每个用户来说,肯定有缓冲空间来接受到达的消息 。对任何用户来说,肯定有缓冲来接收到达的消息 。所有的控制消息的处理都不需要额外的存储空间 。当地的治理程序能够防止一个用户进程提交过多的侦听 。
当很多未完成的连接存在时,就会导致存储空间利用十分低效 。编码简易性的一个代价是50%的缓冲空间的浪费 。在大型主机上,可以证实实现下列的NCP扩充是有用的 。假如使用更复杂的流控制过程,一个NCP就可能分配比实际中存在的更多的缓冲空间,而且也不会产生问题 。其它的扩充实现了消息的压缩、吞吐量的改善以及透明的错误恢复机制 。
因为某些扩充需要外部主机的协作,并且假设了这些主机不仅仅实现了最小化的NCP,因此有人主张使用一个查询控制消息来察看外部主机实现了何种扩充 。对一个INQ的应答是一个控制消息,该消息定义了主机的规范 。假如返回了一个“未定义错误”,外部主机就会被默认为只实现了一个最小化的NCP 。
一个简单的扩充是定义一个控制消息来代替用户RFNM消息 。一个用户RFNM是一个空文本消息,比如当文件通过双工链路传输是作为应答消息 。它们是低效的,因为它们将一个项与IMP链路分配表绑定起来,同时减少了网络的吞吐量 。一个更有效的解决方案是通过控制链路发送一个非凡的消息 。使用这种方式,一个短的消息就能代替几个用户消息 。
URFNM
因为控制链路与用户链路的返回端同时存在,所以当应答链路有其它消息要发送的时候,URFNM不能被用户RFNM代替 。否则消息会变得无序,用户透明性也会失去 。
通过在双工链路上增加额外的箱子数量这种机制,可以使吞吐量增加 。这或者是由用户手工来完成,或者由NCP负责 。
INC
外部主机对这种请求通过INCR来应答 。
INCR
假如外部NCP不能满足额外的缓冲需求,那么将会比小,并且可能为零 。所有的当地缓冲的初始状态是“布满空箱子”,而所有的外部缓冲的初始状态是“空” 。
RFDL和ACDL中的参数可以被用来定义实际在发送方向上所容许的信息的最大长度 。一个智能的NCP能获知这个信息,从而分配较少的缓冲 。而一个智能程度不高的NCP可能会忽略这个信息,并且总是假定是最长的信息 。举个例子,假如这个参数值为零,那么只会发送用户RFNM消息 。而一个智能的NCP将不会分配任何缓冲 。
假如NCP保留在网络上发送的用户消息的副本,直到收到应答消息为止的话,那么就可以实现一个错误自动恢复过程 。因为链路带宽总是已知的,所以NCP可以知道此刻链路中是否有消息在传送 。这是通过首次向外部NCP发送一个STOP消息来实现的:

推荐阅读