[0041] 下面结合附图对本发明的技术方案做详细描述。
[0042] 本发明实施例采用连接图G(V,E)来表示机会网络,其中V代表节点的集合,每个节点代表一个用户,eij∈E表示节点i和节点j的连接边。网络中任意一对节点i和节点j之间的
相遇服从参数为λij的指数分布,网络中的每个节点具有一定的初始能量,在转发和接收数
据包时都会消耗一定的能量。网络中的节点转发和接收数据包具体方法流程如图1所示,包
括如下步骤:
[0043] 步骤1:判断节点i是否需要发送数据包。
[0044] 如果有数据包需要发送,则进入发送环节,否则节点i需要等待有发送需求的数据包或者直到与其他节点相遇。
[0045] 步骤2:对要发送的数据包队列进行排序,节点i从队列中取出优先级最高的数据包且待发送。
[0046] 步骤3:节点i根据每个邻居节点j的兴趣历史记录表及数据包的兴趣向量,计算每个邻居节点j与数据包的兴趣相似度,并依据所计算兴趣相似度决定是否将数据包发送给
该节点。
[0047] 步骤4:判断节点i持有的数据包的副本数k是否大于或等于集合S中要发送的数据包总个数,如果是大于或等于,进行下一步骤,否则节点i优先选择转发条件好的节点作为
中继节点。
[0048] 步骤5:节点i构造、广播数据包并更新数据包的副本数k,进一步包括如下步骤:
[0049] 步骤5.1:节点i构造新的数据包。
[0050] 假设有S和H两个集合,如下表所示:
[0051]S H
[0052] 其中,S是候选节点二元组的集合,H是候选节点接收数据包的副本数的集合。新数据包包含集合S,集合S中包含有二元组(m,hm),其中m代表的节点的编号,hm代表的是节点m
接收的数据包副本数。
[0053] 步骤5.2:计算集合S中需要发送的数据包的个数γ。
[0054]
[0055] 其中|S|是候选集合S的势,m是指候选节点的编号,hm是编号为m的候选节点接收数据包的个数。
[0056] 步骤5.3:判断数据包副本数k的值是否大于等于γ,若是,则节点i构造新数据包。否则节点i将集合S中二元组中hm为1的二元组保持不变,其他二元组的hm值置为0,构造数据
包D。
[0057] 步骤5.4:节点i广播数据包并按照集合S中的各个元素广播数据包。
[0058] 步骤5.5:任意接收到数据包的邻居节点j,判断S中的元素的第一个分量是否含有该节点,若是,则邻居节点j接收数据包,并设置其副本数为包含该节点的元素的第二个分
量,否则节点j丢弃该数据包。
[0059] 进一步的,若节点j的数据包队列已有数据包,则丢弃新接收的数据包。
[0060] 若节点j的数据包队列已满,则节点j比较新到的数据包的优先级(设为α)与队列中所含数据包的最低优先级(设为β)的大小关系,若α大于β,则节点j丢弃优先级为β的数据包,并存优先级为α的数据包,否则节点j放弃对新数据包的存储。
[0061] 步骤6:判断数据包队列中是否还有未发送的数据包。
[0062] 如果数据包队列中还有未发送的数据包,返回执行步骤2,对剩余数据包进行排序,并从队列中取出优先级最高的数据包且计算每个邻居节点j与该数据包的相似度。
[0063] 步骤7:节点i将所持有的数据包发送给一个邻居节点后,继续等待和其它节点相遇,并重复执行步骤1-6。
[0064] 如图2所示,为本发明实施例数据包队列管理示意图。若某个节点同时有多个数据包等待发送,就按照一定的转发策略将所要发送的数据包形成队列进行管理。队列管理就
是对节点存储的数据包进行恰当的分类,从而在节点相遇时决策存储队列中数据包的转发
顺序,并在存储达到最大值时决策数据包的丢弃规则。机会网络中的数据包主要分为两种
类型:(a)节点自身产生的数据,封装为数据包存入数据包队列;(b)来自于其它节点的转发
数据包,存入数据包队列。在上述两种类型的数据包中,a类数据包刚刚产生,还没有经过传
输,而b类数据包已经被传输过了。因此,令a类数据包比b类数据包先发送,即a类数据包的
类别高于b类数据包。对于网络中的数据包,其生存时间越久,副本数目就可能越多,成功递
交到目标节点的概率也越大,因此生存时间也可以用来表示数据包在网络中的重要性和冗
余程度。
[0065] 假设在数据包的首部设有一个生存时间域,用来记录数据包在网络中的存活时间,此外,
[0066] 每个节点均有一个本地计时器。对于数据包的生存时间,按照如下的规则进行计算和更新:
[0067] ①刚生成的数据包,其生存时间被赋于0,并被存入数据包队列。
[0068] ②当数据包被转发到某个邻居节点时,此节点直接将其存入数据包队列,而对数据包的生存时间不做任何修改。同样,当数据包被传送给其它节点并重新放回数据包队列
后,其生存时间同样不变。之所以这么做是由于数据包在节点间的传输时间非常短,几乎可
以忽略。
[0069] ③数据包在被放入节点的数据包队列之后,其生存时间会在计时器超时片刻被自动增加。
[0070] 队列管理是由数据包的类型和生存时间共同决定的。数据包队列中的所有数据包按照先发送a类数据包后发送b类数据包的顺序排列并发送,而对于类别相同的数据包,则
依据各自的生存时间长短来排序,生存时间越小的数据包,其排列顺序越前。最后数据包队
列中数据包按照优先级从大到小排序。
[0071] 当节点的数据包队列已满,又有新数据包需要被入列时,节点比较新到的数据包和队尾的数据包的类别,并参照二者的生存时间做出数据包丢弃决定。规则如下:
[0072] ①若新数据包的优先级和队尾数据包的类别相同,且新数据包的生存时间较长,则直接丢弃新数据包;
[0073] ②若新数据包的和队尾数据包的类别相同,且新消时息的生存时间较短,则队尾数据包被丢弃,而新数据包会按照上述的数据包类别和生存时间的规则被插入到数据包队
列中;
[0074] ③若新数据包的类别高于队尾数据包的类别,新数据包也会按照上述的数据包的类别和生存时间的规则被插入到数据包队列中。
[0075] 数据包D的优先级PD计算方法如下:
[0076]
[0077] 其中t为数据包的生存时间。
[0078] 如图3所示,为本发明实施例邻居节点与数据包兴趣相似度匹配流程图,具体步骤如下:
[0079] 步骤3.1:更新持有数据包的节点i与相遇节点的兴趣历史记录表。
[0080] 兴趣向量F表示用户对各种兴趣的喜好程度,也表示内容在各个兴趣上的相关程度:
[0081] F=
[0082] F是一个兴趣向量,具有r个分量:f1到fr,fi代表第i个兴趣。如兴趣表(表1)所示:
[0083] 表1
[0084] 描述 值
f1 饮食 中餐
f2 音乐 古典乐
f3 阅读 看报
f4 影视 韩剧,美剧
… … …
fi 书籍 文学
… … …
fr 棋类 围棋
[0085] 每个兴趣具有多个可能的值。例如,f4表示影视,其值可能是“韩剧”或者“古装剧”。
[0086] 网络中任意一对节点相遇后会交换各自的兴趣形成各自的兴趣历史记录。本方法采用表格来记录节点的兴趣历史记录,如兴趣历史记录表(表2)所示:
[0087] 表2
[0088]特征 值1 值2 …
饮食 中餐(3) 西餐(3) …
音乐 古典乐(6) 流行乐(2) …
阅读 看报(6) 读书(2) …
影视 韩剧(2) 美剧(5) …
书籍 文学(5) 哲学(1) …
棋类 围棋(6) 象棋(2) …
… … … …
[0089] 网络中有如下的兴趣列表:(饮食,音乐,阅读,影视,书籍,棋类)。节点i的兴趣向量Fi=,代表的是(“中餐”,“古典乐”,“看报”,“韩剧,美剧”,“文学”,“围棋”)。节点i和邻居交换兴趣后,邻居节点和节点i的兴趣历史记录表会相对应地更新。
例如,如果节点i已经更新了f2的值为“古典乐=2”,则说明它曾经遇到两个对古典乐感兴
趣的节点。
[0090] 假设数据包L具有兴趣列表F=(“中餐”,“古典乐”,“看报”,“韩剧,美剧”,“文学”,“围棋”),在节点i的历史相遇记录中,对于兴趣“饮食”,存在两个喜欢“中餐”的节点,三个喜欢“西餐”的节点。因此, 类似地,对于兴趣“影视”,我们可以得到因此,我们得到:
[0091]
[0092] 假设αj=1,对于所有j=1,2,3,…,r,可得节点i和数据包L的兴趣相似性是0.5202。
[0093] 步骤3.2:计算邻居节点j的τu值,计算公式为:
[0094]
[0095] 参数τu表示具有某一特征值的邻居节点数在与持有数据包的节点相遇的全部节点的总数中所占的比例,Nuk表示的是兴趣u中具体为k的相遇个数,Lu指的是第j种兴趣的个
数。持有数据包D的节点i会收到所有邻居节点发来的历史相遇记录表,数据包D的兴趣向量
节点i根据数据包D和它的邻居节点们的历史相遇记录表来
计算它们的兴趣相似度。
[0096] 步骤3.3:计算邻居节点j和所要发送的数据包的兴趣相似度ηj,D,计算公式为:
[0097]
[0098] 其中,r是指整个网络共有不同兴趣总数,αu是兴趣u的权重,并且
[0099] 相似度ηj,D值越高,表示该邻居节点与所要发送的数据包的兴趣更相关。因此,如果采用该邻居节点作为中继节点,那么就更可能遇到对该数据包感兴趣的其它节点,这在
一定程度上提高了数据包D的投递率。
[0100] 步骤3.4:判断每个邻居节点j和所发送数据包的相似度值是否超过阈值δ1,如果超过,则将二元组(j,1)加入到候选节点集合,否则计算节点i与节点j之间的转发程度函数
[0101] 步骤3.5:计算邻居节点j的转发程度值
[0102] 通过计算邻居节点j和持有数据包的节点i的转发程度函数 来判断邻居节点j是否有能力帮助节点i转发数据包,转发程度函数 计算公式为:
[0103]
[0104] 其中,ei、ej分别表示节点i和节点j的节点的剩余能量,ηi,D,ηj,D分别是节点i与数据包的相似度和节点j与数据包的相似度。α是一个固定的参数,用于调节数据包与节点相似度和节点能量在转发程度函数中各自所占的比例。
[0105] 步骤:3.6:判断节点j的转发程度值 是否大于阈值δ2。
[0106] 如果节点j的转发程度值 大于阈值δ2,计算转发的副本数εj,并将二元组(j,εj)加入到集合S中,否则节点i不转发数据包给节点j。
[0107] 副本数εj的计算公式为:
[0108]
[0109] 其中,k表示节点i持有的数据包的副本数,n表示符合转发条件邻居结点的个数,σi表示节点i的度,公式为:
[0110]
[0111] 1/λij表示节点i和节点j之间的相遇时间间隔,1/λij越小,表明节点i和节点j之间的相遇频繁度越大,它们之间传输的数据包时会有更少的传输延迟。
[0112] 以下,对为了确认本发明得到的效果而实施的实验例进行说明。
[0113] 实验例1,持有数据包的节点具有多个数据包需要发送,且当前邻居节点有多个:
[0114] 设节点A有三个数据包据需要发送,持有的数据包D1是a类型数据包,生存时间为0,数据包D2是b类型数据包,生存时间为3h,数据包D3是b类型数据包,生存时间为1h,生存
时间的单位是小时。节点A的当前邻居有:节点B,节点C和节点E,节点A的度是20,节点B的度
是30,节点C的度是50,节点E的度是60,单位是个/秒。按照本发明数据包的分发方式,具体
实施方式如下:
[0115] 1)节点A判断自身是否有数据包需要发送,如果有数据包需要发送,则进行下一步,否则,节点A等待直到与其他节点相遇;
[0116] 2)计算得节点A的数据包D1的优先级是2,数据包D2的优先级是0.25,数据包D2的优先级是0.5。节点A按照优先级的大小排序数据包形成数据包队列。节点A要发送的数据包
队列中取出优先级最高的数据包D1,计算周围邻居节点中含有数据包D1的个数在总的邻居
节点中的比例为0.3,没有超过阈值δ3,δ3的值为0.8,将D1的副本数初始值为k=10;
[0117] 3)节点A根据当前邻居的兴趣历史记录表及数据包D1的兴趣向量,计算每个邻居与数据包D1的相似度。节点A的当前邻居有节点B,节点C和节点E,节点A分别计算数据包D1
和它们的相似度的值,即ηB,D1,ηC,D1,ηE,D1,计算得ηA,D=0.80,ηB,D1=0.55,ηC,D1=0.50,ηE,D1=0.32;
[0118] 4)对于当前所有的邻居节点和数据包D1的相似度的值ηB,D1,ηC,D1,ηE,D1,节点A判断它们是否超过阈值δ1,δ1的值为0.55。比较过后发现只有节点B满足条件,对于节点B,节点A则将二元组(B,1)加入到候选节点集合S中;节点A对于节点C和节点E的转发程度函数值为节点A判断转发程度函数值是否超过阈值δ2,δ2的值为0.45,比较
过后发现只有节点B满足条件,计算得节点B的副本数值εB=3,并将二元组(C,3)加入到集
合S中;
[0119] 5)节点A判断候选节点集合S是否为空,若集合S不为空,广播数据包D1。其方式为节点A先构造数据包D1’,D1’中包含的二元组有(B,1)和(C,3)。二元组的前一个分量代表的是节点的编号,后一个分量代表的是该编号的节点接收数据包的副本数。节点A的当前邻居
节点们收到数据包D1’后,判断S中的元素的第一个分量是否含有该节点,节点B接收数据包
D1,并设置其副本数为D1;则节点C接收数据包1,并设置其副本数为3;节点E丢弃该数据包
D1;
[0120] 6)节点A更新数据包1的副本数k=6的值;
[0121] 7)判断数据包队列中是否还有未发送的数据包,本实例中还有数据包没发送,故跳转至步骤2。
[0122] 实验例2,持有数据包的节点具有1个数据包需要发送,且当前邻居节点有多个:
[0123] 设节点A持有数据包D1,节点A的当前邻居有:节点B,节点C和节点E,节点A的度是20,节点B的度是30,节点C的度是50,节点E的度是60,单位是个/秒。则按照本发明的数据包
的分发方式,具体实施方式如下:
[0124] 1)节点A判断自身是否有数据包需要发送,如果有数据包需要发送,则进行下一步,否则,节点A等待直到与其他节点相遇;
[0125] 2)节点A要发送数据包为数据包D1,计算周围邻居节点中含有数据包D1的个数在总的邻居节点中的比例为0.2,没有超过阈值δ3,δ3的值为0.8,将D1的副本数初始值为k=
10;
[0126] 3)节点A根据当前邻居的兴趣历史记录表及数据包D1的兴趣向量,计算每个邻居与数据包D1的相似度。节点A的当前邻居有节点B,节点C和节点E,节点A分别计算数据包D1
和它们的相似度的值,即ηB,D1,ηC,D1,ηE,D1,计算得ηA,D=0.80,ηB,D1=0.55,ηC,D1=0.50,ηE.D1=0.32;
[0127] 4)对于当前所有的邻居节点和数据包D1的相似度的值ηB,D1,ηC,D1,ηE,D1,节点A判断它们是否超过阈值δ1,δ1的值为0.55。比较过后发现只有节点B满足条件,对于节点B,节点A则将二元组(B,1)加入到候选节点集合S中;对于节点C和节点E,计算节点A和节点C和节点E的转发程度函数值 节点A判断转发程度函数值是否超过阈值δ2,
δ2的值为0.45,比较过后发现只有节点B满足条件,则根据公式(5)和公式(6)计算节点C的
副本数值εB=3,并将二元组(C,3)加入到集合S中。节点A放弃让节点E转发数据包D1;
[0128] 5)节点A判断候选节点集合S是否为空,若集合S不为空,广播数据包D1。其方式为节点A先构造数据包D1’,D1’中包含的二元组有(B,1)和(C,3)。二元组的前一个分量代表的是节点的编号,后一个分量代表的是该编号的节点接收数据包的副本数。节点A的当前邻居
节点们收到数据包D1’后,判断S中的元素的第一个分量是否含有该节点,节点B接收数据包
D1,并设置其副本数为1;则节点C接收数据包D1,并设置其副本数为3;节点E丢弃该数据包
D1;
[0129] 6)节点A更新数据包D1的副本数k=6的值;
[0130] 7)节点A暂时停止发送数据包,等待与其他节点相遇。
[0131] 实验例3,持有数据包的节点具有多个数据包需要发送,且当前邻居节点有1个:
[0132] 设节点A当前时刻三个数据包据需要发送,持有数据包D1是a类型数据包,生存时间0,数据包D2是b类型数据包,生存时间3h和数据包D3是b类型数据包,生存时间1h,生存时
间的单位是小时,节点A的当前邻居节点只有节点C,节点A的度是20,节点C的度是50,单位
是个/秒。则按照本发明的数据包的分发方式,具体实施方式如下:
[0133] 1)节点A判断自身是否有数据包需要发送,如果有数据包需要发送,则进行下一步,否则,节点A等待直到与其他节点相遇;
[0134] 2)节点A的数据包D1的优先级是2,数据包D2的优先级是0.25,数据包D2的优先级是0.5,节点A按照优先级的大小排序数据包形成数据包队列。节点A要发送的数据包队列中
取出优先级最高的数据包D1,计算周围邻居节点中含有数据包D1的个数在总的邻居节点中
的比例为0.3,没有超过阈值δ3,δ3的值为0.8。将D1的副本数初始值为k=10;
[0135] 3)节点A根据当前邻居的兴趣历史记录表及数据包D1的兴趣向量,计算邻居节点C与数据包D的相似度。节点A的当前邻居只有节点C,节点A分别计算数据包1和节点C的相似
度的值,即ηC.D1,计算得ηA.D=0.80,ηC,D1=0.50;
[0136] 4)对于当前邻居节点C和数据包D1的相似度的值ηC.D1,节点A判断它们是否超过阈值δ1,δ1的值为0.55。比较过后发现只有节点C不满足条件,节点A和节点C的转发程度函数值节点A判断转发程度函数值是否超过阈值δ2,δ2的值为0.45,比较过后发现节
点C满足条件,计算得节点B的副本数值εB=3,并将二元组(C,3)加入到集合S中;
[0137] 5)节点A判断候选节点集合S是否为空,若集合S不为空,广播数据包D1,其方式为:节点A先构造数据包D1’,D1’中包含的二元组(C,3),二元组的前一个分量代表的是节点的
编号,后一个分量代表的是该编号的节点接收数据包的副本数;节点A的当前邻居节点C收
到数据包D1’后,判断S中的元素的第一个分量是否含有该节点,节点B接收数据包D1,并设
置其副本数为1,则节点C接收数据包D1,并设置其副本数为3;
[0138] 6)节点A更新数据包D1的副本数k=6的值;
[0139] 7)判断数据包队列中是否还有未发送的数据包,本实例中还有数据包没发送,故跳转至步骤2)。
[0140] 实验例4,持有数据包的节点A具有1个或者多个数据包需要发送,且当前无邻居节点,则节点A等待直到和其他节点相遇。