`
xuluan
  • 浏览: 11300 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

分槽ALOHA协议仿真

阅读更多

    Aloha:夏威夷人问候语,欢迎,再见。它还有另一层意思,是‘I love you’。当然这是根据语境来分析的,如果没有语境分析,我想它也不会存在那么多意思。表达'I love you'的时候,Aloha发音要延长点,a....lo...ha。大家可以试试。好了,还是回归正题吧。Aloha协议是什么?它可以解决什么样的问题?

    Aloha协议是分配一个多路访问信道的协议,而要解决的问题当然也就是它的目的,怎么分配信道才能使网络带宽利用率更高,网络延迟更低。

    Aloha协议有两种:纯Aloha协议和分槽Aloha协议。

    Aloha协议:当用户有数据需要发送时就传输。显然,这种协议在单路信道上很容易发生冲突。当两个或多个用户需要发送数据时,冲突就发生了,然后他们都需要开始重传,直到没有冲突发生。这种协议的效率会如何呢?现在我们假定每个站产生的新帧可以模型化为一个平均每帧时产生N个帧的泊松分布。如果不期望发生冲突,就需要期望N不大于1。不然N大于1,肯定有多个站在一个帧时内同时发送,这就会导致冲突,然后信道效率也就会开始降低。



 

       如图,我们可知道,如果在t0~t0+2t时间段内,除了阴影帧外还有其它帧产生的话就会发生冲突。即易受冲突的时间为2t。

在给定一个帧时内,我们期望有G帧,而每帧时期望生成k帧的概率服从泊松分布:

    一帧时内生成0帧的概率为。两帧时内生成0帧的概率为。根据上面的图可知,如果两帧时内生成0帧,那么就可以成功传输一帧。从而可知信道利用率。可以计算出来,G=0.5时,信道利用率最高为S=1/2e=0.184。(求导可得解)

  分槽Aloha协议:将时间划分为时间槽,每个站只能在时间槽开始的时候发送数据。这样,易受冲突时间就会从原来的2t变为t,传送成功率增长了一倍变为。相应的,信道利用率S也增长了一倍变为0.368。

    概念性的问题差不多就这些了,对了,还差个仿真的概念。什么是仿真?仿真就是模拟实际,而实际当中的变化又无从可知,所以仿真就需要建立在一定事实基础上再进行随机化实验。总之就一句话,随机实验。

   下面重点分析下Aloha分槽协议仿真。

   实验环境:win8系统 、eclipse开发环境、java语言编写

   实验重点:模拟时间槽划分时间,判断每个时间槽有几个帧。时间槽可以用整数变量来操控,其它每个·站发送数据的时间也可以用整数代替。判断一个时间槽有几个帧,可以先对每个站发送数据的时间从小到大排序,然后再根据时间槽的范围,判断有几个站在这个时间槽发送数据。如果有两个或以上的站发送数据,那么相应站就再随机产生发送时间,记录此时有多少个帧;如果只有一个,那么就发送成功,成功发送帧数+1。如果为0帧,就继续下一个时间槽。重复以上步骤,直到成功发送数据到达预期的值。

   源码:

Data.java

 

public class Data {
	
	public int time;
	
	public Data(int time){
		this.time = time;
	}
	
	public void set(int time){
		this.time = time;
	}
}

Aloha.java

 

 

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;

public class Aloha extends JFrame{
	//站点基数为1
	public static int base = 1;
	//站点总数
	public int MaxStation;
	//时间段需要设置比较长,不然每个时间槽的冲突的可能很大,也就无法仿真了
	public final int randTime = 1000;
	//successPost越大,越接近真实情况,曲线也越清晰
	private int successPost = 1000;
	//时间槽大小
	public final int time = 2;
	//帧的总数
	public int countPoint = 0;
	//站队列
	private List<Data> list;
	//画布
	private Graphics g;
	
	//设置最大发送站点数
	public void setNum(int num){
		this.MaxStation = num;
	}
	
	//仿真函数
	public void GetStatus() {
		Random r = new Random();
		int total = 0;
		int success = 0;
		list = new ArrayList<Data>();
		
		//随机产生站点发送数据时间
		for (int i = 0; i < MaxStation; i++) {
			Data d = new Data(r.nextInt(randTime)+1);
			list.add(d);
		}
		
		//发送时间排序
		Comparator<Data> comparator = new Comparator<Data>() {
			public int compare(Data d1, Data d2) {					
					return d1.time - d2.time;
			}			
		};		
		Collections.sort(list,comparator);
		
		int count = 0;			//记录经历过的时间周期
		while(true){			
			int temcount = 0;	//记录每个时间槽发送帧的次数
			for(int i = 0; i < MaxStation; i++){
				if(list.get(i).time >= count * time && list.get(i).time <= (count+1)*time){
					total += 1;
					temcount += 1;
				}else{
					break;
				}
			}
			count++;
			if(temcount == 0){	//没有帧
				//continue;
			}else if(temcount == 1){	//成功发送数据
				success += 1;
				list.get(0).set(r.nextInt(randTime)+1+count*time);
				if(success > successPost){
					break;
				}
			}else if(temcount > 1){		//冲突,在随机产生发送数据时间
				for(int j = 0; j < temcount; j++){
					list.get(j).set(r.nextInt(randTime)+1+count*time);
				}
			}
			Collections.sort(list,comparator);
		}
		drawPoint((int)((1.0 * total/count)* 70 + 100), (int)(400-(10.0 * success/count)*29));
//		System.out.println("每包时的尝试次数:"+(1.0 * total/count));
//		System.out.println("吞吐量:"+(1.0*success/count));			
	}

	public static void main(String[] args) {
		Aloha aloha = new Aloha();
		aloha.initUI();     //初始化UI
		int i = 0;
		while(true){
			i++;
			aloha.setNum(base*i);	//增加站点数
			aloha.GetStatus();
		}
	}
	
	public void paint(Graphics g){
		super.paint(g);
		draw(g);
	}
	//初始化界面
	public void draw(Graphics g){
		g.setColor(Color.RED);
		g.drawLine(100, 400, 500, 400);
		g.drawLine(100,100,100,400);
		g.drawString("0", 90, 405);
		
		for(int i = 1; i <= 5; i++){
			g.drawString("|", 100+70*i, 398);
			g.drawString(i+"", 100+70*i, 413);
		}
		g.drawString("G(每包时尝试次数)", 260,430);
		
		
		for(int i = 1; i <= 10; i++){
			g.drawString("-", 100 , 400-29*i);
			if(i != 10){
				g.drawString("0."+i, 80 , 400-29*i);
			}else{
				g.drawString(i/10+".0", 80 , 400-29*i);
			}
		}		
		int Stringx = 60;
		int Stringy = 180;
		g.drawString("每", Stringx, Stringy);
		g.drawString("包", Stringx, Stringy+14);
		g.drawString("时", Stringx, Stringy + 14*2);
		g.drawString("的", Stringx, Stringy + 14*3);
		g.drawString("吞", Stringx, Stringy + 14*4);
		g.drawString("吐", Stringx, Stringy + 14*5);
		g.drawString("量", Stringx, Stringy + 14*6);
		g.drawString("S", Stringx, Stringy + 14*7+10);
		g.setColor(Color.BLACK);
	}
	
	//话点
	public void drawPoint(int x,int y){
		g.drawLine(x, y, x, y);
	}
	
	//初始化界面参数
	public void initUI(){
		FlowLayout f1 = new FlowLayout();
		this.setTitle("Aloha协议");
		this.setLayout(f1);
		this.setSize(640,480);
		this.setResizable(false);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
		this.g = this.getGraphics();
	}
}


    效果截图:

 

 

    可以看出,分槽Aloha协议信道利用率可以达到0.368左右。但是,我们远不满足这样的一个利用率,效率太低。后来的CSMA协议,可以到达到更高的效率。尤其是0.01-坚持CSMA,它的效率可以接近100%。有兴趣的可以了解下,我就不在此细说了。

  • 大小: 34.2 KB
0
0
分享到:
评论

相关推荐

    分槽ALOHA协议仿真实验MATLAB代码

    本实验通过MATLAB代码实现了ALOHA协议的仿真,通过对发送周期、发送概率等参数的设置,以及对成功率、吞吐量等关键性能指标的计算,帮助我们更好地理解和掌握ALOHA协议的工作原理及其在网络通信中的应用。...

    ALOHA.rar_ALOHA_ALOHA MATLAB_Aloha协议仿真_npcsma_npcsma仿真

    《ALOHA协议仿真在MATLAB环境中的应用与解析》 ALOHA协议,作为最早的随机访问协议之一,被广泛应用于无线通信系统和网络中,尤其是低数据速率和简单网络结构的场景。本文将深入探讨ALOHA协议的两种主要形式——...

    MAC子层层协议仿真包括ALOHA, CSMA

    相比之下,分槽ALOHA将时间划分为固定长度的时隙,节点必须在时隙的开始发送,这样可以减少冲突,提高效率。然而,它仍然不能完全避免碰撞,因为多个节点可能会选择同一个时隙发送。 接着,我们来看看CSMA(载波...

    【通信仿真】Aloha协议仿真含Matlab源码.zip

    在这个项目中,"【通信仿真】Aloha协议仿真含Matlab源码.zip"很可能包含了一个Matlab程序,用于模拟Aloha协议的工作机制。这个程序可能包括以下部分: 1. 用户生成:模拟多个用户随机或定时生成数据包。 2. 发送...

    网络仿真-分隙ALOHA曲线

    分隙ALOHA是对基本ALOHA协议的一种改进,基本ALOHA协议允许所有用户在任意时间点尝试发送数据,这可能导致冲突,因为多个用户可能同时传输。分隙ALOHA则将时间划分为固定长度的时隙,每个用户只能在预定义的时隙内...

    aloha.rar_Aloha 仿真协议_OPNET 无线Aloha_aloha基于opnet_mac协议_opnet alo

    总结来说,基于OPNET的Aloha协议仿真是一项深入理解无线网络性能的重要实践。通过对Aloha协议的建模与仿真,我们可以揭示其在无线环境中的工作原理,优化参数以提高网络效率,并为其他更复杂的多址接入协议打下基础...

    aloha算法仿真实验

    "aloha算法仿真实验" ...本实验旨在通过仿真来比较Aloha算法和CSMA算法的性能,并对每个协议的工作原理进行分析。通过仿真结果的分析,我们可以更好地理解这些协议的优缺点,并对其进行改进和优化。

    OPNET s_aloha仿真

    S-ALOHA(Slotted Aloha)是对基本ALOHA协议的一种改进,其核心在于引入了时间分槽的概念。在标准ALOHA中,多个用户可能在同一时刻发送数据,导致冲突。而在S-ALOHA中,时间被划分为固定长度的时隙,用户在预设的...

    Aloha系统MATLAB仿真代码

    Aloha系统是一种古老的随机接入协议,最早应用于卫星通信,现在也被广泛研究于无线网络和物联网。MATLAB作为强大的数值计算和仿真工具,是实现Aloha系统仿真理想的平台。本篇文章将深入探讨Aloha系统的基本原理以及...

    Matlab实现ALOHA协议111

    《Matlab实现ALOHA协议详解》 在无线通信领域,ALOHA协议是一种基本的随机接入协议,常用于卫星通信、移动通信等系统中。本文将深入探讨如何使用MATLAB2019a实现ALOHA协议,并适用于本科及硕士级别的教研学习。 一...

    Aloha matlab

    java编译的Aloha 分槽的Aloha仿真协议 纯Aloha

    MAC协议:ALOHA协议的MATLAB仿真程序

    本篇文章将深入探讨ALOHA协议及其在MATLAB环境下的仿真。 ALOHA协议分为两种基本类型:纯ALOHA(Pure ALOHA)和时隙ALOHA(Slotted ALOHA)。纯ALOHA允许设备在任何时候发送数据,而时隙ALOHA则规定设备只能在预定...

    网络仿真-纯ALOHA曲线

    它可以帮助我们理解在不同负载下,纯ALOHA协议的性能表现。 在纯ALOHA网络中,假设每个时间单位内,节点发送数据帧的概率为λ,且所有节点的发送行为是独立的。根据泊松过程的特性,一个时间间隔内生成K个帧的概率...

    Aloha_AlohaPython_

    这个"Aloha"压缩包文件可能包含了实现上述功能的Python脚本,通过这些脚本,我们可以学习如何用Python进行网络仿真的基础知识,以及理解Aloha协议的工作原理。通过分析源代码,我们可以学习到如何用Python处理随机...

    Slotted-Aloha:通信网中的时隙aloha系统仿真-java

    总的来说,通过Java实现时隙Aloha系统的仿真,不仅可以帮助我们深入理解这个经典的多址接入协议,还可以提供一个实践编程技巧和设计模式的平台。同时,这也是研究分布式系统、网络通信和并发处理的一个实例,对于...

    An Improved Algorithm of Slotted-ALOHA based on.zip

    总的来说,这篇论文提出的改进算法通过智能预测和动态调整,提高了槽位ALOHA协议的效率,降低了冲突,提升了服务质量,对于优化无线通信网络的性能具有重要的理论和实践价值。在未来的研究中,可以进一步探索如何将...

    ALOHA防碰撞算法_matlab代码

    在这个项目中,"ALOHA防碰撞算法_matlab代码"提供了一个利用MATLAB实现ALOHA协议的示例。通过这个模拟器,我们可以对ALOHA算法的性能进行深入的理解和分析。 1. **吞吐量**:吞吐量是衡量网络性能的关键指标,表示...

Global site tag (gtag.js) - Google Analytics