数据通信与计算机网络课程设计.docx

上传人:b****6 文档编号:14150195 上传时间:2023-06-21 格式:DOCX 页数:31 大小:1.02MB
下载 相关 举报
数据通信与计算机网络课程设计.docx_第1页
第1页 / 共31页
数据通信与计算机网络课程设计.docx_第2页
第2页 / 共31页
数据通信与计算机网络课程设计.docx_第3页
第3页 / 共31页
数据通信与计算机网络课程设计.docx_第4页
第4页 / 共31页
数据通信与计算机网络课程设计.docx_第5页
第5页 / 共31页
数据通信与计算机网络课程设计.docx_第6页
第6页 / 共31页
数据通信与计算机网络课程设计.docx_第7页
第7页 / 共31页
数据通信与计算机网络课程设计.docx_第8页
第8页 / 共31页
数据通信与计算机网络课程设计.docx_第9页
第9页 / 共31页
数据通信与计算机网络课程设计.docx_第10页
第10页 / 共31页
数据通信与计算机网络课程设计.docx_第11页
第11页 / 共31页
数据通信与计算机网络课程设计.docx_第12页
第12页 / 共31页
数据通信与计算机网络课程设计.docx_第13页
第13页 / 共31页
数据通信与计算机网络课程设计.docx_第14页
第14页 / 共31页
数据通信与计算机网络课程设计.docx_第15页
第15页 / 共31页
数据通信与计算机网络课程设计.docx_第16页
第16页 / 共31页
数据通信与计算机网络课程设计.docx_第17页
第17页 / 共31页
数据通信与计算机网络课程设计.docx_第18页
第18页 / 共31页
数据通信与计算机网络课程设计.docx_第19页
第19页 / 共31页
数据通信与计算机网络课程设计.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据通信与计算机网络课程设计.docx

《数据通信与计算机网络课程设计.docx》由会员分享,可在线阅读,更多相关《数据通信与计算机网络课程设计.docx(31页珍藏版)》请在冰点文库上搜索。

数据通信与计算机网络课程设计.docx

数据通信与计算机网络课程设计

第一部分数据通信与计算机网络课程设计(要求)

一、课程设计的性质、目的和任务

性质:

独立设课

目的和任务:

1、掌握数据通信和计算机网络的基本原理

2、掌握数据通信和计算机网络设计、分析和实现方法

3、提高学生编制网络通信程序、网络应用服务程序的能力

二、课程设计的基本内容和要求

基本内容:

网络数据通信的基本方法及实现。

基本要求:

根据选定的项目,课题小组成员认真查阅相关资料,发挥学生的主体作用,提出设计方案,老师参与,进行讨论和分析,最终确定设计方案。

在此基础上,合理分工,协同完成项目的设计与实现,最后完成课程设计的报告撰写。

三、课程设计的内容学时安排

序号

实验项目

学时分配

实验类型

每组人数

内容提要

1

ARP协议数据包的捕获解析设计与实现

1周

设计性

3-6人

通过本实验,掌握网络协议数据包捕获和解析编程的技术

2

基于Socket的在线数据传输设计与实现

1周

设计性

3-6人

基于Socket套接口,实现通信双方的在线键盘数据传输服务。

目的使学生掌握网络在线数据交换的设计方法。

3

基于Socket的文件传输服务(FTP)设计与实现

1周

设计性

3-6人

基于Socket套接口,实现文件数据传输服务。

目的使学生掌握文件传输服务的设计方法。

4

基于Socket的HTTP文件传输服务设计与实现

1周

设计性

3-6人

基于Socket套接口,实现HTTP文件数据传输服务。

目的使学生掌握Web网络服务的设计方法。

5

基于Socket的Telnet服务设计与实现

1周

设计性

3-6人

基于Socket套接口,实现Telnet服务。

目的使学生掌握远程登录网络访问服务的设计方法。

6

滑动窗口协议的模拟

1周

设计性

3-6人

通过实现对于滑动窗口协议的模拟,加深对滑动窗口协议的理解。

7

简单的端口扫描

1周

设计性

3-6人

实现一个扫描器,必须能够完成以下所有功能:

使用TCPconnect、TCPSYN和TCPFIN进行端口扫描,使用ICMPecho扫描实现IP扫描。

并把扫描得知的结果记录下来。

注:

一、滑动窗口协议的模拟

1关于滑动窗口,请阅读网络教材(实现—选择性重发);

2运行时启动两个线程client和server。

其中sever初始应该为监听状态;

3可指定滑动窗口数目m(m=2n,n为大于1的整数)和要发送的帧总数,停等的超时时间间隔以及发送类型(正常发送,即没有缺帧和错序发送帧的现象),发送速率等参数;

4client向server发起连接,成功则转入5;

5client端发出帧,帧的内容可同序号或者为“111”“222”…“aaa”“bbb”…或者是一段文章中的部分内容;

6选择发送类型为“缺帧”,模拟因网络拥塞造成丢帧的情况,开始发送情况同“正常发送”的情况。

不同的是在帧x发送前用户可以选择丢失,则客户端继续接收帧x+1,x+2…并且对帧x+1,x+2…发出确认并缓存该帧;

7服务器端等待一段相当长的时间(超时),重发帧x;

8选择发送类型为“错序发送”。

将一组待发送的帧按照指定(错序)顺序发送。

具体实现同“缺帧”情况;

9以上各种情况下,client和server窗口中应实时显示帧的发送和接受情况,包括序号,到达时间,内容等。

以及窗口的填充和清空情况;

10使用socket编程;

11本实验要求实现的是一个简化了许多的滑动窗口协议。

对于所有包,在生成序列号后进行发送。

接收方为每个包设定一个定时器,记录包的到达情况。

如发送方发送速度过快,或某包定时器超时,则发送方应重发。

接受方窗口满时,接受到的包应被拷贝至硬盘(以下部分可以自由设计,仅做参考)。

12主要的数据结构:

包:

classpacket{

protect:

intnum;//数据包的序号

cstringcontent;//数据包内容

……

//method

……

}

消息:

classmessage{

protect:

intno;//消息的序号

cstringcontent;//消息内容

intid;//消息的方向

//method

……

}

13程序主要流程

14方法:

voidcreate_windows();//模拟滑动窗口协议中发送,接受窗口

voidcreate_packet();//模拟滑动窗口协议中包

boolcreate_timer();//模拟滑动窗口协议中的定时器

intwaitfornext();//等待下一个包

voidresend();//重发

voidreceive();//数据包到达,接受数据包

voidwrite();//数据包全部到达,写入硬盘

注:

本实验主要目的是为了加深同学们对于滑动窗口协议的了解,而不是底层的网络编程。

所以在这里,“包”的概念可以是一组题为“1”、“2”、“3”等等的文件(由程序动态创建)。

如果是在两台机器上实现,其中一台机器作为发送方,另一台则是接收方,双方进行通讯。

如果接收方窗口大小为6,则当编号为7的包(文件)到达时,接受方应作相应处理,包括通知发送方暂停发送,缓存收到的包,清空滑动窗口等。

当然,对于出错的情况,比如包丢失,不按序到达等情况编程者应有所考虑,所以在模拟接收方的机器上,应提供选择待发送包序号的界面。

一个简单的选择发送包的界面如下:

15按序发送

16错序发送(包4未发送)

二、简单的端口扫描

1、基本概念

●三次握手Three-way Handshake  

 一个虚拟连接的建立是通过三次握手来实现的   

1. (B) --> [SYN] --> (A)  

 假如服务器A和客户机B通讯. 当A要和B通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接.   

注意:

 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources). 认识到这点很重要,只有当A受到B发来的SYN包,才可建立连接,除此之外别无他法。

因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不能让外部任何主机主动建立连接。

2. (B) <-- [SYN/ACK] <--(A)   

接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作.  

 注意:

 SYN/ACK包是仅SYN 和 ACK 标记为1的包.

3. (B) --> [ACK] --> (A)   

B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立。

至此,三次握手完成,一个TCP连接完成  。

 Note:

 ACK包就是仅ACK 标记设为1的TCP包. 需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位  。

 这就是为何连接跟踪很重要的原因了. 没有连接跟踪,防火墙将无法判断收到的ACK包是否属于一个已经建立的连接.一般的包过滤(Ipchains)收到ACK包时,会让它通过(这绝对不是个好主意). 而当状态型防火墙收到此种包时,它会先在连接表中查找是否属于哪个已建连接,否则丢弃该包  

●四次握手Four-way Handshake   

四次握手用来关闭已建立的TCP连接   

1. (B) --> ACK/FIN --> (A)   

2. (B) <-- ACK <-- (A)   

3. (B) <-- ACK/FIN <-- (A)   

4. (B) --> ACK --> (A)  

 

注意:

 由于TCP连接是双向连接, 因此关闭连接需要在两个方向上做。

ACK/FIN 包(ACK 和FIN 标记设为1)通常被认为是FIN(终结)包.然而, 由于连接还没有关闭, FIN包总是打上ACK标记. 没有ACK标记而仅有FIN标记的包不是合法的包,并且通常被认为是恶意的。

最常见的非法组合是SYN/FIN 包. 注意:

由于 SYN包是用来初始化连接的, 它不可能和 FIN和RST标记一起出现. 这也是一个恶意攻击。

表 3-2 TCP 状态表  

状 态 

描 述

CLOSED  

关闭状态,没有连接活动或正在进行  

LISTEN  

监听状态,服务器正在等待连接进入  

SYN RCVD  

收到一个连接请求,尚未确认

SYN SENT 

已经发出连接请求,等待确认 

ESTABLISHED

连接建立,正常数据传输状态 

FIN WAIT 1  

(主动关闭)已经发送关闭请求,等待确认

 FIN WAIT 2  

(主动关闭)收到对方关闭确认,等待对方关闭请求 

TIMED WAIT 

完成双向关闭,等待所有分组死掉

 CLOSING  

双方同时尝试关闭,等待对方确认

CLOSE WAIT

(被动关闭)收到对方关闭请求,已经确认  

LAST ACK  

(被动关闭)等待最后一个关闭确认,并等待所有分组死掉

 

●正常状态转换 

1服务器端首先执行 LISTEN 原语进入被动打开状态( LISTEN ),等待客户端连接;  

·2当客户端的一个应用程序发出 CONNECT 命令后,本地的 TCP 实体为其创建一个连接记录并标记为 SYN SENT 状态,然后给服务器发送一个 SYN 报文段;  · 

3服务器收到一个 SYN 报文段,其 TCP 实体给客户端发送确认 ACK 报文段同时发送一个 SYN 信号,进入 SYN RCVD 状态;  

·4客户端收到 SYN + ACK 报文段,其 TCP 实体给服务器端发送出三次握手的最后一个 ACK 报文段,并转换为 ESTABLISHED 状态;  

· 5服务器端收到确认的 ACK 报文段,完成了三次握手,于是也进入 ESTABLISHED 状态。

  

在此状态下,双方可以自由传输数据。

当一个应用程序完成数据传输任务后,它需要关闭 TCP 连接。

假设仍由客户端发起主动关闭连接。

  

6客户端执行 CLOSE 原语,本地的 TCP 实体发送一个 FIN 报文段并等待响应的确认(进入状态 FIN WAIT 1 );  

·7服务器收到一个 FIN 报文段,它确认客户端的请求发回一个 ACK 报文段,进入 CLOSE WAIT 状态;  

· 8客户端收到确认 ACK 报文段,就转移到 FIN WAIT 2 状态,此时连接在一个方向上就断开了;  

· 9服务器端应用得到通告后,也执行 CLOSE 原语关闭另一个方向的连接,其本地 TCP 实体向客户端发送一个 FIN 报文段,并进入 LAST ACK 状态,等待最后一个 ACK 确认报文段;  

· 10客户端收到 FIN 报文段并确认,进入 TIMED WAIT 状态,此时双方连接均已经断开,但 TCP 要等待一个 2 倍报文段最大生存时间 MSL ( Maximum Segment Lifetime ),确保该连接的所有分组全部消失,以防止出现确认丢失的情况。

当定时器超时后, TCP 删除该连接记录,返回到初始状态( CLOSED )。

  · 

11服务器收到最后一个确认 ACK 报文段,其 TCP 实体便释放该连接,并删除连接记录,返回到初始状态( CLOSED )。

2、几种扫描的原理

●TCPconnect()扫描:

这是最基本的TCP扫描。

操作系统提供的connect()系统调用,用来与每一个感兴趣的目标计算机的端口进行连接。

如果端口处于侦听状态,那么connect()就能成功。

否则,这个端口是不能用的,即没有提供服务。

这个技术的一个最大的优点是,你不需要任何权限。

系统中的任何用户都有权利使用这个调用。

另一个好处就是速度。

如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,你可以通过同时打开多个套接字,从而加速扫描。

使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。

●TCPSYN扫描:

这种技术通常认为是“半开放”扫描,这是因为扫描程序不必要打开一个完全的TCP连接。

扫描程序发送的是一个SYN数据包,好像准备打开一个实际的连接并等待反应一样(参考TCP的三次握手建立一个TCP连接的过程)。

一个SYN/ACK的返回信息表示端口处于侦听状态。

一个RST返回,表示端口没有处于侦听态。

如果收到一个SYN/ACK,则扫描程序必须再发送一个RST信号,来关闭这个连接过程。

●TCPFIN扫描:

有的时候有可能SYN扫描都不够秘密。

一些防火墙和包过滤器会对一些指定的端口进行监视,有的程序能检测到这些扫描。

相反,FIN数据包可能会没有任何麻烦的通过。

这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。

另一方面,打开的端口会忽略对FIN数据包的回复。

这种方法和系统的实现有一定的关系。

有的系统不管端口是否打开,都回复RST,这样,这种扫描方法就不适用了。

这种方法在区分Unix和NT时,是十分有用的。

●ICMPEcho扫描:

使用ICMPRequest数据包来判断在一个网络上主机是否开机。

如果主机开机,则会回复ICMPEcho数据包。

否则得不到回复。

 

注释:

从上述所列的课程设计内容中,选择一个必做。

若有能力或业余时间的学生,可选择一个以上的设计内容做。

四、课程设计报告要求

写出课程设计目的,设计内容,实验环境,设计思想和实现流程,源程序、运行结果以及分析。

第二部分涉及到的概念

1、SocketforC:

2、Socketforjava:

第三部分实例

1、ftp客户端程序

代码如下:

packageftpclient;

importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.*;

import.ftp.*;

import.*;

importjava.io.*;

publicclassFtpClientFrameextendsJFrame{

JPanelcontentPane;

LabellabelPrompt=newLabel();//状态提示

LabellabelHost=newLabel();

TextFieldtextFieldHost=newTextField();//主机地址

LabellabelUser=newLabel();

TextFieldtextFieldUser=newTextField();//用户名

LabellabelPassword=newLabel();

TextFieldtextFieldPassword=newTextField();//密码

ButtonbuttonLink=newButton();//连接按钮

ButtonbuttonDisconnect=newButton();//断开按钮

LabellabelFileShow=newLabel();

TextAreatextAreaContent=newTextArea();//显示文件和目录的文本域

LabellabelFile=newLabel();

TextFieldtextFieldFile=newTextField();//要下载的文件名输入框

LabellabelDir=newLabel();

TextFieldtextFieldDir=newTextField();//保存文件的本机目录名

ButtonbuttonDownload=newButton();//下载按钮

FtpClientmyFtp=null;//FtpClient对象

TelnetInputStreaminStream=null;//输入流对象

publicFtpClientFrame(){//构造函数

try{

jbInit();//界面初始化并显示

}

catch(Exceptione){

e.printStackTrace();

}

}

//界面初始化并显示

privatevoidjbInit()throwsException{

contentPane=(JPanel)this.getContentPane();

contentPane.setLayout(null);

labelPrompt.setBounds(newRectangle(25,6,180,22));

labelHost.setText("主机名:

");

labelHost.setBounds(newRectangle(25,38,50,22));

textFieldHost.setBounds(newRectangle(78,38,280,22));

labelUser.setText("用户名:

");

labelUser.setBounds(newRectangle(25,70,50,22));

textFieldUser.setBounds(newRectangle(78,70,114,22));

labelPassword.setText("密码:

");

labelPassword.setBounds(newRectangle(205,70,37,22));

textFieldPassword.setBounds(newRectangle(244,70,114,22));

textFieldPassword.setEchoChar('*');

buttonLink.setLabel("连接");

buttonLink.setBounds(newRectangle(375,38,70,22));

buttonLink.addActionListener(newjava.awt.event.ActionListener(){

publicvoidactionPerformed(ActionEvente){

buttonLink_actionPerformed(e);

}

});

buttonLink.setEnabled(true);

buttonDisconnect.setLabel("断开");

buttonDisconnect.setBounds(newRectangle(375,70,70,22));

buttonDisconnect.addActionListener(newjava.awt.event.ActionListener(){

publicvoidactionPerformed(ActionEvente){

buttonDisconnect_actionPerformed(e);

}

});

buttonDisconnect.setEnabled(false);

labelFileShow.setText("目录列表");

labelFileShow.setBounds(newRectangle(25,105,140,22));

textAreaContent.setBounds(newRectangle(25,135,420,235));

textAreaContent.setEditable(false);

labelFile.setText("欲下载的文件名:

");

labelFile.setBounds(newRectangle(25,380,100,22));

textFieldFile.setBounds(newRectangle(128,380,230,22));

labelDir.setText("存放文件的路径:

");

labelDir.setBounds(newRectangle(25,412,100,22));

textFieldDir.setBounds(newRectangle(128,412,230,22));

buttonDownload.setLabel("下载");

buttonDownload.setBounds(newRectangle(375,412,70,22));

buttonDownload.addActionListener(newjava.awt.event.ActionListener(){

publicvoidactionPerformed(ActionEvente){

buttonDownload_actionPerformed(e);

}

});

buttonDownload.setEnabled(false);

contentPane.add(labelPrompt,null);

contentPane.add(labelHost,null);

contentPane.add(textFieldHost,null);

contentPane.add(labelUser,null);

contentPane.add(textFieldUser,null);

contentPane.add(labelPassword,null);

contentPane.add(textFieldPassword,null);

contentPane.add(buttonLink,null);

contentPane.add(buttonDisconnect,null);

contentPane.add(labelFileShow,null);

contentPane.add(textAreaContent,null);

contentPane.add(textFieldFile,null);

contentPane.add(labelFile,null);

contentPane.add(labelDir,null);

contentPane.add(textFieldDir,null);

contentPane.add(buttonDownload,null);

enableEvents(AWTEvent.WINDOW_EVENT_MASK);

this.setSize(newDimension(480,485));

this.setResizable(false);

this.setTitle("ftp客户端");

this.setVisible(true);

}

//响应“连接”按钮的点击消息,连接到服务器端

voidbuttonLink_actionPerformed(ActionEvente){

String

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 动物植物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2