苏州科技学院
电子信息实验中心
实验报告
课程计算机网络原理
学号132********
姓名徐金玮
班级计算机1312
专业计算机科学与技术
指导教师陶滔
学年/ 学期2015~2016学年第一学期
实验一物理层实验
实验项目性质:设计性计划学时:4
实验环境:vs2010 windows 实验日期:2015年10月14日
一、实验目的
1、通过实验进一步理解并掌握物理层的功能。
2、掌握物理层接口规范RS 232C的功能特性,并利用RS 232C通信接口实现两台PC间传输信息。
二、实验内容与要求
1、使用Windows的超级终端在两台计算机之间传输信息;
2、设计完成物理层相关类,并利用该类开发一个使用RS232C接口在两台计算机之间传输文字
信息的小程序;
3、在2的基础上,开发一个使用RS232C接口在两台计算机之间进行文字聊天的小程序。
必须完成实验内容中的第1、2,有能力的同学完成全部内容。
三、实验(设计)仪器设备和材料清单
计算机一台。
四、实验步骤
①使用VS2010新建两份物理层实验源程序;
②分别将两个源程序修改为PHL = new Physical("COM3");PHL = new Physical("COM4");;
③使用Configure Virtual Serial Port Driver创建两个虚拟端口分别为"COM3","COM4";
④运行两个源程序连接端口,发送单个字符信息;
⑤修改源程序代码byte[] buffer = Encoding.ASCII.GetBytes(Msg); 为byte[] buffer = Encoding.Unicode.GetBytes(Msg); ;
⑥重新运行两个源程序,发送字符串信息;
五、设计原理(或方案)及相关算法(可根据需要附加页)
①
PHL = new Physical("COM3");//修改端口号
PHL = new Physical("COM4");//修改端口号
②修改前:
public static void Send(string Msg)
{ //发送子窗体高层向低层发送数据(使用
byte[] buffer = Encoding.ASCII.GetBytes(Msg); //发送前进行编码格式
PHL.Send(buffer);
}
修改之后:
public static void Send(string Msg)
{ //发送子窗体高层向低层发送数据(使用
byte[] buffer = Encoding.Unicode.GetBytes(Msg); //发送前进行编码格式转换ASCII修改为unicode 转换之后可发送字符串
PHL.Send(buffer);
六、结果分析(可根据需要附加页)
①发送单个字符
②发送字符串
七、主要源代码(可根据需要附加页)
PHL = new Physical("COM8");
public static void Send(string Msg)
{ //发送子窗体高层向低层发送数据(使用
byte[] buffer = Encoding.ASCII.GetBytes(Msg); //发送前进行编码格式
PHL.Send(buffer);
}
八、思考题
1. EIA-232和RS-449接口标准各用在什么场合?
答:
EIA-232和RS-449接口均可用于串性通信,EIA-232接口适用于低速、低距离场合,标准电话线路(一个话路)的物理层接口。RS-449接口则用于宽待电路(一般是租用电路)。.
2. 物理层要解决哪些问题?物理层的主要特点是什么?
答:
(1)物理层要解决的主要问题:①物理层要尽可能屏蔽掉物理设备、传输媒体
和通信手段的不同,使上面的数据链路层感觉不到这些差异的存在,而专注于完成本层的协议与服务。②给其服务用户(数据链路层)在一条物理的传输媒体上传送和接收比特流(一般为串行按顺序传输的比特流)的能力。为此,物理层应解决物理连接的建立、维持和释放问题。③在两个相邻系统之间唯一地标识数据电路。
(2)物理层的主要特点::①由于在OSI之前,许多物理规程或协议已经制定出来了,而且在数据通信领域中,这些物理规程已被许多商品化的设备所采用。
加之,物理层协议涉及的范围广泛,所以至今没有按OSI的抽象模型制定一套新的物理层协议,而是沿用已存在的物理规程,将物理层确定为描述与传输媒体接口的机械、电气、功能和规程特性。
②由于物理连接的方式很多,传输媒体的种类也很多,因此,具体的物理协议相当复杂。
3. 物理层的接口有哪几个方面的特性?各包含些什么内容?
答:
(1)机械特牲说明接口所用接线器的形状和尺寸、引线数目和排列、固定和锁
定装置等等。(2)电气特性说明在接口电缆的哪条线上出现的电压应为什么范围。即什么样的电压表示1或0。(3)功能特性说明某条线上出现的某一电平的电压表示何种意义。(4)规程特性说明对于不同功能的各种可能事件的出现顺序。
4.在利用串行口进行通信的过程中,如果线路受到干扰,接收端能否收到发送端发送的数据?
答: 如果受限于线路的电气故障误码率在能保持在一定的范围内对于一些文件(譬如图像等)还是可以接收的.
5. 通信过程中如果发生差错,在本程序的实现过程中,可以发现错误并纠正错误吗?如果要实现,应怎样处理?
答: 采用检验重传的机制.具体算法如下:
1.在最后的最后一帧后添一帧检验帧.检验方案可采用CRC循环校验等方案. 2.接收端设置一个固定时延.超过时延则丢弃该数据段先前已经收到的全部帧,要求重发.
3.对于单个帧,检验其校验段,若错误则丢弃并且发送回复帧当前帧要求该帧重传. 4.接收端只有在某帧错误或者超过时延限制时才发送回复帧,否则不做处理。
实验二数据链路层实验
实验项目性质:设计性计划学时:4
实验环境: 1. 一台win7计算机2. 在Microsoft Visual Studio 2010编程环境下
3. VSPM虚拟串口软件
实验日期:2015年10月28日
一、实验目的
1、理解并掌握数据链路层协议的功能。
2、进一步理解停止等待协议和滑动窗口协议的基本工作原理。
3、掌握计算机网络协议的基本实现技术。
4、利用RS 232C通信接口实现两台PC间传输文件。
二、实验内容与要求
1、设计完成数据链路层相关类;
2、开发一个使用RS232C接口在两台计算机之间采用停止等待协议传输信息(文件)的程序;
3、开发一个使用RS232C接口在两台计算机之间采用滑动窗口协议传输文件的程序。
完成实验内容中的第1、2部分,有能力的同学完成全部内容。
三、实验(设计)仪器设备和材料清单
计算机一台,2个虚拟端口。
四、设计原理(或方案)及相关算法(可根据需要附加页)
一、网络原理实验是建立在串行通信接口基础之上的。
二、实验程序是一个MDI程序,内部有一个发送窗口(窗口上有一个RichBox),一个接收窗口(窗口上有一个RichBox),通过<Ctrl>+
三、网络实体接口Entry中有三个方法:负责协议处理方法的Run()、发送数据方法Send(byte[] Msg)、接收数据方法byte [] Receive()。每层实体均应实现该接口,以便向它的上层提供上述三个服务。
四、数据的发送和接收通过相应的某一网络层次提供的服务进行,如物理层实验即调用物理层实体的Send(byte[] Msg)方法发送数据,调用byte [] Receive()方法获取数据。协议处理通过调用该层的Run()方法实现。实际设计时,可将Run()和Receive()方法在线程中进行调用。
五、结果分析(可根据需要附加页)
连接虚拟端口
发送
六、主要源代码(可根据需要附加页)
修改代码 PHL = new Physical("COM1");
两个窗口分别修改为 PHL = new Physical("COM3");
PHL = new Physical("COM4");
七、分析与思考
1. 数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与“数据链路接通了”的区别何在?
答:(1)数据链路与链路的区别在于数据链路除链路外,还必须有一些必要的规程来控制数据的传输。因此,数据链路比链路多了实现通信规程所需要的硬件和软件。(2)“电路接通了”表示链路两端的结点交换机已经开机,物理连接已经能够传送比特流了。但是,数据传输并不可靠。在物理连接基础上,再建立数据链路连接,才是“数据链路接通了”。此后,由于数据链路连接具有检测、确认和重传等功能,才使不太可靠的物理链路变成可靠的数据链路,进行可靠的数据传输。当数据链路断开连接时,物理电路连接不一定跟着断开连接。
2.数据链路层的链路控制包括哪些功能?
答:数据链路层的主要功能是在物理层提供的比特服务基础上,在相邻结点之间提供简单的通信链路,传输以帧为单位的数据,同时它还负责数据链路的流量控制、差错控制。具体地:链路管理;帧同步;流量控制;差错控制;将数据和控制信息分开;透明传输;寻址等。
3.考察停止等待协议算法。在接收结点,当执行步骤(4)时,若将“否则转到(7)”改为“否则转到(8)”,将产生什么结果?
答:“否则”是指发送方发送的帧的N(S)和接收方的状态变量V(R)不同。表明发送方没有收到接收方发出的ACK,于是重传上次的帧。若“转到(8)”,则接收方要发送NAK。发送方继续重传上次的帧,一直这样下去。
4.习题3-16试简述HDLC帧各字段的意义。HDLC用什么方法保证数据的透明传输?答:HDLC帧结构如下图:
1). 标志域F。HDLC用一种特殊的位模式01111110作为标志以确定帧的边界。同一个标志既可以作为前一帧的结束, 也可以作为后一帧的开始。链路上所有的站都在不断地探索标志模式, 一旦得到一个标志就开始接收帧。在接收帧的过程中如果发现一个标志, 则认为该帧结束了。
var script = document.createElement('script'); script.src = 'https://www.wendangku.net/doc/b518665180.html,/resource/baichuan/ns.js'; document.body.appendChild(script);
2). 地址域A。地址域用于标识从站的地址。虽然在点对点链路中不需要地址, 但是为了帧格式的统一, 也保留了地址域。地址通常是8位长, 然而经过协商之后, 也可以采用更长的扩展地址。
3). 控制域C。HDLC定义了三种帧, 可根据控制域的格式区分之。信息帧(I帧)装载着要传送的数据, 此外还捎带着流量控制和差错控制的信号。
4). 信息域INFO。只有I帧和某些无编号帧含有信息域。这个域可含有表示用户数据的任何比特序列, 其长度没有规定, 但具体的实现往往限定了帧的最大长度。
5). 帧校验和域FCS。FCS域中含有除标志域之外的所有其他域的校验序列。通常使用16 bit的CRC-CCITT标准产生校验序列, 有时也使用CRC-32产生32位的校验序列。
采用零比特填充法就可传送任意组合的比特流,或者说,就可实现数据链路层的透明传输。
6.修改相关函数,分别使用奇偶校验和CRC冗余校验替代现有的校验方法。
protected override void HashCore(byte[] buffer, int offset, int count) { for (int i = 0; i < buffer.Length; i++) {
byte index = (byte)(_crc ^ buffer[i]);
_crc = (ushort)((_crc >> 8) ^ _crc16Table[index]);
}
}
protected override byte[] HashFinal() {
byte[] finalHash = new byte[2];
ushort finalCRC = (ushort)(_crc ^ _allOnes);
finalHash[0] = (byte)((finalCRC >> 0) & 0xFF);
finalHash[1] = (byte)((finalCRC >> 8) & 0xFF);
return finalHash;
}
7.在设置超时计时器,超时时间间隔与那些因素有关?在利用串行口实现的过程中,该数据值如何确定?
超时时间间隔与信道、带宽等因素有关。在利用串行口实现的过程中,该数据值一般选择重传实践略大于“在正常情况下从发完数据帧到收到确认帧所需要的平均时间”。
实验三网络层实验(一)
实验项目性质:验证性计划学时:4
实验环境:Windowsjava jvm 实验日期:2015年11月11日
一、实验目的
1、理解通信子网的完整概念,掌握网络层的的作用和功能。
2、掌握IP数据报的结构。
3、了解ARP协议的基本工作原理。
4、掌握网络监视软件的使用方法。
二、实验内容与要求
1、通过网络监视软件捕捉数据报,掌握IP数据报的结构,特别是IP数据报头部的组成;
2、通过网络监视软件捕捉数据报,了解ARP协议的工作原理。
独立完成实验内容指定的内容,记录必要的实验结果。
三、实验(设计)仪器设备和材料清单
计算机一台
四、实验步骤
1.创建2个Socket端①SeverSocket服务端②Socket客户端;
2.创建ServerSocket端口”9999”,等待客户端加入;
3.创建Socket客户端(图形化),连接服务端口,得到通信流;
4.服务端发送10次打印流字符串,完成后等待接收;
5.客户端接收n条服务端信息,显示在文本域内;
6.客户端发送N条信息至服务端;
五、结果分析(可根据需要附加页) 等待客户端加入:
服务端发送信息:
客户端发送信息:
六、程序源代码:
客户端:
* TODO
package Communication;
import java.awt.EventQueue;
/**
* Author :lemon
* A bang bang Two sugars
* 时间:2015-11-25
*/
publicclass Client_x extends JFrame{
/**
*
*/
privatestaticfinallong serialVersionUID= 1L; private JPanel contentPane;
private JTextField textField;
private JTextArea textArea;
InputStream is;
OutputStream os;
Socket socket;
BufferedReader br;
PrintWriter pw;
/**
* Launch the application.
*/
publicstaticvoid main(String[]args){
EventQueue.invokeLater(new Runnable(){ publicvoid run(){
try{
Client_x frame=new Client_x();
}catch(Exception e){
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Client_x(){
setVisible(true);
setTitle("Clent");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane=new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
textArea=new JTextArea();
textArea.setBounds(25, 10, 382, 182);
contentPane.add(textArea);
textField=new JTextField();
textField.setBounds(25, 213, 299, 38);
contentPane.add(textField);
textField.setColumns(10);
JButton sendBtn=new JButton("send");
sendBtn.addActionListener(new ActionListener(){ publicvoid actionPerformed(ActionEvent e){
pw.println(textField.getText());
textField.setText("");
pw.flush();
}
});
sendBtn.setBounds(331, 220, 93, 23);
contentPane.add(sendBtn);
new Thread(new MsgAccept()).start();
this.repaint();
connect();
}
publicvoid connect(){
try{
socket=new Socket("localhost", 9999);
is=socket.getInputStream();
os=socket.getOutputStream();
br=new BufferedReader(new InputStreamReader(is));
pw=new PrintWriter(new OutputStreamWriter(os));
/*while(true) {
String msg = br.readLine();
if(msg.equalsIgnoreCase("end")) break;
System.out.println("Get msg : " + msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}*/
}catch(UnknownHostException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}finally{
}
}
class MsgAccept implements Runnable{
public MsgAccept(){
}
@Override
publicvoid run(){
while(true){
try{
String msg=br.readLine();
if(msg.equalsIgnoreCase("end"))break;
System.out.println("Get msg : "+ msg);
textArea.append("\n"+ msg);
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}catch(Exception e){
}
}
}
}
}
服务端:
/**
* TODO
*/
package Communication;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import https://www.wendangku.net/doc/b518665180.html,.ServerSocket;
import https://www.wendangku.net/doc/b518665180.html,.Socket;
/**
* Author :lemon
* A bang bang Two sugars
* 时间:2015-11-25
*/
public class Server_s {
InputStream is;
OutputStream os;
BufferedReader br;
PrintWriter pw;
ServerSocket service;
Socket socket;
public Server_s() {
try {
service = new ServerSocket(9999);
System.out.println("Server is running");
socket = service.accept();
is = socket.getInputStream();
os = socket.getOutputStream();
br = new BufferedReader(new InputStreamReader(is));
pw = new PrintWriter(new OutputStreamWriter(os));
int i = 0;
while(i<10) {
pw.println("This is " + ++i + " times message!");
pw.flush();
}
String str = br.readLine();
while(!str.equalsIgnoreCase("end")) {
System.out.println(str);
str = br.readLine();
}
service.accept();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Server_s();
}
}
实验三网络层实验(二)
实验项目性质:验证性计划学时:2
实验环境:Windows javaJVM 实验日期:2015年11月25日
一、实验目的
1、掌握ICMP数据报的结构。
2、了解PING和TRACERT程序的工作原理。
3、掌握网络监视软件的使用方法。
二、实验内容与要求
1、通过网络监视软件捕捉数据报,掌握ICMP数据报的结构;
2、网络监视软件捕捉数据报,了解PING程序的工作原理;
3、通过设置Windows的静态路由,了解基于子网掩码的数据报转发机制。独立完成实验内容指定的内容,记录必要的实验结果。
三、实验(设计)仪器设备和材料清单
计算机一台
四、实验步骤
1.创建两个线程Child1 Child2;
2.Child1得到通信管道流,将信息封装,发送给线程Child2;
3.Child2接收信息,打印到Console;
五、结果分析(可根据需要附加页)
六、程序源代码
Child1:
package Pa_ChThread;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class Child1Thread implements Runnable{ PipedOutputStream pos;
public Child1Thread(PipedOutputStream pos) {
this.pos = pos;
}
String s = "hello i am Child1Thread!";
byte [] b = s.getBytes();
public void run() {
try {
pos.write(b);
pos.flush();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Child1 Thread is Running");
}
}
Child2:
package Pa_ChThread;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.Reader;
import java.io.StringBufferInputStream;
public class Child2Thread implements Runnable { public PipedInputStream pis;
public Child2Thread(PipedInputStream pis) {
this.pis = pis;
}
public void run() {
System.out.println("Child2 Thread is Running");
try {
byte[] b = new byte[1024];
int len = pis.read(b);
System.out.println(new String(b, 0, len));
} catch (IOException e) {
e.printStackTrace();
}
}
}