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%。有兴趣的可以了解下,我就不在此细说了。
相关推荐
本实验通过MATLAB代码实现了ALOHA协议的仿真,通过对发送周期、发送概率等参数的设置,以及对成功率、吞吐量等关键性能指标的计算,帮助我们更好地理解和掌握ALOHA协议的工作原理及其在网络通信中的应用。...
《ALOHA协议仿真在MATLAB环境中的应用与解析》 ALOHA协议,作为最早的随机访问协议之一,被广泛应用于无线通信系统和网络中,尤其是低数据速率和简单网络结构的场景。本文将深入探讨ALOHA协议的两种主要形式——...
相比之下,分槽ALOHA将时间划分为固定长度的时隙,节点必须在时隙的开始发送,这样可以减少冲突,提高效率。然而,它仍然不能完全避免碰撞,因为多个节点可能会选择同一个时隙发送。 接着,我们来看看CSMA(载波...
在这个项目中,"【通信仿真】Aloha协议仿真含Matlab源码.zip"很可能包含了一个Matlab程序,用于模拟Aloha协议的工作机制。这个程序可能包括以下部分: 1. 用户生成:模拟多个用户随机或定时生成数据包。 2. 发送...
分隙ALOHA是对基本ALOHA协议的一种改进,基本ALOHA协议允许所有用户在任意时间点尝试发送数据,这可能导致冲突,因为多个用户可能同时传输。分隙ALOHA则将时间划分为固定长度的时隙,每个用户只能在预定义的时隙内...
总结来说,基于OPNET的Aloha协议仿真是一项深入理解无线网络性能的重要实践。通过对Aloha协议的建模与仿真,我们可以揭示其在无线环境中的工作原理,优化参数以提高网络效率,并为其他更复杂的多址接入协议打下基础...
"aloha算法仿真实验" ...本实验旨在通过仿真来比较Aloha算法和CSMA算法的性能,并对每个协议的工作原理进行分析。通过仿真结果的分析,我们可以更好地理解这些协议的优缺点,并对其进行改进和优化。
S-ALOHA(Slotted Aloha)是对基本ALOHA协议的一种改进,其核心在于引入了时间分槽的概念。在标准ALOHA中,多个用户可能在同一时刻发送数据,导致冲突。而在S-ALOHA中,时间被划分为固定长度的时隙,用户在预设的...
Aloha系统是一种古老的随机接入协议,最早应用于卫星通信,现在也被广泛研究于无线网络和物联网。MATLAB作为强大的数值计算和仿真工具,是实现Aloha系统仿真理想的平台。本篇文章将深入探讨Aloha系统的基本原理以及...
《Matlab实现ALOHA协议详解》 在无线通信领域,ALOHA协议是一种基本的随机接入协议,常用于卫星通信、移动通信等系统中。本文将深入探讨如何使用MATLAB2019a实现ALOHA协议,并适用于本科及硕士级别的教研学习。 一...
java编译的Aloha 分槽的Aloha仿真协议 纯Aloha
本篇文章将深入探讨ALOHA协议及其在MATLAB环境下的仿真。 ALOHA协议分为两种基本类型:纯ALOHA(Pure ALOHA)和时隙ALOHA(Slotted ALOHA)。纯ALOHA允许设备在任何时候发送数据,而时隙ALOHA则规定设备只能在预定...
它可以帮助我们理解在不同负载下,纯ALOHA协议的性能表现。 在纯ALOHA网络中,假设每个时间单位内,节点发送数据帧的概率为λ,且所有节点的发送行为是独立的。根据泊松过程的特性,一个时间间隔内生成K个帧的概率...
这个"Aloha"压缩包文件可能包含了实现上述功能的Python脚本,通过这些脚本,我们可以学习如何用Python进行网络仿真的基础知识,以及理解Aloha协议的工作原理。通过分析源代码,我们可以学习到如何用Python处理随机...
总的来说,通过Java实现时隙Aloha系统的仿真,不仅可以帮助我们深入理解这个经典的多址接入协议,还可以提供一个实践编程技巧和设计模式的平台。同时,这也是研究分布式系统、网络通信和并发处理的一个实例,对于...
总的来说,这篇论文提出的改进算法通过智能预测和动态调整,提高了槽位ALOHA协议的效率,降低了冲突,提升了服务质量,对于优化无线通信网络的性能具有重要的理论和实践价值。在未来的研究中,可以进一步探索如何将...
在这个项目中,"ALOHA防碰撞算法_matlab代码"提供了一个利用MATLAB实现ALOHA协议的示例。通过这个模拟器,我们可以对ALOHA算法的性能进行深入的理解和分析。 1. **吞吐量**:吞吐量是衡量网络性能的关键指标,表示...