②消息ttl到后,节点会删除消息
③消息传到一半,连接断开时,传向的节点会删除不完整的消息,即aborted。
DirectDeliveryRouter; 只有当碰到目的节点才会传送消息。
EpidemicRouter; 将消息传给碰到的每一个节点。
EpidemicOracleRouter; 这是个开挂的EpidemicRouter,一旦消息传送到目的节点,所有其他节点上的消息都会被删除。而且一旦有消息可以被传输,路由就会将这个消息瞬间传输完成。
EnergyAwareRouter; 考虑节点能量是有限的EpidemicRouter,需要设置节点的初始能量。每次发送消息,扫描节点时都会耗损能量。
FirstContactRouter; 将消息传送给碰到的第一个节点,并且传送完后,源节点删除消息。
以下从这个网址copy来
MaxPropRouter:MaxProp :利用路径历史信息对消息按照优先级排序转发消息,并且在网络内泛洪ACK(acknowledgement)以移除网络中过时的信息,同时避免同一数据包被同一节点接收两次。
MaxPropRouterWithEstimation:利用历史信息和估算方法的路由。
PROPHET(probabilistic routing protocol using history of encounters and transitivity)是一种基于概率策略的路由协议,利用节点间相遇(encounter)的历史信息和传递性(transitivity)来选择下一跳节点。
ProphetRouterWithEstimation:基于概率和估算方法的路由策略。
SprayAndWaitRouter:由两个阶段组成:SPRAY 阶段和WAIT 阶段.在SPRAY 阶段,源节点要传输的消息被复制为L 个,并转发到L 个不同的中继节点;在WAIT阶段,L 个中继节点各自进行直接传输(direct transmission),直至把消息传输至目的节点。
One1.4在包routing下定义了几种路由算法的实现。超类MessageRouter.java中定义了具体路由算法的实现所必须的方法集合,通过在继承自MessageRouter.java的类中重写而实现不同的路由算法。这些方法有:
(
这里顺便说明几个重要的成员变量:
/** Setting value for random queue mode 为随机队列模式设置值*/
public static final int Q_MODE_RANDOM = 1; /** Setting value for FIFO queue mode 为先进先出队列模式设置值*/ public static final int Q_MODE_FIFO = 2;/*这里说明下,消息队列有两种方式:一种是先进先出;一种随机队列方式,即每次发送消息后,都将消息的顺序(也即消息在数据结构的排列次序)打乱,以模仿消息发送的随机性*/
/** applications attached to the host 连接到本机上的主机集合*/
private HashMap<String, Collection<Application>> applications = null;)
//用来更新本机与其他主机传输状态,在每种路由算法的类中都会被重写,是路由实现的核心方法
public void update(){//两个循环遍历所有有连接的主机对
for (Collection<Application> apps : this.applications.values()) { for (Application app : apps) { app.update(this.host); } } }//传输消息,注意这里默认的是传输消息的副本
public void sendMessage(String id, DTNHost to) {... }
//改变连接状态
public abstract void changedConnection(Connection con);
//获取消息
protected Message getMessage(String id) {... }
//判断消息是否存在
protected boolean hasMessage(String id) {... }
//消息已经被目的主机接收时,返回真
protected boolean isDeliveredMessage(Message m) {... }
//获取该路由下的消息集,需要注意的是,如果在该消息集在使用时会存在删除的情景,那么消息集在使用时应该用其拷贝,以防止发生同时修改异常
public Collection<Message> getMessageCollection() {... }
//获取该路由下的消息数目
public int getNrofMessages() {... }
//获取缓冲区大小
public int getBufferSize() {... }
//获取可用缓冲区大小
public int getFreeBufferSize() {... }
//获取主机
protected DTNHost getHost() {... }
//发送消息
public void sendMessage(String id, DTNHost to) {... }
//获取准备就绪的传送消息,在超类中默认是所有都不可传输,子类中需根据算法需要来重写
public boolean requestDeliverableMessages(Connection con) {
return false; // default behavior is to not start -- subclasses override }//接收消息,超类中默认在任何时候都接收,子类在实现时根据自己的算法重写
public int receiveMessage(Message m, DTNHost from) {
...
return RCV_OK; // superclass always accepts messages }//设置消息为“已传输”,需要注意的是,只有消息在成功传输给下一个节点后,才设置此状态
public Message messageTransferred(String id, DTNHost from) {... }
//向消息的发送端的缓冲区写入一个消息,如果缓冲区中存在两个同名的消息,则根据主机ID来区分
protected void putToIncomingBuffer(Message m, DTNHost from) {
this.incomingMessages.put(m.getId() + "_" + from.toString(), m); }//从消息的发送端的缓冲区删除一个消息
protected Message removeFromIncomingBuffer(String id, DTNHost from) {
return this.incomingMessages.remove(id + "_" + from.toString()); }//判断指定消息是否为当前到来的消息
protected boolean isIncomingMessage(String id) {
return this.incomingMessages.containsKey(id); }//向缓冲区中加入一个消息
protected void addToMessages(Message m, boolean newMessage) {... }
//从缓冲区中删除一个消息
protected Message removeFromMessages(String id) {... }
//消息传输终止函数
public void messageAborted(String id, DTNHost from, int bytesRemaining) {... }
//创建一个新消息
public boolean createNewMessage(Message m) {... }
//删除一个消息
public void deleteMessage(String id, boolean drop) {... }
//此函数用于将给定的消息集合重新排序
@SuppressWarnings(value = "unchecked") /* ugly way to make this generic */
protected List sortByQueueMode(List list) {... } //消息比较函数,为上面的排序算法服务protected int compareByQueueMode(Message m1, Message m2) {... }
//获取路由信息
public RoutingInfo getRoutingInfo() {... }
//添加新的连接主机
public void addApplication(Application app) {... }
//获取连接主机集合
public Collection<Application> getApplications(String ID) {... }