高可靠性的包交换传输协议完美分析( 八 )


(a) 关于连接的通常消息,如中断,远程关闭等等;
(b) 对用户命令做出应答,是成功还是失败 。
Open
格式:OPEN (local port, foreign socket, active/passive [, timeout] [, precedence] [, security/compartment] [, options]) -> local connection name
我们假定本地TCP注重到它所服务的进程标记,而且将检查进程的认证 。因实现不同,本地网络和源地址的TCP认证可能由TCP进行也可以由下层协议进行(如IP协议) 。这些考虑主要是基于安全性的考虑 。
假如active/passive标记设置为passive,TCP会检测到达的连接请求,它是被动的,被动的连接可以有一个完全指定的外套接字用于等待特定的连接或未指定的外套接字来等待任何呼叫 。一个完全定义的被动呼叫可以通过执行一系列的SEND命令而变为主动的 。
创建一个传输控制块(TCB),其中一部分参数是由OPEN命令参数而来 。在主动OPEN时,TCP会马上开始同步连接 。假如给出参数timeout,会答应呼叫者应用于所有TCP数据 。假如在timeout规定的时间内还未把数据送到目的地,就关闭连接,一般的默认值是5分钟 。
参数precedence或security/compartment是用于规范用户对某一连接的安全性的,假如没有指定则使用默认值 。TCP会匹配这两个参数,只有在security/compartment一致而且接收到的precedence小于等于要求的precedence时才会打开连接 。当连接的precedence大于要求的值时,从接收到的数据段中取得这一值,并在连接中一直使用这个比较大的值 。具体实现时可以给用户权力控制precedence的决定过程 。例如,用户可以要求precedence必须安全一致,或在提升precedence时要通知用户 。
本地连接名(local connection name)由TCP返回用户,它可以代替<本地套接字,外套接字>标记一个连接 。
Send
格式:SEND (local connection name, buffer address, byte count, PUSH flag, UR
GENT flag [,timeout])
这个命令使指定缓冲区内的数据发向指定连接,假如连接未打开则返回一个错误,一些实现中可能在打开连接以前调用SEND,由SEND自动打开连接 。假如设置了PUSH标记,数据必须马上传送给接收者,而且PUSH位在缓冲区中的最后一个段是必须设置 。假如没有设置,此数据段就会因为效率的考虑而和下一个SEND命令传送的数据一起传送 。假如设置了URGENT标记,那就必须象上面所述的一样紧急处理 。传送方设置的URGENT数目不一定非要等于通知接收方用户的次数 。
假如在OPEN中没有指定外套接字,那缓冲区数据会被发送到隐式外套接字 。未使用外套接字打开连接的用户仍然可以SEND,而不用知道外套接字地址 。但是,假如在指定外套接字前进行SEND,则会出错 。用户可以使用STATUES确定连接状态 。假如指定了timeout,对于当前连接的当前用户timeout会更改为新的连接 。
最简单的实现方法就是在没有把数据发送完毕以前,SEND不把控制权交给发送进程,但是这样可能会造成死锁(例如,双方都试图SEND,而不预备RECEIVE),效率也不好 。好的实现方法是在发送一段数据后返回控制权给发送进程,当然假如能够多个SEND同时发送,那更好不过了 。有多个SEND需要服务时一般采取先来先服务 。
对于本地来说,我们现在假定的是SEND在发送数据后会产生类似中断的东西告诉发送进程数据发送的情况;当然SEND也可以在发送完后马上告知进行数据发送的情况 。我们可以乐观地认为发送是成功的,假如发送失败,连接会因为超时而关闭 。在实现中,即使是同步返回情况,也需要一些异步信号,但这些异步信号是用于处理连接的,而不是用于处理数据发送的 。既然答应多个SEND同时工作,因此有必要区别返回的信息是哪一个SEND的 。具体的情况下面会讨论到 。

推荐阅读