网络与因特网 实验指导书.docx

上传人:b****5 文档编号:7634249 上传时间:2023-01-25 格式:DOCX 页数:26 大小:98.87KB
下载 相关 举报
网络与因特网 实验指导书.docx_第1页
第1页 / 共26页
网络与因特网 实验指导书.docx_第2页
第2页 / 共26页
网络与因特网 实验指导书.docx_第3页
第3页 / 共26页
网络与因特网 实验指导书.docx_第4页
第4页 / 共26页
网络与因特网 实验指导书.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

网络与因特网 实验指导书.docx

《网络与因特网 实验指导书.docx》由会员分享,可在线阅读,更多相关《网络与因特网 实验指导书.docx(26页珍藏版)》请在冰豆网上搜索。

网络与因特网 实验指导书.docx

网络与因特网实验指导书

《互联网原理和应用》实验指导书

 

计算机学院

 

2014年9月

第一部分、《互联网原理和应用》实验教学大纲3

1、实验课程基本情况3

2、课程实验介绍3

3、实验项目设置4

第二部分、《互联网原理和应用》实验指导书5

实验一SOCKET网络程序设计5

实验二应用层协议分析:

TELNET及FTP13

实验三应用层HTTP协议实验17

第一部分、《互联网原理和应用》实验教学大纲

1、实验课程基本情况

院(系):

计算机

相关专业:

网络工程限选,计算机科学与技术和软件工程选修

课程编号

(与学校教学指导书同)

 

课程名称

课程

类别

课程

性质

课程

属性

实验

学期

学时数

实验

个数

实验者

专业代码

实验学分

1必修

2限选

3任选

1独立

设课

2非独立设课

1基础

2技术基础

3专业

年级

学期

总学时

实验学时

大纲要求

实际开出

1本科

2专科

3研究生

4其他

21H18865

互联网原理与应用

2

1

3

3

57

9

3

3

1

注:

“专业代码”与学校教学指导书一致

2、课程实验介绍

(1)课程简介及要求

《互联网原理与应用》是网络工程技术方向模块的限选课和计算机其它专业的选修专业课。

本课程任务是在学习《计算机网络》之后,再进一步加深对计算机互联网组成的完整体系结构、网络协议与主要网络应用。

重点理解和掌握互联网(因特网)TCP/IP的体系结构、各部分协议和主要应用软件工作原理;掌握因特网的结构特点及其应用操作。

(2)实验目的及要求

在实验室,通过网络协议仿真设备相关实验,进一步理解主要互联网协议和网络应用接口的理解。

要求每个学生都能认真完成实验,并写出详细的实验报告。

(3)实验方式

在学院网络工程实验室,实验分小组来做,4个同学一个小组,分为不同的协议编辑和协议分析两端,分别操作网络协议仿真系统完成,或4个同学一组实际操作路由交换设备完成。

(4)考试方法及评分

每个实验都做出相应的结果来,并且上交了详细的实验报告,则可得到该课程的15%的成绩,否则根据情况扣除相应的成绩。

(5)主要仪器设备

网络协议仿真实验系统、联网PC机。

(6)教材及参考书

教材:

《互联网原理和应用实验指导书》,自编

3、实验项目设置

实验室名称:

计算机学院网络工程实验室

 

实验课程及编号

项目序号

 

实验项目名称

 

内容提要

 

实验

学时

计划/已开

 

拟配

仪器

套数

 

已配

仪器

套数

 

每套

人数

实验属性

1验证

2设计

3综合

4科技

创新

开出

要求

1必做

2选做

1

SOCKET网络编程设计

1、通过C语言与WinSock2进行简单的无连接的网络服务器和客户程序设计;

2、实现网络UDP数据传输;

3、并对捕获数据进行分析。

3

20端(套)

20端(套)

2

3

1

2

FTP实验

1、TELNET协议格式和命令,

2、FTP协议格式和命令

3、TELNET和FTP操作

3

20端(套)

20端(套)

2

1

1

3

应用层HTTP协议实验

1、HTTP协议的格式

2、TCP和HTTP协议关系

3、HTTP通信过程和特性。

3

20端(套)

20端(套)

2

1

1

责任编辑:

范冰冰第二部分、《互联网原理和应用》实验指导书

实验一SOCKET网络程序设计

【实验目的】

1、进一步掌握UDP及TCP协议的工作原理

2、掌握SOCKET编程的基本方法

3、学习应用C语言与WinSock2进行简单的无连接的网络程序设计,实现网络数据传输

【实验学时】

3学时

【实验类型】

综合型

【实验要求】

实验前根据给出的服务器端程序编好客户端程序。

【实验原理】

1、关于使用套接字编程的一些基本概念

(a)半相关与全相关

半相关

在网络中,用一个三元组可以在全局唯一标志一个进程:

(协议,本地地址,本地端口号)

这样一个三元组,叫做一个半相关(half-association),它指定连接的每半部分。

全相关

一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。

也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。

因此一个完整的网间通信需要一个五元组来标识:

(协议,本地地址,本地端口号,远地地址,远地端口号)

这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。

(b)TCP/IP协议的地址结构为:

structsockaddr_in{

shortsin_family;/*AF_INET*/

u_shortsin_port;/*16位端口号,网络字节顺序*/

structin_addrsin_addr;/*32位IP地址,网络字节顺序*/

charsin_zero[8];/*保留*/

}

(c)套接字类型

TCP/IP的socket提供下列三种类型套接字。

流式套接字(SOCK_STREAM)

提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。

内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。

文件传送协议(FTP)即使用流式套接字。

数据报式套接字(SOCK_DGRAM)

提供了一个无连接服务。

数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。

网络文件系统(NFS)使用数据报式套接字。

原始式套接字(SOCK_RAW)

该接口允许对较低层协议,如IP、ICMP直接访问。

常用于检验新的协议实现或访问现有服务中配置的新设备。

(d)基本套接字系统调用

为了更好地说明套接字编程原理,下面给出几个基本套接字系统调用说明。

(1)创建套接字──socket()

应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段,其调用格式如下:

SOCKETsocket(intaf,inttype,intprotocol);

该调用要接收三个参数:

af、type、protocol。

参数af指定通信发生的区域,UNIX系统支持的地址族有:

AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中仅支持AF_INET,它是网际网区域。

因此,地址族与协议族相同。

参数type描述要建立的套接字的类型。

参数protocol说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议,则置为0,使用默认的连接模式。

根据这三个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号。

因此,socket()系统调用实际上指定了相关五元组中的“协议”这一元

(2)指定本地地址──bind()

当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名。

bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来,即将名字赋予套接字,以指定本地半相关。

其调用格式如下:

intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);

参数s是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。

参数name是赋给套接字s的本地地址(名字),其长度可变,结构随通信域的不同而不同。

namelen表明了name的长度。

如果没有错误发生,bind()返回0。

否则返回值SOCKET_ERROR。

地址在建立套接字通信过程中起着重要作用,作为一个网络应用程序设计者对套接字地址结构必须有明确认识。

(3)建立套接字连接──connect()与accept()

这两个系统调用用于完成一个完整相关的建立,其中connect()用于建立连接。

无连接的套接字进程也可以调用connect(),但这时在进程之间没有实际的报文交换,调用将从本地操作系统直接返回。

这样做的优点是程序员不必为每一数据指定目的地址,而且如果收到的一个数据报,其目的端口未与任何套接字建立“连接”,便能判断该端口不可操作。

而accept()用于使服务器等待来自某客户进程的实际连接。

connect()的调用格式如下:

intconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);

参数s是欲建立连接的本地套接字描述符。

参数name指出说明对方套接字地址结构的指针。

对方套接字地址长度由namelen说明。

如果没有错误发生,connect()返回0。

否则返回值SOCKET_ERROR。

在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。

由于地址族总被包含在套接字地址结构的前两个字节中,并通过socket()调用与某个协议族相关。

因此bind()和connect()无须协议作为参数。

accept()的调用格式如下:

SOCKETaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);

参数s为本地套接字描述符,在用做accept()调用的参数前应该先调用过listen()。

addr指向客户方套接字地址结构的指针,用来接收连接实体的地址。

addr的确切格式由套接字创建时建立的地址族决定。

addrlen为客户方套接字地址的长度(字节数)。

如果没有错误发生,accept()返回一个SOCKET类型的值,表示接收到的套接字的描述符。

否则返回值INVALID_SOCKET。

accept()用于面向连接服务器。

参数addr和addrlen存放客户方的地址信息。

调用前,参数addr指向一个初始值为空的地址结构,而addrlen的初始值为0;调用accept()后,服务器等待从编号为s的套接字上接受客户连接请求,而连接请求是由客户方的connect()调用发出的。

当有连接请求到达时,accept()调用将请求连接队列上的第一个客户方套接字地址及长度放入addr和addrlen,并创建一个与s有相同特性的新套接字号。

新的套接字可用于处理服务器并发请求。

四个套接字系统调用,socket()、bind()、connect()、accept(),可以完成一个完全五元相关的建立。

socket()指定五元组中的协议元,它的用法与是否为客户或服务器、是否面向连接无关。

bind()指定五元组中的本地二元,即本地主机地址和端口号,其用法与是否面向连接有关:

在服务器方,无论是否面向连接,均要调用bind();在客户方,若采用面向连接,则可以不调用bind(),而通过connect()自动完成。

若采用无连接,客户方必须使用bind()以获得一个唯一的地址。

以上讨论仅对客户/服务器模式而言,实际上套接字的使用是非常灵活的,唯一需遵循的原则是进程通信之前,必须建立完整的相关。

(4)监听连接──listen()

此调用用于面向连接服务器,表明它愿意接收连接。

listen()需在accept()之前调用,其调用格式如下:

intlisten(SOCKETs,intbacklog);

参数s标识一个本地已建立、尚未连接的套接字号,服务器愿意从它上面接收请求。

backlog表示请求连接队列的最大长度,用于限制排队请求的个数,目前允许的最大值为5。

如果没有错误发生,listen()返回0。

否则它返回SOCKET_ERROR。

listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必须的连接,并建立长度为backlog的请求连接队列。

调用listen()是服务器接收一个连接请求的四个步骤中的第三步。

它在调用socket()分配一个流套接字,且调用bind()给s赋于一个名字之后调用,而且一定要在accept()之前调用。

(5)数据传输──send()与recv()

当一个连接建立以后,就可以传输数据了。

常用的系统调用有send()和recv()。

send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,格式如下:

intsend(SOCKETs,constcharFAR*buf,intlen,intflags);

参数s为已连接的本地套接字描述符。

buf指向存有发送数据的缓冲区的指针,其长度由len指定。

flags指定传输控制方式,如是否发送带外数据等。

如果没有错误发生,send()返回总共发送的字节数。

否则它返回SOCKET_ERROR。

recv()调用用于在参数s指定的已连接的数据报或流套接字上接收输入数据,格式如下:

intrecv(SOCKETs,charFAR*buf,intlen,intflags);

参数s为已连接的套接字描述符。

buf指向接收输入数据缓冲区的指针,其长度由len指定。

flags指定传输控制方式,如是否接收带外数据等。

如果没有错误发生,recv()返回总共接收的字节数。

如果连接被关闭,返回0。

否则它返回SOCKET_ERROR。

(6)输入/输出多路复用──select()

select()调用用来检测一个或多个套接字的状态。

对每一个套接字来说,这个调用可以请求读、写或错误状态方面的信息。

请求给定状态的套接字集合由一个fd_set结构指示。

在返回时,此结构被更新,以反映那些满足特定条件的套接字的子集,同时,select()调用返回满足条件的套接字的数目,其调用格式如下:

intselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,fd_setFAR*exceptfds,conststructtimevalFAR*timeout);

参数nfds指明被检查的套接字描述符的值域,此变量一般被忽略。

参数readfds指向要做读检测的套接字描述符集合的指针,调用者希望从中读取数据。

参数writefds指向要做写检测的套接字描述符集合的指针。

exceptfds指向要检测是否出错的套接字描述符集合的指针。

timeout指向select()函数等待的最大时间,如果设为NULL则为阻塞操作。

select()返回包含在fd_set结构中已准备好的套接字描述符的总数目,或者是发生错误则返回SOCKET_ERROR。

(7)关闭套接字──closesocket()

closesocket()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接,则该连接被释放。

closesocket()的调用格式如下:

BOOLclosesocket(SOCKETs);

参数s待关闭的套接字描述符。

如果没有错误发生,closesocket()返回0。

否则返回值SOCKET_ERROR。

2、用于无连接协议(如UDP)的SOCKET系统调用流程框图:

3、面向连接协议(如TCP)的SOCKET系统调用流程框图:

4、其他原理请参考教材。

【实验步骤】

使用UDP协议的无连接客户-服务员程序设计。

根据实验原理中介绍的内容,设计一个无连接的客户-服务员系统,实现二者之间的数据传递。

下面是一个简单的UDP客户-服务员程序的实例,作为参考。

说明:

下述服务员程序保存在服务器端,可以直接从服务器拷贝,并稍作修改(如服务员IP地址)后在本地进行编译连接并运行。

数据采集器的红色按钮要求按出来,使监控机捕获到局域网的数据。

#include

#include

#defineSERV_UDP_PORT6000/*服务员进程端口号,视具体情况而定*/

#defineSERV_HOST_ADDR"10.60.46.58"/*服务员地址,视具体情况而定*/

/*宏定义用来打印错误消息*/

#definePRINTERROR(s)\

fprintf(stderr,"\n%:

%d\n",s,WSAGetLastError())

////////////////////////////////////////////////////////////

//数据报通信的服务员端子程序//

////////////////////////////////////////////////////////////

voidDatagramServer(shortnPort)

{

SOCKETtheSocket;

/*创建一个数据报类型的socket*/

theSocket=socket(AF_INET,//地址族

SOCK_DGRAM,//socket类型

IPPROTO_UDP);//协议类型:

UDP

/*错误处理*/

if(theSocket==INVALID_SOCKET)

{

PRINTERROR("socket()");

return;

}

/*填写服务员地址结构*/

SOCKADDR_INsaServer;

saServer.sin_family=AF_INET;

saServer.sin_addr.s_addr=INADDR_ANY;//由WinSock指定地址

saServer.sin_port=htons(nPort);//服务员进程端口号

/*将服务员地址与已创建的socket绑定*/

intnRet;

nRet=bind(theSocket,//Socket描述符

(LPSOCKADDR)&saServer,//服务员地址

sizeof(structsockaddr)//地址长度

);

/*错误处理*/

if(nRet==SOCKET_ERROR)

{

PRINTERROR("bind()");

closesocket(theSocket);

return;

}

/*等待来自客户端的数据*/

SOCKADDR_INsaClient;

charszBuf[1024];

intnLen;

while

(1)

{

/*准备接收数据*/

memset(szBuf,0,sizeof(szBuf));

nRet=recvfrom(theSocket,//已绑定的socket

szBuf,//接收缓冲区

sizeof(szBuf),//缓冲区大小

0,//Flags

(LPSOCKADDR)&saClient,//接收客户端地址的缓冲区

&nLen);//地址缓冲区的长度

/*打印接收到的信息*/

printf("\nDatareceived:

%s",szBuf);

/*发送数据给客户端*/

strcpy(szBuf,"FromtheServer");

sendto(theSocket,//已绑定的socket

szBuf,//发送缓冲区

strlen(szBuf),//发送数据的长度

0,//Flags

(LPSOCKADDR)&saClient,//目的地址

nLen);//地址长度

}

closesocket(theSocket);

return;

}

////////////////////////////////////////////////////////////

//数据报服务员端主程序//

////////////////////////////////////////////////////////////

voidmain()

{

WORDwVersionRequested=MAKEWORD(1,1);

WSADATAwsaData;

intnRet;

shortnPort;

nPort=SERV_UDP_PORT;

/*初始化Winsock*/

nRet=WSAStartup(wVersionRequested,&wsaData);

if(wsaData.wVersion!

=wVersionRequested)

{

fprintf(stderr,"\nWrongversion\n");

return;

}

/*调用数据服务员子程序*/

DatagramServer(nPort);

/*结束WinSock*/

WSACleanup();

}

请学生认真阅读分析上述服务员程序,然后根据实验原理二中介绍的内容,自行编写相应的无连接的客户端程序并运行。

从而实现客户和服务器间的数据传输。

要求在仿真机端运行客户端进程,在监控机端捕获数据并进行分析。

【思考问题】

根据实验中记录的客户和服务器程序的端口号并结合程序,说明:

在客户/服务器模型当中,客户进程的端口号和服务器进程的端口号都是由程序给出说明的吗?

为什么?

【实验报告要求】

1、写出客户端程序。

2、回答提出的问题。

实验二应用层协议分析:

TELNET及FTP

【实验目的】

了解TELNET、FTP协议

【实验学时】

4学时

【实验类型】

综合型

【实验要求】

1、理解TELNET协议及作用

2、理解FTP协议及工作原理

【实验原理】

1、TELNET命令:

名称

代码(十进制)

描述

EOF

236

文件结束符

SUSP

237

挂起当前进程(作业控制)

ABORT

238

异常中止进程

EOR

239

记录结束符i

SE

240

自选项结束

NOP

241

无操作

DM

242

数据标记

BRK

243

中断

IP

244

中断进程

AO

245

异常中止输出

AYT

246

对方是否还在运行?

EC

247

转义字符

EL

248

删除行

GA

249

继续进行

SB

250

子选项开始

WILL

251

同意启动(enable)选项

WONT

252

拒绝启动选项

DO

253

认可选项请求

DONT

254

拒绝选项请求

IAC

255

数据字节255

选项协商:

4种请求

1)WILL:

发送方本身将激活选项

2)DO:

发送方想叫接受端激活选项

3)WONT:

发送方本身想禁止选项

4)DON’T:

发送方想让接受端去禁止选项

常用Telnet选项代码:

选项标识

名称

1

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1