TCP 传输控制协议( 九 )


创建一个传输控制块(TCB),其中一部分参数是由OPEN命令参数而来 。在主动OPEN时,
TCP会马上开始同步连接 。假如给出参数timeout,会答应呼叫者应用于所有TCP数据 。如
果在timeout规定的时间内还未把数据送到目的地,就关闭连接,一般的默认值是5分钟

参数precedence或security/compartment是用于规范用户对某一连接的安全性的,假如
没有指定则使用默认值 。TCP会匹配这两个参数,只有在security/compartment一致而且
接收到的precedence小于等于要求的precedence时才会打开连接 。当连接的precedence
大于要求的值时,从接收到的数据段中取得这一值,并在连接中一直使用这个比较大的
值 。具体实现时可以给用户权力控制precedence的决定过程 。例如,用户可以要求prec
edence必须安全一致,或在提升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的 。具体的情况下面会讨论到 。
Receive
格式: RECEIVE (local connection name, buffer address, byte count) -> byte c
ount, urgent flag, push flag
此命令分配一个接收缓冲区给指定的连接 。假如下面不是一个OPEN命令或者此调用进行
未被授权使用此连接返回错误 。最简单的实现方法是在缓冲区没有填充完以前不返回控
制权,但这样可能会造成严重的死锁 。更复杂的实现方法答应同时存在多个RECEIVE,这
样会提高效率 。这样是在控制复杂的情况下取得了高效率 。
假如在PUSH之前的数据已经填满缓冲区,那么对于RECEIVE的响应中就不用设置PUSH位了

推荐阅读