51学通信技术论坛

标题: UDP、TCP和SCTP [打印本页]

作者: 蓉城喜鹊    时间: 2013-3-28 22:33:33     标题: UDP、TCP和SCTP

本帖最后由 蓉城喜鹊 于 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的重传。

  行头阻塞参见下图:

  [attach]2566[/attach]

  [attach]2567[/attach]


作者: 蓉城喜鹊    时间: 2013-3-28 23:00:11

  对于SCTP来说,它结合了UDPTCP两者的优点,同时采用传送消息来说明:

  A.      SCTP可以同时传送多个应用程序的消息,象UDP一样,这些消息是完整的,不象TCP报文(其中仅为消息的一部分);

  B.      SCTP在单个报文中传送多个应用程序的多个消息时,任何一个消息的丢失,都不影响其它应用程序继续发送;并且丢失的消息可以通过确认机制进行重发。

  C.      除了上面优点,SCTP还有一个优点,就是通信的两个主机之间的会话可以采用多个IP间互联来完成,也称为偶联。


  SCTP传送报文的示意可参考如下:



  [attach]2569[/attach]

  [attach]2570[/attach]


作者: 蓉城喜鹊    时间: 2013-3-28 23:28:55

本帖最后由 蓉城喜鹊 于 2013-3-28 23:30 编辑


  那么SCTP是通过什么方式来携带多上消息的呢?我们看下面的SCTP报文结构:

  在SCTP中除了前面的报文头,后面全部为各种数据块CHUNK。这些Chunk块可以用于携带SCTP本身的信令交互、用户的业务数据等。这个CHUNK块之间是相互独立的,每个CHUNK的大小取决于它所携带信息内容的多少。

  当然了,一个SCTP报文中所携带CHUNK的数量不是无限的,这取决于CHUNK块本身的大小,以及IP报文大小。

  [attach]2571[/attach]

  SCTP报文中CHUNK的类型有:

CHUNK IDCHUNK Type Chunk解释
0DATA用于传送业务数据
1INIT用于发起两个端点之间的SCTP 偶联。
2INIT ACK用来确认SCTP 偶联的发起消息(INIT)。
3SACK该数据块送至对端,以确认收到DATA 块,并且通知对端DATA 的接收顺序间隙。
4HEARTBEAT端点发送该数据块至对端,以检测当前偶联中定义的某
一目的地址的可达性。
5HEARTBEAT ACK响应HEARTBEAT 消息。
6ABORT快速关闭偶联。
7SHUTDOWN偶联中的一个端点对其偶联发起一个GRACEFUL 关闭。
8SHUTDOWN ACK响应SHUTDOWN 消息,关闭程序完成时发出。
9ERROR通知对端,SCTP 偶联发生某种错误
10COOKIE ECHO仅用于偶联发起过程,它由偶联的发起者发送至对端以完成发起程序
11COOKIE ACKCOOKIE 证实,相对于COOKIE ECHO
12ECNE保留,应用于外部环境拥塞发布回声
13CWR保留,应用于降低拥塞窗口
14SHUTDOWN COMPLETE用于关闭程序完成时对SHUTDOWN ACK 消息进行确认
15~255IETF保留IETF保留

  

作者: 蓉城喜鹊    时间: 2013-3-28 23:37:10

更多的SCTP资料可参见RFC 4960。

在爱立信SGSN或GGSN设备的alex中对SCTP也有讲解,但讲的比较粗。另外一个好方法就是去找国内某知名厂商的sctp教程,是全中文的,看起来非常不错。

OK,一直从网站学知识,今天也为网站的发展贡献点绵绵之力,以示谢意!洗洗睡觉。
作者: kinghighland    时间: 2014-3-8 21:52:59

蓉城喜鹊 发表于 2013-3-28 23:37
更多的SCTP资料可参见RFC 4960。

在爱立信SGSN或GGSN设备的alex中对SCTP也有讲解,但讲的比较粗。另外一 ...

这么好的学习材料,不顶不足以平民愤!
作者: ccc123    时间: 2014-3-11 00:46:00

向经典致敬。。。。
作者: lscsco    时间: 2014-5-22 22:56:13

讲的通俗易懂,谢谢,学习了。。。




欢迎光临 51学通信技术论坛 (http://51xuetongxin.com/bbs/) Powered by Discuz! X2