中南大学计算机网络实验

  • 格式:docx
  • 大小:280.91 KB
  • 文档页数:9

中南大学
计算机网络实验报告

信息科学与工程学院
实验一 分槽ALOHA协议仿真实验
用于在多路访问信道上确定下一个使用者的协议属于数据链路层的一个子层,称为介
质访问控制(Medium Access Control,MAC)子层,许多局域网都使用多路访问信道作为它
的通信基础。最简单的信道分配方案是FDM(为每个站专门分配一段频率)和TDM(为每
个站分配一个时槽),当站的数量比较大而且可变,或者流量具有突发性变化的时候,就需
要用到纯ALOHA协议或分槽ALOHA协议。如果信道的状态可以被检测到,可以用到1-坚
持型CSMA、非坚持CSMA和P-坚持CSMA等协议。本实验模拟常见的几种MAC层多路访
问协议,具体实验要求及内容如下。

【实验目的】
1. 掌握VB、VC++、VS或JAVA等集成开发环境编写仿真程序的方法;
2. 理解并掌握分槽ALOHA协议原理。

【实验内容】
编写仿真程序,对一定网络环境下MAC层的多路访问协议的分槽ALOHA协议进
行实现。通过仿真,学习协议采取的介质访问管理,包括介质分配和冲突解决机制,
并对协议的性能与理论结果进行比较分析。

【编程语言和环境】
1. 编程语言C/C++/C#/Java/Matlab等均可;
2. 编程环境Windows(MS Visual系列,VC/VB/VS.Net;)和Linux(编辑器vi+编译器
GCC)均可;

1. 仿真思路
设置各站点初始产生包的时间点及产生包的时间间隔(均为随机值),得到所有站点
成功发送10000个数据包的总时间以及这段时间内所有数据包的个数(包括各站点每
次新产生的包以及由于冲突而重发的包),从而计算出每包时内尝试次数及其对应的
吞吐量。
【具体实现(java)】
对站点的仿真:
1.设置开始发送的时间和发送的间隔:
private Random r = new Random();
// 开始发送时间
private long start;
// 时间间隔
private long d;
start = r.nextInt(1000);
d = r.nextInt(30) + 20;
2. 模拟站点发送的过程:
for (int i = 0; i < 100; i++) {
a[j.getN()] = a[j.getN()] + 1;
try {
Thread.sleep(1);
// 冲突

while (a[j.getN()] > 1) {
temp = r.nextInt(5) + 1;
Thread.sleep(temp * 20);
System.out.println(sp.getNum() + "冲
突");
}
System.out.println("发送成功:第" +
sp.getNum() + "号第" + i + "个数据包~");
Thread.sleep(sp.getD());
} catch (Exception e) {
}
}
3. 设置一个变量来记录同时发送的数据包数量,这个变量用来判断是否发生冲突。

private long t;
public void run() {
while (true) {
try {
t = t + 1;
Thread.sleep(1);
}
4. 创建六个不同的站点并启动

AlohaThread at1 = new AlohaThread(sp1, j, a);
AlohaThread at2 = new AlohaThread(sp2, j, a);
AlohaThread at3 = new AlohaThread(sp3, j, a);
AlohaThread at4 = new AlohaThread(sp4, j, a);
AlohaThread at5 = new AlohaThread(sp5, j, a);
AlohaThread at6 = new AlohaThread(sp6, j, a);
at1.start();
at2.start();
at3.start();
at4.start();
at5.start();
at6.start();

测试结果:发送完毕前的部分包的状态,每个站点模拟发送100个包。
实验三Socket通信实验

网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编
程的主流工具,Socket API是实现进程间通信的一种编程设施,也是一种为进程间提
供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。本
实验利用Socket API编写网络通信程序,具体实验要求及内容如下。

【实验目的和要求】
1. 掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法;
2. 掌握客户/服务器(C/S)应用的工作方式;
3. 学习网络中进程之间通信的原理和实现方法;
4. 理解单播、组播和广播的原理并比较其不同之处;
5. 要求本机既是客户端又是服务器端;

【实验内容】
所编写的程序应具有如下功能:
1. 具有点对点通信功能,任意客户端之间能够发送消息;
2. 具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;
3. 具有广播功能,客户端能够向所有其他成员广播消息;

【编程语言和环境】
1. 编程语言C/C++/C#/Java等均可;
2. 编程环境Windows(MS Visual系列,VC/VB/VS.Net;)和Linux(编辑器vi+编译器
GCC)均可;

【具体实现】
1. 建立服务器开辟端口
server = new ServerSocket(9922);
让服务器等待客户连接

socket = server.accept();

2. 建立连接
socket = new Socket("127.0.0.1", 9922);
3.服务器和客户端之间的通信的实现
接受信息:
DataInputStream in = new DataInputStream(
socket.getInputStream());
String accpet = in.readUTF();
输出到屏幕:
jta.append(accpet + "\n");

发送消息:
out = new DataOutputStream(socket.getOutputStream());
// 把从控制台得到的信息传送给服务器
out.writeUTF("客户端"+array.size()+":" + str);

4.一对多通信
建立链表存贮客户端信息:
ArrayList array = new ArrayList();
建立对应的链表和客户端保持连接、接收和发送消息:
ArrayList list = new ArrayList();
当需要群发时,对链表中的每个元素都发送信息:
if (s.equals("群发")) {
jta.append("Everyone:" + str + "\n");
for(int i=0;iThreadDemo th=list.get(i);
th.Send();
}

当需要单个发消息时,在链表中找到对应元素再发送:
else if(s.equals("发给:")){
//从文本框获取要发送信息的客户端的序号。
int index=Integer.parseInt(jt2.getText());
//在链表中找到对应元素
ThreadDemo th=list.get(index-1);
th.Send();//发送
jt.setText("");//清空输入框
}

程序测试:
服务器端:可以创建新用户,群发,单一发送。
客户端:可以和服务器之间进行消息传递。

发送信息:群发:
单独发给客户端4:

客户端对服务器:
备注: 源代码见附件(计算机网络实验.zip).