通信网原理1.docx
- 文档编号:17821450
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:18
- 大小:212.83KB
通信网原理1.docx
《通信网原理1.docx》由会员分享,可在线阅读,更多相关《通信网原理1.docx(18页珍藏版)》请在冰点文库上搜索。
通信网原理1
中南大学
“通信网原理”实验报告
(第1次实验)
实验名称应用层协议分析与编程实现
专业班级电子信息1002
学生姓名杨家骏
学号0909101123
指导教师陈科文
实验日期2012年12月
中南大学·信息科学与工程学院
一、实验目的和要求
1、实验目的
1 通过实验,进一步加深理解Web(WWW)、FTP、Email等常用网络应用服务的基本概念与工作原理;
2 在理解HTTP、FTP、POP3、SNMP等应用层协议设计思想的基础上,初步掌握应用层协议(如HTTP协议)的编程实现方法。
3 熟练掌握基于Socket的网络通信程序设计方法。
2、实验要求
1 不同应用层协议实现程序的具体设计要求见实验教材;实验之前应做好
充分准备工作,并预先编写好源代码;
2 上机实验时,程序必须调试成功,并接受教师验收(需边演示边讲解,并回答教师提问);
3 按要求撰写《实验报告》(参阅本指导书的附录一“实验报告内容与格式”),并按时提交报告
2、实验关键技术(包括编程环境和关键API函数简介,以及程序设计基本思想,比如要解决的关键问题、工作流程,或主要数据结构的定义、算法的描述等)
编程环境:
MicrosoftVisualStudio2010;VisualC++
关键技术:
1)VisualC++和面向对象程序设计
VC基于C,C++语言,主要由是MFC组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几乎可说VC在Windows平台无所不能。
从20世纪70年代第一次提出面向对象的概念开始,到现在面向对象技术发展成为一种比较成熟的编程思想,通过面向对象技术,可以将现实世界直接影射到对象空间,从而为系统的设计和开发带来革命性的影响。
VisualC++是一个典型的面向对象程序的设计语言,它也是目前为止功能最强、最受欢迎、应用最广泛、高效的Windows应用程序开发工具,它是在C语言基础之上发展起来的,是C语言的超集。
VisualC++是功能最为强大可视化开发工具,它不仅支持传统的软件开发方法,更重要的是它能支持面向对象、可视化的开发风格。
因此VisualC++又称作是一个集成开发工具,它提供了软件代码自动生成和可视化的资源编辑功能。
VisualC++具有的优点:
提供了面向对象的应用程序框架MFC(MicrosoftFoundationClass),简化了程序员的编程工作,提高了模块的可重用性;提供了基于CASE技术的可视化软件的自动生成和维护工具AppWizard、ClassWizard、VisualStudio、WizardBar等,实现了直观、可视的程序设计风格,方便地编和管理各种类,维护程序的源代码;封装了Windows的API函数、USER、KERNEL、GDI函数,简化了编程时创建、维护窗口的许多复杂的工作。
2)MFC
MFC,微软基础类(MicrosoftFoundationClasses),实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是WinDOS下开发人员使用的专业C++SDK(SDK,StandardSoftWareDevelopKit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包,MFC作为与VC++血肉相连的部分(注意C++和VC++的区别:
C++是一种程序设计语言,是一种大家都承认的软件编制的通用规范,而VC++只是一个编译器,或者说是一种编译器+源程序编辑器的IDE,WS,PlatForm,这跟Pascal和Delphi的关系一个道理,Pascal是Delphi的语言基础,Delphi使用Pascal规范来进行Win下应用程序的开发和编译,却不同于Basic语言和VB的关系,Basic语言在VB开发出来被应用的年代已经成了Basic语言的新规范,VB新加的Basic语言要素,如面向对象程序设计的要素,是一种性质上的飞跃,使VB既是一个IDE,又成长成一个新的程序设计语言),MFC同BC++集成的VCL一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC++专配的..
3)WINDOWSSOCKETS网络编程接口
选定WINDOWS平台开发网络通信程序,可以选择WINDOWS的SOCKETS编程接口,WindowsSockets是一套开放的、支持多种协议的Windows下的网络编程接口。
现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。
Windowssockets无疑是我们进行网络编程的利器。
所有的WindowsSockets实现都支持流套接口和数据报套接口。
应用程序调用WindowsSockets的API实现相互之间的通讯。
WindowsSockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。
它们之间的关系如下图所示:
WindowsSockets实现通讯工作的各层关系图
4)WSAAsyncSelect模型开发
WSAAsyncSelect()调用允许应用程序程序注册一个或多个感兴趣的网络事件。
这一API调用用来取代探寻网络I/O调用。
在select()或非阻塞I/O例程(例如send()和recv())已经被调用或将要被调用的情况下都可以使用WSAAsyncSelect()调用。
在这种情况下,在声明感兴趣的网络事件时,你必须提供一个通知时使用的窗口句柄。
那么在你声明的感兴趣的网络事件发生时,对应的窗口将收到一个基于消息的通知。
其过程如下图所示:
WSAAsyncSelect模型
5)TCP/IP协议、TCP协议
网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。
IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。
IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。
IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。
如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。
TCP将包排序并进行错误检查,同时实现虚电路间的连接。
TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
UDP与TCP位于同一层,但对于数据包的顺序错误或重发。
因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务.
TCP和UDP服务通常有一个客户/服务器的关系。
两个系统间的多重连接是这样相互确认并协调一致的,TCP或UDP连接唯一地使用每个信息中的如下四项进行确认:
源IP地址发送包的IP地址。
目的IP地址接收包的IP地址。
源端口源系统上的连接的端口。
目的端口目的系统上的连接的端口。
端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。
一个端口对应一个16比特的数。
服务进程通常使用一个固定的端口,例如,SMTP使用25。
这些端口号是“广为人知”的,因为在建立与特定的主机或服务的连接时,需要这些地址和目的地址进行通讯,图如下所示:
面向连接的(TCP)连接过程
6)Client/Server结构(客户机/服务器模式)
Client/Server结构(C/S结构)是大家熟知的客户机和服务器结构。
通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。
目前大多数应用软件系统都是Client/Server形式的两层结构。
C/S结构软件分为客户机和服务器两层,客户机不是毫无运算能力的输入、输出设备,而是具有了一定的数据处理和数据存储能力,通过把应用软件的计算和数据合理地分配在客户机和服务器两端,可以有效地降低网络通信量和服务器运算量。
由于服务器连接个数和数据通信量的限制,这种结构的软件适于在用户数目不多的局域网内使用。
C/S结构的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。
对应的优点就是客户端响应速度快。
缺点主要有以下几个:
只适用于局域网。
而随着互联网的飞速发展,移动办公和分布式办公越来越普及,这需要我们的系统具有扩展性。
这种方式远程访问需要专门的技术,同时要对系统进行专门的设计来处理分布式的数据。
3、实验操作过程(包括:
每一步实验内容、实验方法与中间结果,实验过程中遇到的问题及解决办法)
系统开发的总体任务是连接FTP服务器,上传/下载文件、对FTP服务器站点的管理、服务器端提供FTP服务、允许远程登录下载服务器上的文件。
功能层次图如图一所示,FTP服务器端数据流图,如图二所示
图一FTP客户端功能层次图
日志文件
图二FTP服务器端数据流图
1.建立控制连接
FTP协议在传输层采用的是TCP协议。
在FTP客户机与服务器之间通信,第一步是建立两者之间的控制连接。
首先,FTP客户机调用socket()函数建立套接字,SOCK_STREAM表示流式套接字;然后,FTP客户机填充服务器的套接字地址,其中的地址填写FTP服务器的IP地址,端口填写FTP服务器控制连接的熟知端口21。
接着,FTP客户机调用connect()函数请求与服务器建立连接;最后,FTP客户机接收与分析服务器返回的响应信息,FTP服务器可能返回的响应信息有120、220与421,只有接收的响应信息为220时,才表示这个控制连接已经成功建立,可以通过该连接来发送FTP命令。
下面给出的是建立控制连接的代码:
//建立与Winsock库的绑定
WSAStartup(MAKEWORD(2,2),&WSAData);
//创建控制连接套接字
SocketControl=socket(AF_INET,SOCK_STREAM,0);
//判断IP地址或FTP服务器名
if(m_Address为IP地址)
hostent*pHostent=gethostbyname(m_Address);
//填充服务器的套接字地址
sockaddr_inserveraddr;
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(21);
serveraddr.sin_addr.s_addr=inet_addr(m_Address);
//向FTP服务器发送建立连接请求
connect(SocketControl,(sockaddr*)&serveraddr,sizeof(serveraddr));
//从FTP服务器获得响应信息
recv(SocketControl,Respond,MAX_SIZE,0);
从响应信息中解析FTP响应码
if(FTP响应码==220)
输出FTP服务器的响应信息
2.登录FTP服务器
FTP客户机与服务器建立控制连接后,还要经过身份认证才能登录FTP服务器,这时要验证用户名与密码的正确性。
登录FTP服务器使用USER与PASS命令,它们分别用来输入用户名与密码。
USER与PASS命令是按规定顺序出现的。
FTP客户机向服务器发送USER命令,FTP服务器可能返回的响应有220、331、421、500、501与530,只有接收的响应信息为331时,才表示用户名正确并需要继续输入密码;FTP客户机向服务器发送PASS命令,FTP服务器可能返回的响应有230、332、421、500、501与530,只有接收到的响应信息为230时,才表示用户FTP客户机程序设计39名与密码均正确并成功登录。
下面给出的是登录FTP服务器的代码:
//构造标准的USER命令
memcpy(Command,"USER",strlen("USER"));
memcpy(Command+strlen("USER"),m_Account,strlen(m_Account));
//向FTP服务器发送USER命令
send(SocketControl,Command,strlen(Command),0);
//从FTP服务器获得响应信息
recv(SocketControl,Respond,MAX_SIZE,0);
从响应信息中解析FTP响应码
if(FTP响应码==331)
输出FTP服务器的响应信息
//构造标准的PASS命令
memcpy(Command,"PASS",strlen("PASS"));
memcpy(Command+strlen("PASS"),m_Password,strlen(m_Password));
//向FTP服务器发送PASS命令
send(SocketControl,Command,strlen(Command),0);
//从FTP服务器获得响应信息
recv(SocketControl,Respond,MAX_SIZE,0);
从响应信息中解析FTP响应码
if(FTP响应码==230)
输出FTP服务器的响应信息
3.列出FTP服务器目录
LIST命令用来返回当前目录中的信息,需要使用数据连接传输目录信息。
我们可以采用两种方法建立数据连接:
PORT或PASV命令。
其中,PORT方式称为主动模式,FTP客户机指定用于数据连接的端口,由FTP服务器与客户机建立连接;PASV方式称为被动模式,FTP服务器在响应信息中指出用于数据连接的端口,由FTP客户机与服务器建立连接。
在这个例子中,我们采用的是PASV方式。
在LIST命令执行完后,断开FTP客户机与服务器之间的数据连接,并且释放数据连接使用的套接字。
下面给出的是执行LIST命令的代码:
//构造标准的PASV命令
memcpy(Command,"PASV",strlen("PASV"));
//向FTP服务器发送PASV命令
send(SocketControl,Command,strlen(Command),0);
//从FTP服务器获得响应信息
recv(SocketControl,Respond,MAX_SIZE,0);
从响应信息中解析FTP响应码
if(FTP响应码==227)
分离PASV命令的应答信息
获取FTP服务器的数据端口
//创建数据连接套接字
SocketData=socket(AF_INET,SOCK_STREAM,0);
//填充数据连接套接字地址
sockaddr_inserveraddr2;
serveraddr2.sin_family=AF_INET;
serveraddr2.sin_port=htons(ServerPort);
serveraddr2.sin_addr.s_addr=inet_addr(ServerAddr);
//向FTP服务器发送建立连接请求
connect(SocketData,(sockaddr*)&serveraddr2,sizeof(serveraddr2));
//从FTP服务器获得响应信息
recv(SocketData,Respond,MAX_SIZE,0);
//构造标准的LIST命令
memcpy(Command,"LIST",strlen("LIST"));
//向FTP服务器发送LIST命令
send(SocketControl,Command,strlen(Command),0);
//从FTP服务器获得响应信息
recv(SocketControl,Respond,MAX_SIZE,0);
从响应信息中解析FTP响应码
if(FTP响应码==125、150或226)
输出FTP服务器的响应信息
//从FTP服务器获得目录信息
recv(SocketData,ListBuf,MAX_SIZE,0);
closesocket(SocketData);
//从FTP服务器获得响应信息
recv(SocketControl,Respond,MAX_SIZE,0);
if(FTP响应码==226)
输出FTP服务器的响应信息
4.退出FTP服务器
QUIT命令用于退出FTP服务器。
FTP客户机向服务器发送QUIT命令,当FTP客户机接收的响应信息为221时,表示成功退出FTP服务器。
这时,需要断开FTP客户机与服务器之间的控制连接,并且释放控制连接使用的套接字。
下面给出的是退出FTP服务器的代码:
//构造标准的QUIT命令
memcpy(Command,"QUIT",strlen("QUIT"));
//向FTP服务器发送QUIT命令
send(SocketControl,Command,strlen(Command),0);
//从FTP服务器获得响应信息
recv(SocketControl,Respond,MAX_SIZE,0);
从响应信息中解析FTP响应码
if(FTP响应码==221)
输出FTP服务器的响应信息
closesocket(SocketControl);
//解除Winsock库绑定关系
WSACleanup();
5.程序流程图
图3-10给出了FTP客户机程序流程图。
第1步,FTP客户机程序初始化用户界面;第2步,FTP客户机建立Winsock库绑定关系,并且创建控制连接与数据连接的流式套接字;第3步,FTP客户机与服务器建立控制连接,依次发送USER与PASS命令,登录到FTP服务器;第4步,FTP客户机发送PASV命令与LIST命令,建立数据连接、接收目录信息与断开数据连接;第5步,FTP客户机发送QUIT命令,断开控制连接;第6步,FTP客户机释放流式套接字,并且解除Winsock库绑定关系:
四、程序源代码(要求有良好的编程规范和必要的注释信息,完整源代码可打印并粘贴)
//stdafx.h:
标准系统包含文件的包含文件,
//或是经常使用但不常更改的
//特定于项目的包含文件
#pragmaonce
#ifndef_SECURE_ATL
#define_SECURE_ATL1
#endif
#ifndefVC_EXTRALEAN
#defineVC_EXTRALEAN//从Windows头中排除极少使用的资料
#endif
#include"targetver.h"
#define_ATL_CSTRING_EXPLICIT_CONSTRUCTORS//某些CString构造函数将是显式的
//关闭MFC对某些常见但经常可放心忽略的警告消息的隐藏
#define_AFX_ALL_WARNINGS
#include
#include
#include
#ifndef_AFX_NO_OLE_SUPPORT
#include
#endif
#ifndef_AFX_NO_AFXCMN_SUPPORT
#include
#endif//_AFX_NO_AFXCMN_SUPPORT
#include
#ifdef_UNICODE
#ifdefined_M_IX86
#pragmacomment(linker,"/manifestdependency:
\"type='win32'name='Microsoft.Windows.Common-Controls'version='6.0.0.0'processorArchitecture='x86'publicKeyToken='6595b64144ccf1df'language='*'\"")
#elifdefined_M_X64
#pragmacomment(linker,"/manifestdependency:
\"type='win32'name='Microsoft.Windows.Common-Controls'version='6.0.0.0'processorArchitecture='amd64'publicKeyToken='6595b64144ccf1df'language='*'\"")
#else
#pragmacomment(linker,"/manifestdependency:
\"type='win32'name='Microsoft.Windows.Common-Controls'version='6.0.0.0'processorArchitecture='*'publicKeyToken='6595b64144ccf1df'language='*'\"")
#endif
#endif
5、实验数据、结果分析
FTP服务是一种有连接的文件传输服务,采用的传输层协议是TCP协议。
FTP服务的基本过程是:
建立连接、传输数据与释放连接。
由于FTP服务的特点是数据量大、控制信息相对较少,因此在设计时采用分别对控制信息与数据进行处理的方式,这样用于通信的TCP连接也相应地分为两种类型:
控制连接与数据连接。
其中,控制连接用于在通信双方之间传输FTP命令与响应信息,完成连接建立、身份认证与异常处理等控制操作;数据连接用于在通信双方之间传输文件或目录信息。
FTP协议规定了两种连接建立与释放的顺序。
控制连接要在数据连接建立之前建立,在数据连接释放之后释放。
只有建立数据连接之后才能传输数据,并在数据传输过程中要保持控制连接不中断。
控制连接与数据连接的建立与释放有规定的发起者。
控制连接与数据连接建立的发起者只能是FTP客户机;控制连接释放的发起者只能是FTP客户机,数据连接释放的发起者可以是FTP客户机或服务器。
如果在数据连接保持的情况下控制连接中断,则可以由FTP服务器要求释放数据连接。
在FTP服务的工作过程中,FTP客户机向服务器请求建立控制连接,FTP客户机与服务器之间建立控制连接;FTP客户机请求登录到服务器,FTP服务器要求客户机提供用户名与密码;当FTP客户机成功登录到服务器后,FTP客户机通过控制连接向服务器发出命令,FTP服务器通过控制连接向客户机返回响应信息;当FTP客户机向服务器发出目录命令后,FTP服务器会通过控制连接返回响应信息,并通过新建立的数据连接返回目录信息。
如果用户想改变在FTP服务器的当前目录,FTP客户机通过控制连接向服务器发出改变目录命令,FTP服务器通过数据连接返回改变后的目录列表;如果用户想下载当前目录中的某个文件,FTP客户机通过控制连接向服务器发出下载命令,FTP服务器通过数据连接将文件传输到客户机。
数据连接有两种常用的工作模式:
ASCII模式和BI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通信网 原理