本帖最后由 蓉城喜鹊 于 2013-3-28 22:34 编辑
在流控制传输协议 SCTP(Stream Control Transmission Protocol)出现以前,在IP 网上传输七号信令使用的是UDP 和TCP 协议。
UDP 是一种无连接的传输协议,无法满足七号信令对传输质量的要求。TCP 协议是一种有连接的传输协议,可以信令的可靠传输,但是TCP 协议具有行头阻塞、实时性差、支持多归属比较困难、易受拒绝服务攻击(Dos)的缺陷。因此IETF(Internet Engineering Task Force)RFC2960 制定了面向连接的基于分组的可靠传输协议SCTP 协议。
SCTP 对TCP的缺陷进行了完善,使得信令传输具有更高的可靠性,SCTP 的设计包括适当的拥塞控制、防止泛滥和伪装攻击、更优的实时性能和多归属性支持,因此,SCTP 成为SIGTRAN 协议族中的传输协议。
SCTP 被视为一个传输层协议,它的上层为SCTP 用户应用,下层作为IP分组网络。SCTP上层的用户常见有Sigtran中的M3UA、S1AP、Diameter等;目前在现网中,SCTP主要用来传关M3UA报文。
在这里,对UDP、TCP、SCTP三种传输层协议进行一个区别说明:
(1)每个UDP报文,可以看成一封信,这封信就是一条独立的消息。发送端发几个UDP报文,接收端就等于收到了几条消息,每条消息之间是相互独立的,只有一收到消息就可以直接发送给应用程序去处理。因此说UDP是基于消息(或报文)的;但UDP报文的缺点是容易丢失。发送端不停的发,不会去感知IP网络有没有拥塞,也不考虑接收端有没有能力接收;
(2)同样是一条消息,UDP用一个报文就可以发完了,但对于TCP来说,它传送这条消息,需要按比特流方式来传送,也就是说,TCP要把这条消息分成多个子段(术语称为比特流),每个TCP报文只携带一个子段向外发送。当接收端收到TCP报文后,从中提出消息子段放到队列中,直到等到所有TCP报文全部收到,提出全部的消息子段并组合成完整的消息后才向应用程序递交该消息。
那么TCP是如何知道何时去组合完整的消息呢?秘密就在TCP报文头部。在TCP报文头部,有个比特位称为PSH位,当Tx端发送一条消息的最一个TCP报文时,就把TCP头部的PSH比特位置1,当Rx端看到这个比特为1时,就把缓存中已经接收的所有数据组合成完整的消息,递交给应用程序。
在TCP传送消息时,Tx端和Rx端还需要建立连接,Tx端发送的每个TCP报文,Rx端都要进行确认,如果出现丢失的报文,Tx端要重发。所以TCP为可靠传输。
最后,在两个设备间,TCP在传送某个应用层数据(可以理解为消息)时,必须把这此数据分成成多个TCP报文传送。当这两个设备之间有多个应用程序需要同时用TCP来发送数据,那么这些应用程序就必须排队来使用TCP的连接。当某个应用程序的单个TCP报文丢失了,其他应用程序就必须等待该TCP的重传。
行头阻塞参见下图:
|