以下内容摘自笔者的《网络工程师必读――网络工程基础》一书(如感兴趣,可加入我的圈子:[url]http://group.51cto.com/lycb[/url]):
9.2.2 传输服务原语
所谓
“
原语
”
就是规定了一个实体应当完成的功能,供用户和其他实体访问该服务时调用,并通知服务提供者采取某些行动或报告某个对等实体的活动。不仅传输层有,其它层也可以有,如下章介绍的会话层和表示层。
1. 标准的传输服务原语
“
传输服务原语
”
允许传输用户访问传输服务,并且这种访问是直接的和不透明的。
一套简单的传输服务原语集合包括:监听(
Listen
)、连接(
Connect
)、发送(
Send
)、接收(
Receive
)、断连(
Disconnect
)。
这些服务原语的工作原理是这样的:
(
1
)服务器执行
Listen
原语,一般的做法是调用一个侦听库过程,由它执行一个系统调用,并且阻塞该服务器,使其处于监听状态,直到有客户来连接。
(
2
)当一个客户希望与该服务器进行通话的时候,它执行
Connect
原语。在这个原语中,传输实体将阻塞调用方,并且给服务器发送一个分组。封装在该分组净荷中的是一条发送给服务器传输实体的传输层消息。
客户的
Connect
调用将使得传输实体发送一个
C Request TPDU
给服务器。娄这个
TPDU
到达服务器的时候,服务实体执行检查,看服务器是否正被阻塞在
Listen
调用中。然后它解除服务器的阻塞,并且给客户送回一条
C Accepted TPDU
。当这个
TPDU
到达客户端的时候,客户也被解除阻塞,于是传输连接建立起来了。
(
3
)传输连接建议好后,就可以正式发送数据了。任何一方都可以执行
Receive
原语,以等待另一方执行
Send
原语。当
TPDU
到来的时候,接收方被解除阻塞。然后它可以对这个
TPDU
进行处理并发送一个应答。只要双方对于发送的数据的顺序有统一的认识,则这种方式可以工作得很好。
【注意】在传输层上,即使一个非常简单的单向数据交换过程也会比网络层上的交换过程复杂。发送的每一个数据分组最终都要被确认。推携带控制
TPDU
的分组也要被确认,无集结是以隐式,还是显示方式。这些确认是由传输实体使用网络层协议来管理的。它们对于传输用户是不可见的。同样,传输实体也不关心定时器和重传的问题,这些机制对于传输用户全部不可见。
(
4
)当不再需要一个连接时,传输用户必须将它释放,以便使两个传输实体内部的表空间有机会被除数重新使用。释放连接有两种形式:对称释放和非对称释放。在非对称释放中,任何一方都可以执行
Disconnect
原语,从而导致它的传输实体将一个
Disc TPDU
发送给远程的该
TPDU
后,连接就被释放。在对称方式中,连接的两个方向彼此独立,每个方向需要单独被释放。当一方执行
Disconnect
原语的时候,这意味着它不再需要发送数据了,但是它仍然希望能接收对方发过来的数据。在这种方式中,只有当双方都执行了
Disconnect
原语,一个传输连接才可能被真正释放出来。
图
9-6(此处显示不了)
给出了全用这些简单传动轴服务原语来建立和释放连接的状态图。每一个状态的出现都是一种事件触发,或者是由本地的传输用户执行了一个原语,或者是接收到了一个
TPDU
分组。不过要注意,此处为了简单起见,假设了每一个
TPDU
都单独确认的,而且也采用了对称释放模型,由客户先释放连接。图避实线部分显示了服务器的状态序列,而虚线部分则显示了客户的状态序列。
图
9-6
一个简单的传输连接管理流程
传输服务原语允许传输服务用户访问传输服务。这里需要说明的是,传输服务类似于网络服务,但两者存在显著的区别。网络服务倾向于将实际网络提供的服务模型化,由于网络内部问题,实际的网络可能会丢失数据分组,所以网络服务并不十分可***。相反,面向连接的传输服务则是可***的,虽然实际的传输服务并非毫无错误,但在不可***的网络服务之上提供可***的传输服务正是传输层要实现的目标。
2. ISO规范中的传输服务原语
ISO
规范包括四种类型
10
个传输服务原语,其中服务质量参数指示用户的要求,诸如吞吐量、延迟、可操作度和优先度等。传输服务(
TS
)用户数据参数最多可达
32
个八进制用户数据。
I
SO
规范的四种类型传输服务原语,如下:
l
请求(
Request
):用户利用它要求服务提供者提供某项服务。如建立连接或发送数据等;
l
指示(
Indication
):服务提供者执行一个请求后,用指示原语通知收方的用户实体,告知有人想要与之建立连接或发送数据等;
l
响应(
Response
):收到指示原语后,利用响应原语向对方作出反应。例如同意或不同意建立连接等;
l
确认(
Confirm
):请求方可以通过接收确认原语来获悉对方是否同意接受请求。原语可以携带参数,如连接请求原语的参数可能指明它要与哪台机器连接,需要什么服务类别等。连接指示原语的参数可能包含呼叫者的标识、需要服务的类别等。被呼叫实体可以在响应原语中的参数里表示同意或不同意连接;若同意,则可能对某些参数给出协商值,比如最大数据吞吐量等。
在传输连接建立阶段所需的四个服务原语及参数如下:
l
T-CONNECT.request
(参数包括:被叫地址,主叫地址,加速数据选择,服务质量,用户数据)
l
T-CONNECT.indication
(参数同上)
l
T-CONNECT.response
(参数包括:服务质量,相应地址,加速数据选择,用户数据)
l
T-CONNECT.confirm
(参数包括:服务质量,相应地址,加速数据选择,用户数据)
在数据传送阶段所需的服务原语如下:
l
T-DATA.request
(参数为
“
用户数据
”
)
l T
-DATA.indication
(参数为
“
用户数据
”
)
l
T-EXPEDITED-DATA.request
(参数为
“
用户数据
”
)
l
T-EXPEDITED-DATA.indication
(参数为
“
用户数据
”
)
在传输连接释放阶段所需的服务原语和参数如下:
l
T-DISCONNECT.request
(参数为
“
用户数据
”
)
l T-DISCONNECT.indication
(参数包括:释放原因,用户数据)