网络通信中数据发送/接收缓冲区的管理方法 【技术领域】
本发明涉及网络通信技术领域,尤其涉及一种网络通信中数据发送/接收缓冲区的管理方法。
背景技术
随着网络通信技术的发展,IP(Internet Protocol,互联网协议)分组网络技术逐步成熟,为实现传统电路交换网络与IP分组网络的互通,需要在IP网络上传输No.7信令等电路交换信令协议。目前的SIGTRAN(Signaling Transport,信令传输)协议集即可满足在IP网络上传输传统电路交换信令协议的需求,SIGTRAN协议栈的结构如图1所示,由三部分组成;其中,SCTP(Stream Control Transmission Protocol,流控传输协议)为用于IP网络的通用信令传输协议,用来保证信令消息的可靠、有序传输;信令适配子层是对所承载的特定高层窄带信令进行适配的层次,用于向上提供了原有窄带信令的特定接口使得高层窄带信令可以保持不变透明地传输在信令传输协议栈上;IP是TCP/IP(传输控制协议/互联网协议)集内的标准IP协议。
SCTP能够提供面向连接的可靠数据包传输,无须上层实现数据定界功能,并有实时性好、安全性高、避免了行头阻塞、支持多地址等诸多优点,相对于TCP就更适合实时、安全、可靠性要求高的信令传输。
在现有的网络通信应用中,为减少数据收发过程导致内存频繁分配与释放造成的碎片,基于SCTP的数据发送/接收缓冲区一般采用静态分配的方式进行管理。然而,静态分配的发送/接收缓冲区在使用过程中存在以下问题:在发送端,交给SCTP层传输地上层数据是不定长的,SCTP需要将该数据保存到大小固定的SCTP发送缓冲区内,若缓冲区太大,用户数据长度较小时浪费内存;若缓冲区太小,用户数据长度较大时,则数据分片太多,降低数据收发处理速度;在接收端,SCTP接收数据包长度也是不确定的,SCTP同样需要将接收数据包保存到大小固定的SCTP接收缓冲区内,当数据包长度很小时,内存浪费严重,当数据长度较大时,则数据分片太多。
【发明内容】
本发明的目的是提供一种网络通信中数据发送/接收缓冲区的管理方法,以提高数据发送/接收缓冲区使用过程中的利用率,并有效地提高数据收发处理速度。
本发明的目的是这样实现的:网络通信中数据发送/接收缓冲区的管理方法,包括:
a、将数据发送/接收缓冲区划分成不同大小的子缓冲区;
b、对于需要进行缓存的数据,根据数据包的大小确定与其相匹配的子缓冲区,进行数据的缓存。
所述的步骤a为:
将数据发送缓冲区划分为D1、D2......Dn-1、Dn种类型子缓冲区,且按其大小依次为:D1>D2>......>Dn-1>Dn;
将数据接收缓冲区划分为D1、D2......Dm-1、Dm种类型子缓冲区,且按其大小依次为:D1>D2>......>Dm-1>Dm。
当需要缓存的数据包为待发送的数据包时,所述的步骤b为:确定待发送数据包长度,并选择Dx子缓冲区缓存该数据包,且满足Dx子缓冲区大小>该数据包长度>Dx-1子缓冲区的大小,1≤x≤n。
该方法还包括:所述的Dx子缓冲区不足以缓存待发送的数据包时,则依次使用Dx+1、Dx+2......Dn子缓冲区;所有的子缓冲区均不足以缓存待发送的数据包时,则可以将数据包分片后进行缓存,并由接收端将分片后的数据进行还原。
用于缓存发送数据包的子缓冲区的大小应小于传输路径MTU(最大传输单元)。
当需要缓存的数据包为待接收的数据包时,所述的步骤b为:确定待接收数据包长度,并选择Dy子缓冲区缓存该数据包,且满足Dy子缓冲区大小>该数据包长度>Dy-1子缓冲区的大小,1≤y≤m。
所述的Dy子缓冲区不足以缓存待接收的数据包时,则依次使用Dy+1、Dy+2......Dm子缓冲区。
当数据包到达但没有适用的缓冲区时,丢弃传输序列号最大的数据包;同时,对于接收的长度超出IP包长度1500字节的数据包,做丢弃处理。
丢弃的数据包如果已经被证实,还需要发送否定证实消息。
所述的数据发送/接收缓冲区为基于SCTP(流控传输协议)的发送/接收缓冲区,且将数据发送缓冲区划分为大、中、小三种类型子缓冲区,将数据接收缓冲区划分为超长、大、中、小四种类型子缓冲区。
由上述技术方案可以看出,本发明将基于SCTP的数据发送/接收缓冲区按大小分为不同类型,并根据传输数据长度和路径MTU大小进行统一分配管理,从而提高基于SCTP的数据发送/接收缓冲区使用过程中的利用率,同时,可有效地提高数据收发处理速度。
【附图说明】
图1为信令传输协议协议栈结构示意图;
图2为发送数据包时缓冲区分配流程图;
图3为接收数据包时缓冲区分配流程图。
【具体实施方式】
本发明的核心思想是将SCTP缓冲区按大小分成不同类型的子缓冲区,并根据数据包的大小确定与其相匹配的子缓冲区进行数据包的缓存。
实施本发明,首先需要将数据发送缓冲区划分为D1、D2......Dn-1、Dn种类型子缓冲区,且按其大小依次为:D1>D2>......>Dn-1>Dn,n为大于或等于1的整数;将数据接收缓冲区划分为D1、D2......Dm-1、Dm种类型子缓冲区,且按其大小依次为:D1>D2>......>Dm-1>Dm,m为大于或等于1的整数。
当需要缓存的数据包为待发送的数据包时,需要确定待发送数据包长度,并选择Dx子缓冲区缓存该数据包,且满足Dx子缓冲区大小>该数据包长度>Dx-1子缓冲区的大小,1≤x≤n;当所述的Dx子缓冲区不足以缓存待发送的数据包时,则依次使用Dx+1、Dx+2......Dn子缓冲区;所有的子缓冲区均不足以缓存待发送的数据包时,则可以将数据包分片后进行缓存,并由接收端将分片后的数据进行还原;
当需要缓存的数据包为待接收的数据包时,需要确定待接收数据包长度,并选择Dy子缓冲区缓存该数据包,且满足Dy子缓冲区大小>该数据包长度>Dy-1子缓冲区的大小,1≤y≤m;当所述的Dy子缓冲区不足以缓存待接收的数据包时,则依次使用Dy+1、Dy+2......Dm子缓冲区。
例如,对于SCTP数据发送/接收缓冲区可以分为大、中、小三种类型的子缓冲区;且SCTP接收缓冲区还可以分配有超长类型的子缓冲区,以方便接收数据包的缓存;
以最大数据包长度为1500字节的以太网为例,可以将SCTP发送缓冲区分为100字节、200字节和500字节三种类型的子缓冲区,且大子缓冲区大小就小于路径MTU值,即小于500字节;将SCTP接收缓冲区分为100字节、200字节、500字节和1500字节四种类型的子缓冲区,其中1500字节的子缓冲区为2-3个即可,该子缓冲区的设置是考虑到可能需要接收少量500字节<接收数据长度≤1500字节的数据;
各子缓冲区大小和数目可根据网络通信系统需要确定。
将发送/接收缓冲区划分成若干个子缓冲区后,便可以根据发送/接收数据包长度,及发送数据包传输路径MTU大小来分配使用各个子缓冲区,该过程进一步包括:
发送数据包时,根据发送数据包长度和路径MTU大小分配相应的子缓冲区,具体分配方案如图2所示,包括:
步骤1:确定待发送数据包的长度;
步骤2:判断待发送数据包的长度,是否小于或等于小子缓冲区的大小,如果是,则执行步骤3,否则,执行步骤4;
步骤3:优先使用小子缓冲区,如果小子缓冲区不足以缓存数据待发送的包时,则可依次使用中子缓冲区和大子缓冲区;
即:当发送数据包长度≤100字节时,使用100字节的发送子缓冲区保存发送数据包;若100字节的发送子缓冲区无法满足使用,则可使用200字节的发送子缓冲区来替代;若200字节的发送子缓冲区不够,则可使用500字节的发送子缓冲区来替代;若SCTP三种发送子缓冲区都不够使用了,分配发送子缓冲区失败;
步骤4:判断待发送数据包的长度是否小于或等于中子缓冲区大小,如果是,则执行步骤5,否则,执行步骤6;
步骤5:优先使用中子缓冲区,如果中子缓冲区不足以缓存数据待发送的包时,则可使用大子缓冲区;
如果大子缓冲区还不足以缓存数据待发送的包时,则使用SCTP的分片功能将待发送数据包分片,然后使用小子缓冲区缓存数据;
即:当100字节<发送数据包长度≤200字节,且路径MTU≥200字节时,则使用200字节的发送子缓冲区保存发送数据包;若200字节的发送子缓冲区无法满足使用,则可使用500字节的发送子缓冲区来替代;若500字节的发送子缓冲区不够,则将数据包分片,并使用100字节的发送子缓冲区来替代;若SCTP三种发送子缓冲区都不够使用了,分配发送子缓冲区失败;
步骤6:优先使用大子缓冲区,如果大子缓冲区不足以缓存数据待发送的包时,则使用SCTP的分片功能将待发送数据包分片,然后使用中、小子缓冲区;
即:当发送数据包长度>200字节,且路径MTU≥500字节时,使用500字节的发送子缓冲区保存发送数据包;若500字节的发送子缓冲区无法满足使用,则将数据包分片,并使用200字节和100字节的发送子缓冲区来替代;若SCTP三种发送子缓冲区都不够使用了,分配发送子缓冲区失败。
另外,对于长度较大的发送数据包,则需要使用SCTP的分片功能将其分片;例如,发送数据长度为1500字节,则需要将数据包拆分为3个500字节数据包;若500字节子缓冲区已经分配完,也可拆为7个200字节和1个100字节的数据包;对端收到SCTP消息分片,可利用SCTP组包功能将接收到的分片数据包还原。
接收数据包时,根据数据包长度确定相应的子缓冲区,具体分配方案如图3所示,包括:
步骤11:确定接收的数据包长度;
步骤12:判断接收的数据包长度是否小于或等于小子缓冲区大小,如果是,则执行步骤13,否则,执行步骤14:
步骤13:优先使用小子缓冲区,如果小子缓冲区无法满足使用,则可依次使用中、大子缓冲区;
即:当接收数据包长度≤100字节时,使用100字节的接收子缓冲区保存该接收数据;
步骤14:判断接收的数据包长度是否小于或等于中子缓冲区大小,如果是,则执行步骤15,否则,执行步骤16;
步骤15:优先使用中子缓冲区,如果中子缓冲区无法满足使用,则可使用大子缓冲区;
即:当100字节<接收数据长度≤200字节时,使用200字节的接收子缓冲区保存该接收数据;
步骤16:判断接收的数据包长度是否小于或等于大子缓冲区大小,如果是,则执行步骤17,否则,执行步骤18;
步骤17:优先使用大子缓冲区;
即:当200字节<接收数据长度≤500字节时,使用500字节的接收子缓冲区保存该接收数据;
步骤18:判断接收的数据包长度是否小于或等于超长子缓冲区大小,如果是,则执行步骤19,否则,执行步骤21;
步骤19:判断所有超长子缓冲区是否可以满足缓存接收数据使用,如果可以,则执行步骤20,否则,执行步骤22;
步骤20:使用超长子缓冲区进行数据缓存;
即:当500字节<接收数据长度≤1500字节的数据时,使用1500字节的接收缓冲区保存该接收数据;
步骤21:丢弃该数据包,即对于长度超过1500字节的接收数据,作丢弃处理;
步骤22:丢弃TSN(传输序列号)最大的数据包,即当数据包到达但没有适用的缓冲区来缓存该数据包时,将数据包作丢弃处理。
而且,因为SCTP允许分片地证实,接收到的数据包的传输序列号不一定是最大的TSN,为了尽量减少分片证实的个数,而丢弃传输序列号最大的数据包。
如果丢弃的数据包已经被证实,还需要发送否定证实消息。SCTP有专用于证实的消息,与TCP(传输控制协议)一样叫SACK,该消息是数据接收方向发送方通知其接收了的数据,SCTP的每个数据块都有一个TSN,SACK就是通过该序列号向发送方发送确认信息的。否定证实是在下面的情况出现的:当对方发送来的数据已正确接收且已经向对端发送过SACK证实,当出现接收缓冲区满的情况下又有数据到达时必须要丢弃该数据,丢弃后必须重新向对端发送SACK,表明该数据块需重发。