您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页网络实验指导书

网络实验指导书

来源:爱go旅游网


《计算机网络》实验指导书

刘晓烽

哈尔滨工业大学 计算机科学与技术学院 2013年5月15日

1

前 言

《计算机网络》课程是计算机科学与技术专业的重要专业课程之一。随着计算机网络技术的迅速发展和在当今信息社会中的广泛应用,给《计算机网络》课程的教学提出了新的更高的要求。

由于计算机网络是一门实践性较强的技术,课堂教学应该与实践环节紧密结合。将《计算机网络》课程建设成世界一流的课程,是近期《计算机网络》课程努力的方向。

希望同学们在使用本实验指导书及进行实验的过程中,能够帮助我们不断地发现问题,并提出建议,使《计算机网络》成为具有世界一流水平的课程。本学期授课教师为刘晓烽老师,参与网络课程助教环节的教师为闫庆军、胡刚、潘燕华同学、门雪莹同学,参与实验课程的实验教师刘晓烽老师、娄久老师、闫庆军、胡刚、韩宝梅、罗日新、许洪春、潘燕华、门雪莹。

2

实验要求

计算机网络是现代信息社会最重要的基础设施之一。在过去十几年里得到了迅速的发展和应用。《计算机网络》课程实验的目的是为了使学生在课程学习的同时,通过在一个计算机网络环境中的实际操作,对现代计算机网络的基本功能有一个初步的了解;通过实现一个数据链路层协议,掌握计算机网络通信协议的基本实现技术;通过一个简单文件传送协议的设计和实现,了解计算机网络高层协议设计实现的环境和方法;还提供了一些可以选作的实验以供有余力有兴趣的同学进一步提高。总之,通过上述实验环节,使学生加深了解和更好地掌握《计算机网络》课程教学大纲要求的内容。

在《计算机网络》的课程实验过程中,要求学生做到:

(1)每次实验前应预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现情况提前做出思考和分析。

(2)仔细观察上机和上网操作时出现的各种现象,记录主要情况,做出必要说明和分析。

(3)认真书写实验报告。实验报告包括实验目的和要求,实验情况及其分析。对需要编程的实验,写出程序设计说明,给出源程序框图和清单。

(4)遵守机房纪律,服从辅导教师指挥,爱护实验设备。 (5)实验课程不迟到。如有事不能出席,所缺实验一般不补。

实验的验收将分为两个部分。第一部分是上机操作,包括检查程序运行和即时提问。第二部分是提交电子版的实验报告。此外,网络实验采用当堂检查方式,每个实验都应当在规定的时间内完成并检查通过,过期视为未完成该实验,不计成绩。以避免集中检查方式产生的诸多不良问题,希望同学们抓紧时间,合理安排,认真完成。

3

实验一:TCP/IP编程

1、实验目的:

掌握Socket编程过程,编写简单的网络应用程序。

2、实验环境:

 Windows 9x/NT/2000/XP/2003  TCP/IP协议

3、编程工具:

Java(JCreator IDE),c/c++(VC++ 6.0)

4、实验内容:

1) 利用编程语言,分别基于TCP和UDP编写一个简单的Client/Server网络应用程序。要求实现客户向服务器传输任意一个字符串,服务器将收到的字符串变换成大写后传回客户。

2) 修改上述程序,分别基于TCP和UDP,实现服务器根据客户请求,将客户端指定的文件可靠地传输给客户。如果服务器没有指定的文件,服务器将给客户返回一个信息,通知客户其请求文件不存在。

基于UDP的文件传输可以考虑利用“停等协议”保证其可靠性。 3) 有条件的同学可以进一步改进2)的程序,使之更实用。比如可以请求服务器先传输目录,然后客户根据目录请求传输文件等。

选作内容,加分项目:(可以当堂完成或课下完成)

4)在2)的基础上,实现多线程的文件服务器。即服务器可以同时为多个客户端传送文件。实现的手段为对每一个客户端请求,服务器主线程创建一个新的线程为其传送文件,然后主线程返回,继续等待其它客户端的连接请求。

5、实验方式:

每位同学上机编程实验,实验指导教师现场指导。

6、参考内容:

6.1 JAVA 版本的socket编程样例

(1) 基于TCP实现客户向服务器传输任意一个字符串的客户端程序: TCPClient.java

import java.io.*: import java.net.*: class TCPClient{

public static void main(String argv[]) throws Exception {

String sentence;

String modifiedSentence;

BufferedReader inFromUser =

4

new BufferedReader(new InputStreamReader(System.in));

Socket clientSocket = new Socket(“hostname”,67);//hostname is server domainame DataOutputStream outToServer =

new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer =

new BufferedReader(new InputStreamReader( clientSocket.getInputStream())); sentence = inFromUser.readLine();

outToServer.writeBytes(sentence + „\\n‟);

modifiedSentence = inFromServer.readLine();

System.out.println(“FROM SERVER:”+modifiedSentence); clientSocket.close(); } }

(2) 基于TCP实现服务器将收到的字符串变换成大写后传回客户的服务器端程序:TCPServer.java

import java.io.*: import java.net.*: class TCPServer{

public static void main(String argv[]) throws Exception {

String ClientSentence; String capitalizedSentence;

ServerSocket welcomeSocket = new ServerSocket(67); While(true){

Socket connectionSocket = welcomeSocket.accept(); BufferedReader inFromClient =

new BufferedReader(new InputStreamReader( connectionSocket. getInputStream())); DataOutputStream outToClient =

new DataOutputStream(connectionSocket.getOutputStream()); ClientSentence = infromClient. readLine(); capitalizedSentence =

clientSentence.toUpperCase() + „\\n‟; outToClient.writeBytes(capitalizedSentence); } } }

(3)基于UDP实现客户向服务器传输任意一个字符串的客户端程序:

UDPClient.java

import java.io.*: import java.net.*:

5

class UDPClient {

public static void main(String args[]) throws Exception {

BufferedReader infromUser =

new BufferedReader(new InputStreamReader(System.in)); DatagramSocket clientSocket = new DatagramSocket();

InetAddress IPAddress = InetAddress.getByName(“hostname”); byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024]; String sentence = infromUser.readLine(); sendData = sentence.getBytes(); DatagramPacket sendPacket =

new DatagramPacket(sendData, sendData.length, IPAddress,9876);

clientSocket.send(sendPacket); DatagramPacket receivePacket =

new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); String modifiedSentence=

new string(receivePacket.getData());

System.out.println(“FROM SERVER:” + modifiedSentence); clientSocket.close(); } }

4)基于UDP实现服务器将收到的字符串变换成大写后传回客户的服务器端程序:UDPServer.java

import java.io.*: import java.net.*: class UDPServer {

public static void main(String args[]) throws Exception {

DatagramSocket serverSocket = new DatagramSocket(9876); byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while(true) {

DatagramPacket receivePacket =

new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket);

String sentence = new String(receivePacket.getData()); InetAddress IPAddress = receivePacket.getAddress()); int port = receivePacket.getPort();

String capitalizedSentence = sentence.toUpperCase();

6

sendData = capitalizedSentence.getBytes(); DatagramPacket sendPacket =

new DatagramPacket(sendData, sendData.length,IPAddress,port); serverSocket.send(sendPacket); } } }

(5) 实现服务器根据客户请求,将客户端指定的文件可靠地传输给客户。如果服务器没有指定的文件,服务器将给客户返回一个信息,通知客户其请求文件不存在。

TCPFileClient.java

import java.io.*: import java.net.*: class TCPFileClient{

public static void main(String argv[]) throws Exception {

String sentence;

String modifiedSentence;

BufferedReader inFromUser =

new BufferedReader(new InputStreamReader(System.in));

Socket clientSocket = new Socket(“hostname”,67);//hostname is server domainame DataOutputStream outToServer =

new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer =

new BufferedReader(new InputStreamReader( clientSocket.getInputStream())); System.out.println(“Please Enter File Name:”); sentence = inFromUser.readLine();

outToServer.writeBytes(sentence + „\\n‟);

modifiedSentence = inFromServer.readLine();

System.out.println(“FROM SERVER:”+modifiedSentence); clientSocket.close(); } }

TCPFileServer.java

import java.io.*: import java.net.*: class TCPFileServer{

public static void main(String argv[]) throws Exception {

String ClientSentence; String capitalizedSentence;

7

ServerSocket welcomeSocket = new Server Socket(67); While(true){

Socket connectionSocket = welcomeSocket.accept(); BufferedReader infromClient =

new BufferedReader(new InputStreamReader( connectionSocket. getInputStream())); DataOutputStream outToClient = new DataOutputStream(

connectionSocket.getOutputStream()); ClientSentence = infromClient. readLine(); try{

RandomAccessFile in=new RandomAccessFile(

ClientSentence,”r”);

String s;

String total=” “;

While((s=in.readLine())!=null) total=total+s;

outToClient.writeBytes(total+‟\\n‟); in.close(); }

catch(Exception e){ outToClient.writeBytes(“文件不存在!”); } } }

}

(6) 实现可以请求服务器先传输目录,然后客户根据目录再请求传输文件的网络应用。请同学们自己编写。

6.2 C版本的socket编程样例

Udp服务器端——等待接收客户端传来的“hello”并打印 #pragma comment(lib, \"wsock32.lib\") #include #include

void main() {

WORD wVersionRequested; WSADATA wsaData; int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) {

return;

8

}

if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) {

WSACleanup( ); return; }

SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); char recvBuf[100];

recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); printf(\"%s\\n\ closesocket(sockSrv); WSACleanup(); }

Udp客户端——向服务器端发送“hello”字符串 #include #include

#pragma comment(lib, \"wsock32.lib\")

void main() {

WORD wVersionRequested; WSADATA wsaData; int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; }

if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; }

SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addr(\"127.0.0.1\"); addrSrv.sin_family=AF_INET;

9

addrSrv.sin_port=htons(6000);

sendto(sockClient,\"Hello\ (SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); closesocket(sockClient); WSACleanup(); }

Tcp服务器端------接收客户端发来的“hello”字符串 #pragma comment(lib, \"wsock32.lib\") #include

#include void main() {

WORD wVersionRequested; WSADATA wsaData; int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; }

if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; }

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); listen(sockSrv,5);

SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); while(1) {

SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); char sendBuf[50];

sprintf(sendBuf,\"Welcome %s to here!\ send(sockConn,sendBuf,strlen(sendBuf)+1,0); char recvBuf[50];

recv(sockConn,recvBuf,50,0); printf(\"%sn\ closesocket(sockConn);

10

} }

Tcp客户端——向服务器发送“hello”字符串 #pragma comment(lib, \"wsock32.lib\") #include

#include void main() {

WORD wVersionRequested; WSADATA wsaData; int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; }

if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; }

SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addr(\"127.0.0.1\"); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000);

connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); char recvBuf[50];

recv(sockClient,recvBuf,50,0); printf(\"%sn\

send(sockClient,\"hello\ closesocket(sockClient); WSACleanup(); }

7、实验报告:

在实验报告中要说明Socket编程的客户端和服务器端主要步骤、利用Java语言用到的主要类及其主要作用、TCP和UDP编程的主要差异和特点、实验过程和实验结果。

11

实验二:利用Ethereal分析应用层协议HTTP、DNS和FTP

1、实验目的

熟悉并掌握Ethereal的基本操作,了解网络协议实体间进行交互以及报文交换的情况。

2、实验环境:

 

Windows 9x/NT/2000/XP/2003; 与因特网连接的计算机网络系统; Ethereal等软件。

3、实验内容:

1) 学习Ethereal的使用; 2) 利用Ethereal分析HTTP协议; 3) 利用Ethereal分析DNS协议; 4) 利用Ethereal分析FTP协议。

4、实验方式:

5) 每位同学上机实验,并与指导教师讨论。

5、参考内容:

6) 要深入理解网络协议,需要仔细观察协议实体之间交换的报文序列。为探究协议操作细节,可使协议实体执行某些动作,观察这些动作及其影响。这些任务可以在仿真环境下或在如因特网这样的真实网络环境中完成。观察在正在运行协议实体间交换报文的基本工具被称为分组嗅探器(packet sniffer)。顾名思义,一个分组嗅探器俘获(嗅探)计算机发送和接收的报文。一般情况下,分组嗅探器将存储和显示出被俘获报文的各协议头部字段的内容。图1为一个分组嗅探器的结构。

图1 分组嗅探器的结构

图1右边是计算机上正常运行的协议(在这里是因特网协议)和应用程序(如:web浏览器和ftp客户端)。分组嗅探器(虚线框中的部分)是附加计算机普通软件上的,主要有两部分组成。分组俘获库(packet capture library)接收计算机发送和接收的每一个链路层帧

12

的拷贝。高层协议(如:HTTP、FTP、TCP、UDP、DNS、IP等)交换的报文都被封装在链路层帧中,并沿着物理媒体(如以太网的电缆)传输。图1假设所使用的物理媒体是以太网,上层协议的报文最终封装在以太网帧中。

分组嗅探器的第二个组成部分是分析器。分析器用来显示协议报文所有字段的内容。为此,分析器必须能够理解协议所交换的所有报文的结构。例如:我们要显示图1中HTTP协议所交换的报文的各个字段。分组分析器理解以太网帧格式,能够识别包含在帧中的IP数据报。分组分析器也要理解IP数据报的格式,并能从IP数据报中提取出TCP报文段。然后,它需要理解TCP报文段,并能够从中提取出HTTP消息。最后,它需要理解HTTP消息。

Ethereal是一种可以运行在Windows, UNIX, Linux等操作系统上的分组分析器。Ethereal是免费的,可以从Http://www.ethereal.com得到。运行ethereal程序时,其图形用户界面如图2所示。最初,各窗口中并无数据显示。ethereal的界面主要有五个组成部分:

图2 Ethereal的用户界面

 命令菜单(command menus):命令菜单位于窗口的最顶部,是标准的下拉式菜单。最常用菜单命令有两个:File、Capture。File菜单允许你保存俘获的分组数据或打开一个已被保存的俘获分组数据文件或退出ethereal程序。Capture菜单允许你开始俘获分组。

 俘获分组列表(listing of captured packets):按行显示已被俘获的分组内容,其中包括:ethereal赋予的分组序号、俘获时间、分组的源地址和目的地址、协议类型、分组中所包含的协议说明信息。单击某一列的列名,可以使分组按指定列进行排序。在该列表中,所显示的协议类型是发送或接收分组的最高层协议的类型。

 分组头部明细(details of selected packet header):显示俘获分组列表窗口中被选中分组的头部详细信息。包括:与以太网帧有关的信息,与包含在该分组中的IP数据报有关的信息。单击以太网帧或IP数据报所在行左边的向右或向下的箭头可以展开或最小化相关信息。另外,如果利用TCP或UDP承载分组,ethereal也会显示TCP或UDP协议头部信息。最后,分组最高层协议的头部字段也会显示在此窗口中。

 分组内容窗口(packet content):以ASCII码和十六进制两种格式显示被俘获帧的完整内容。

 显示筛选规则(display filter specification):在该字段中,可以填写协议的名称或其

13

他信息,根据此内容可以对分组列表窗口中的分组进行过滤。

(一) Ethereal的使用

 启动主机上的web浏览器。

 启动ethereal。你会看到如图2所示的窗口,只是窗口中没有任何分组列表。

 开始分组俘获:选择“capture”下拉菜单中的“Start”命令,会出现如图3所示的

“Ethereal: Capture Options”窗口,可以设置分组俘获的选项。

图3 Ethereal的Capture Option

 在实验中,可以使用窗口中显示的默认值。在“Ethereal: Capture Options”窗口的最上面有一个“interface”下拉菜单,其中显示计算机所具有的网络接口(即网卡)。当计算机具有多个活动网卡时,需要选择其中一个用来发送或接收分组的网络接口(如某个有线接口)。随后,单击“ok”开始进行分组俘获,所有由选定网卡发送和接收的分组都将被俘获。

 开始分组俘获后,会出现如图4所示的分组俘获统计窗口。该窗口统计显示各类已俘获分组的数量。在该窗口中有一个“stop”按钮,可以停止分组的俘获。但此时你最好不要停止俘获分组。

 在运行分组俘获的同时,在浏览器地址栏中输入某网页的URL,如:http://www.hit.edu.cn。为显示该网页,浏览器需要连接www.hit.edu.cn的服务器,并与之交换HTTP消息,以下载该网页。包含这些HTTP报文的以太网帧将被Ethereal俘获。

14

图4 Ethereal的Packet Capture Windows

 当完整的页面下载完成后,单击Ethereal俘获窗口中的stop按钮,停止分组俘获。此时,分组俘获窗口关闭。Ethereal主窗口显示已俘获的你的计算机与其他网络实体交换的所有协议报文,其中一部分就是与www.hit.edu.cn服务器交换的HTTP报文。此时主窗口与图2相似。

 在显示筛选规则中输入“http”,单击“apply”,分组列表窗口将只显示HTTP协议报文。

 选择分组列表窗口中的第一条http报文。它应该是你的计算机发向www.hit.edu.cn服务器的HTTP GET报文。当你选择该报文后,以太网帧、IP数据报、TCP报文段、以及HTTP报文首部信息都将显示在分组首部子窗口中。单击分组首部详细信息子窗口中向右和向下箭头,可以最小化帧、以太网、IP、TCP信息显示量,可以最大化HTTP协议相关信息的显示量。

(二)HTTP和DNS分析

1. HTTP GET/response交互

首先通过下载一个非常简单的HTML文件(该文件非常短,并且不嵌入任何对象)。  启动Web browser,然后启动Ethereal分组嗅探器。在窗口的显示过滤说明处输入“http”,分组列表子窗口中将只显示所俘获到的HTTP报文。

 开始Ethereal分组俘获。

 在打开的Web browser窗口中输入一下地址(浏览器中将显示一个只有几行文字的非常简单的HTML文件):

http://hitgs.hit.edu.cn/news/detail1.jsp?ID1=9042

15

 停止分组俘获。

根据俘获窗口内容,思考以下问题:

 你的浏览器运行的是HTTP1.0,还是HTTP1.1?你所访问的服务器所运行HTTP协议的版本号是多少?

 你的浏览器向服务器指出它能接收何种语言版本的对象?

 你的计算机的IP地址是多少?服务器hitgs.hit.edu.cn的IP地址是多少?  从服务器向你的浏览器返回的状态代码是多少?

2. HTTP 条件GET/response交互

 启动浏览器,清空浏览器的缓存(在浏览器中,选择“工具”菜单中的“Internet选项”命令,在出现的对话框中,选择“删除文件”)。

 启动Ethereal分组俘获器。开始Ethereal分组俘获。

 在浏览器的地址栏中输入以下URL: http://www.wxjy.com.cn/jysk/gdwx/yijing.html,在你的浏览器中重新输入相同的URL或单击浏览器中的“刷新”按钮。

 停止Ethereal分组俘获,在显示过滤筛选说明处输入“http”,分组列表子窗口中将只显示所俘获到的HTTP报文。

根据俘获窗口内容,思考以下问题:

 分析你的浏览器向服务器发出的第一个HTTP GET请求的内容,在该请求报文中,是否有一行是:IF-MODIFIED-SINCE?

 分析服务器响应报文的内容,服务器是否明确返回了文件的内容?如何获知?  分析你的浏览器向服务器发出的第二个“HTTP GET”请求,在该请求报文中是否有一行是:IF-MODIFIED-SINCE?如果有,在该首部行后面跟着的信息是什么?

 服务器对第二个HTTP GET请求的响应中的HTTP状态代码是多少?服务器是否明确返回了文件的内容?请解释。

3. 跟踪DNS

nslookup工具允许主机向指定的DNS服务器查询某个DNS记录。如果没有指明DNS

服务器,nslookup将把查询请求发向默认的DNS服务器。nslookup的一般格式是: nslookup –option1 –option2 host-to-find dns-server

ipconfig命令用来显示你当前的TCP/IP信息,包括:你的地址、DNS服务器的地址、适配器的类型等信息。如果,要显示与主机相关的信息用命令:

ipconfig/all

如果查看DNS缓存中的记录用命令: ipconfig/displaydns

要清空DNS缓存,用命令: ipconfig /flushdns

运行以上命令需要进入MSDOS环境。

(1) 利用ipconfig命令清空你的主机上的DNS缓存。启动浏览器,并将浏览器的缓存清空。

(2) 启动Ethereal,在显示过滤筛选说明处输入“ip.addr==your_IP_address”(如:ip.addr==192.168.1.61),过滤器将会删除所有目的地址和源地址都与指定IP地址不同的分组。

(3) 开始Ethereal分组俘获。

(4) 在浏览器的地址栏中输入:http://hitgs.hit.edu.cn/ /

16

(5) 停止分组俘获。

根据俘获窗口内容,思考以下问题:

 定位到DNS查询报文和查询响应报文,这两种报文的发送是基于UDP还是基于TCP的?

 DNS查询报文的目的端口号是多少?DNS查询响应报文的源端口号是多少?  DNS查询报文发送的目的地的IP地址是多少?利用ipconfig命令(ipconfig /all)决定你主机的本地DNS服务器的IP地址。这两个地指相同吗?

 检查DNS查询报文,它是哪一类型的DNS查询?该查询报文中包含“answers”吗?

 检查DNS查询响应报文,其中提供了多少个“answers”?每个answers包含哪些内容?

 考虑一下你的主机发送的subsequent(并发)TCP SYN分组, SYN分组的目的IP地址是否与在DNS查询响应报文中提供的某个IP地址相对应?

 打开的WEB页中包含图片,在获取每一个图片之前,你的主机发出新的DNS查询了吗?

(三)FTP分析

可以利用Ethereal分析FTP协议 1) 启动Ethereal

2) 在浏览器地址栏中输入:ftp://202.118.224.241 3) 下载根目录下的“来宾请阅.txt”文档。

4) 再次下载“来宾请阅.txt”文档到另一个目录。 5) 停止Ethereal的分组捕获。

根据俘获窗口内容,思考以下问题:

 FTP应用是基于TCP还是UDP的?

17

 你的主机发起到目的主机的FTP连接的端口号和目的主机的端口号分别是多少?  观察用户和FTP服务器连接时都交互了哪些信息?  在传送数据前是否新开了一个TCP连接?

 传送数据时的源端口号和目的端口号分别是多少?还是开始建立连接时的端口号吗?由此你可以得出什么结论?

 在此传送数据时源端口号和目的端口号分别是多少?还是第一次传数据时的端口号吗?由此又可以得出什么结论?

6、实验报告

要求学生撰写实验报告对利用Ethereal分析Http和DNS的实验过程、发现的问题、得到的结果、对协议的认识等内容进行总结(可结合每个实验后面的思考题进行分析、总结)。

18

实验三:利用Ethereal分析应用层协议TCP、UDP和IP

1、实验目的

分析TCP、UDP和IP协议

2、实验环境:

 Windows 9x/NT/2000/XP/2003  与因特网连接的计算机网络系统  Ethereal等软件

3、 实验内容: 1)继续学习Ethereal的使用

2)利用Ethereal分析TCP、UDP和IP协议

4、实验方式:

每位同学上机实验,并与指导教师讨论。

5、参考内容: (一) TCP分析

注:访问以下网址需要设置代理服务器。如无法访问可与实验TA联系,下载tcp-ethereal-trace文件,利用该文件进行TCP协议分析。

A. 俘获大量的由本地主机到远程服务器的TCP分组

(1) 启动浏览器,打开http://gaia.cs.umass.edu/ethereal-labs/alice.txt网页,得到ALICE'S ADVENTURES IN WONDERLAND文本,将该文件保存到你的主机上。

(2) 打开http://gaia.cs.umass.edu/ethereal-labs/TCP-ethereal-file1.html

(3) 窗口如下图所示。在Browse按钮旁的文本框中输入保存在你的主机上的文件ALICE'S ADVENTURES IN WONDERLAND的全名(含路径),此时不要按“Upload alice.txt file”按钮

(4) 启动Ethereal,开始分组俘获。

19

(5) 在浏览器中,单击“Upload alice.txt file”按钮,将文件上传到gaia.cs.umass.edu服务器,一旦文件上传完毕,一个简短的贺词信息将显示在你的浏览器窗口中。

(6) 停止俘获。

B.

浏览追踪信息

(1) 在显示筛选规则中输入“tcp”,可以看到在本地主机和服务器之间传输的一系列tcp和

http报文,你应该能看到包含SYN报文的三次握手。也可以看到有主机向服务器发送的一个HTTP POST报文和一系列的“http continuation”报文。

(2) 根据操作思考以下问题:

 少?

Gaia.cs.umass.edu服务器的IP地址是多少?对这一连接,它用来发送和接收TCP向gaia.cs.umass.edu服务器传送文件的客户端主机的IP地址和TCP端口号是多

报文的端口号是多少?

C.

TCP基础

根据操作思考以下问题:

 客户服务器之间用于初始化TCP连接的TCP SYN报文段的序号(sequence number)是多少?在该报文段中,是用什么来标示该报文段是SYN报文段的?

 服务器向客户端发送的SYNACK报文段序号是多少?该报文段中,Acknowledgement字段的值是多少?Gaia.cs.umass.edu服务器是如何决定此值的?在该报文段中,是用什么来标示该报文段是SYNACK报文段的?

 你能从捕获的数据包中分析出tcp三次握手过程吗?  包含HTTP POST命令的TCP报文段的序号是多少?

 如果将包含HTTP POST命令的TCP报文段看作是TCP连接上的第一个报文段,那么该TCP连接上的第六个报文段的序号是多少?是何时发送的?该报文段所对应的ACK是何时接收的?

 前六个TCP报文段的长度各是多少?

 在整个跟踪过程中,接收端公示的最小的可用缓存空间是多少?发送端的传输以后,接收端的缓存是否仍然不够用?

 在跟踪文件中是否有重传的报文段?进行判断的依据是什么?

 TCP连接的throughput (bytes transferred per unit time)是多少?请写出你的计算过程。

(二) UDP分析

分析QQ消息或其他可以捕获到的UDP数据包。 (1) 启动Ethereal,开始分组捕获。 (2) 发送QQ消息给你的好友。

20

(3) 停止Ethereal组捕获

(4) 在显示筛选规则中输入“ip.addr == 222.202.96.170”(222.202.96.170为我的机器上QQ服务器的ip地址,你应该根据当时的情况输入你的QQ服务器的ip地址)

(5) 并展开数据包的细节

根据操作思考以下问题:

 QQ消息是基于UDP的还是TCP的?

 你的主机ip地址是什么?目的主机ip地址是什么?

 你的主机发送QQ消息的端口号和QQ服务器的端口号分别是多少?  UDP数据报的格式是什么样的?都包含哪些字段,分别占多少字节?  为什么你发送一个ICQ数据包后,服务器又返回给你的主机一个ICQ数  据包?这与UDP的不可靠数据传输有什么联系?

 对比前面的TCP协议分析,你能看出UDP是无连接的吗?

(三) IP分析

通过分析执行traceroute程序发送和接收到的IP数据包,我们将研究IP数据包的各个字段,并详细研究IP分片。

A. 通过执行traceroute执行捕获数据包

为了产生一系列IP数据报,我们利用traceroute程序发送具有不同大小的数据包给目的主机X。traceroute程序中,源主机发送的第一个数据包的TTL设位1,第二个为2,第三个

21

为3,等等。每当路由器收到一个包,都会将其TTL值减1。这样,当第n个数据包到达了第n个路由器时,第n个路由器发现该数据包的TTL已经过期了。根据IP协议的规则,路由器将该数据包丢弃并将一个ICMP警告消息送回源主机。

在Windows自带的tracert命令不允许用户改变由tracert命令发送的ICMP echo请求消息(ping消息)的大小。一个更优秀的traceroute程序是pingplotter,下载并安装pingplotter。ICMP echo请求消息的大小可以通过下面方法在pingplotter中进行设置。Edit->Options->Packet,然后填写Packet Size(in bytes,default=56)域。

实验步骤:

(1) 启动Ethereal并开始数据包捕获

(2) 启动pingplotter并“Address to Trace Window”域中输入目的地址。 在“# of times to Trace”域中输入“3”,这样就不过采集过多的数据。Edit->Options->Packet,将Packet Size(in bytes,default=56)域设为56,这样将发送一系列大小为56字节的包。然后按下“Trace”按钮。得到的pingplotter窗口如下:

(1) Edit->Options->Packet,然后将Packet Size(in bytes,default=56)域改为2000,这样将发送一系列大小为2000字节的包。然后按下“Resume”按钮。

(2) 最后,将Packet Size(in bytes,default=56)域改为3500,发送一系列大小为3500字节的包。然后按下“Resume”按钮。

(3) 停止Ethereal的分组捕获。

注:如无法访问可与实验TA联系,下载已有的ip-ethereal-trace文件,利用该文件进行IP协议分析

B. 对捕获的数据包进行分析

(1)在你的捕获窗口中,应该能看到由你的主机发出的一系列ICMP Echo Request包和中间路由器返回的一系列ICMP TTL-exceeded消息。选择第一个你的主机发出的ICMP Echo Request消息,在packet details窗口展开数据包的Internet Protocol部分。

22

思考下列问题:

 你主机的IP地址是什么?

 在IP数据包头中,上层协议(upper layer)字段的值是什么?

 IP头有多少字节?该IP数据包的净载为多少字节?并解释你是怎样确定该IP数据包的净载大小的?

 该IP数据包分片了吗?解释你是如何确定该P数据包是否进行了分片的。

(2)单击Source列按钮,这样将对捕获的数据包按源IP地址排序。选择第一个你的主机发出的ICMP Echo Request消息,在packet details窗口展开数据包的Internet Protocol部分。在“listing of captured packets” 窗口,你会看到许多后续的ICMP消息(或许还有你主机上运行的其他协议的数据包)

思考下列问题:

 你主机发出的一系列ICMP消息中IP数据报中哪些字段总是发生改变?  哪些字段必须保持常量?哪些字段必须改变?为什么?  描述你看到的IP数据包Identification字段值的形式。

(3)找到由最近的路由器(第一跳)返回给你主机的ICMP Time-to-live exceeded消息。 思考下列问题:

 Identification字段和TTL字段的值是什么?

 最近的路由器(第一跳)返回给你主机的ICMP Time-to-live exceeded消息中这些值是否保持不变?为什么?

(4)单击Time列按钮,这样将对捕获的数据包按时间排序。找到在将包大小改为2000字节后你的主机发送的第一个ICMP Echo Request消息。

23

思考下列问题:

 该消息是否被分解成不止一个IP数据报?

 观察第一个IP分片,IP头部的哪些信息表明数据包被进行了分片?IP头部的哪些信息表明数据包是第一个而不是最后一个分片?该分片的长度是多少?

A. 找到在将包大小改为3500字节后你的主机发送的第一个ICMP Echo Request消息。 思考下列问题:

 原始数据包被分成了多少片?

 这些分片中IP数据报头部哪些字段发生了变化?

6. 实验报告

要求学生撰写实验报告对利用Ethereal分析TCP、UDP协议和ICMP协议的实验过程、发现的问题、得到的结果、对协议的认识等内容进行总结(可结合每个实验后面的思考题进行分析、总结)。

24

实验四:常用网络命令及主要网络配置文件的认识与应用

1、实验目的

掌握常用网络命令的功能及使用方法;了解主要网络配置文件的结构与作用;学会利用网络命令和配置文件进行简单网络状态分析及故障排除。

2、实验环境

 Windows 9x/NT/2000/XP/2003;  TCP/IP协议。 3、实验内容

1)掌握常用网络命令的功能及使用方法,包括PING,Nslookup,IPConfig,TraceRT(TraceRoute),NetStat,ARP等。

2)了解主要网路配置文件的结构和作用,包括HOSTS,LMHOSTS,Networks等。

4、实验方式

每位同学上机实验,实验指导教师现场指导。 5、实验过程

(一)学习ping命令的使用

通过ping命令实现如下操作,并回答相应的问题。

(1)向主机www.hit.edu.cn发送10次数据长度为1024字节的报文进行测试网络连通情况,网络是否畅通?从目标主机返回来的应答报文都包含哪些信息?

(2)向主机www.hit.edu.cn发送长度为4096字节的不允许分段的报文,你看到了什么现象?产生这个现象的原因是什么?

(3)向主机www.baidu.com发送生存时间为3的报文,你看到了什么现象?产生这个现象的原因是什么?

(4) 向主机www.mit.edu发送报文,你看到了什么现象?产生这个现象的原因是什么?

(二)学习Nslookup命令的使用 (1)nslookup命令的作用是什么?

(2)使用nslookup命令来查询www.hit.edu.cn的ip地址,都返回了哪些信息,各部分的意义是什么?

(3)查询www.google.cn的ip地址,都返回了哪些信息,各部分的意义是什么?

(4)本机的默认dns服务器的地址是多少?将本机默认dns服务器改为220.118.224.101或者202.118.224.100。查询www.baidu.com的ip地址。将本机默认dns服务器改为202.118.224.241,再查询www.baidu.com的ip地址,看到了什么现象?

(三)学习TraceRT命令的使用

25

(1)查看本机到www.baidu.com所经过的路由的列表。总共经过了多少个路由?

(2)查看本机到www.baidu.com所经过的路由的列表,参数设成不解析ip地址到主机名。与第(1)问相比你看到了什么现象?解析其原因。

(3)将最大跳数设成3,再查看本机到www.baidu.com所经过的路由的列表。看到了什么现象?解释其原因。

(四)学习NetStat命令的使用

(1)查看当前全部的连接,各个连接的选项都由那几部分组成?

(2)分别查看当前的TCP和UDP连接。各个连接的状态都由哪几种?

(3)查看路由表,路由表都由哪几个部分组成?你能理解路由表中每个条目的意义吗?

(五)学习ARP命令的使用

(1)查看本机的IP-to-Physical地址转换表,本机的转换表中有几列,每列的意义是什么?

(2)删除地址转换表的全部表项,并查看转换表,使用浏览器访问www.hit.edu.cn主机,然后在查看转换表,有哪些现象发生,解释其原因。

(3)向转换表中添加一项信息:192.168.3.2 00-aa-00-62-c6-09,再使用浏览器访问www.hit.edu.cn主机,有哪些现象发生,解释其原因。

(六)熟悉HOSTS文件

查看HOSTS文件,回答下列问题: (1)HOSTS文件都有哪些作用?

(2)HOSTS文件中每个条目都由哪几个部分组成?都表示什么含义? (3)通过修改HOSTS文件的方法屏蔽www.baidu.com。

(七)了解LMHOSTS和Networks文件 查看上述两个文件,回答下列问题:

LMHOSTS和Networks文件都由哪些作用?文件中每个条目都由哪几个部分组成?都表示什么含义?

6、参考内容:

(一) 网络命令参考 (1)Ping

校验与远程计算机或本地计算机的连接。只有在安装 TCP/IP 协议之后才能使用该命令。

Ping主要有以下命令:

[-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [[-j computer-list] | [-k computer-list]] [-w timeout] [destination-list]

参数

-t 校验与指定计算机的连接,直到用户中断。 -a 将地址解析为计算机名。

-n count 发送由 count 指定数量的 ECHO 报文,默认值为 4。 -l length 发送包含由 length 指定数据长度的 ECHO 报文。默认值为 字

26

节,最大值为 8192 字节。

-f 在包中发送“不分段”标志。该包将不被路由上的网关分段。 -i ttl 将“生存时间”字段设置为 ttl 指定的数值。 -v tos 将“服务类型”字段设置为 tos 指定的数值。

-r count 在“记录路由”字段中记录发出报文和返回报文的路由。指定的 Count 值最小可以是 1,最大可以是 9 。

-s count 指定由 count 指定的转发次数的时间邮票。 -w timeout 以毫秒为单位指定超时间隔。

关于 Ping 的详细信息

Ping 命令通过向计算机发送 ICMP 回应报文并且监听回应报文的返回,以校验与远程计算机或本地计算机的连接。对于每个发送报文, Ping 最多等待 1 秒,并打印发送和接收把报文的数量。比较每个接收报文和发送报文,以校验其有效性。默认情况下,发送四个回应报文,每个报文包含 字节的数据(周期性的大写字母序列)。

可以使用 Ping 实用程序测试计算机名和 IP 地址。如果能够成功校验 IP 地址却不能成功校验计算机名,则说明名称解析存在问题。这种情况下,要保证在本地 HOSTS 文件中或 DNS数据库中存在要查询的计算机名。

下面显示 Ping 输出的示例:(Windows用户可用:开始->运行,输入\"command\" 调出command窗口使用此命令)

C:\\>ping www.hit.edu.cn

Pinging www.hit.edu.cn [202.118.224.25] with 32 bytes of data: Reply from 202.118.224.25: bytes=32 time=1ms TTL=62 Reply from 202.118.224.25: bytes=32 time<1ms TTL=62 Reply from 202.118.224.25: bytes=32 time<1ms TTL=62 Reply from 202.118.224.25: bytes=32 time<1ms TTL=62

(2)Nslookup NAME 打印有关使用默认服务器的主机/域 NAME 的信息 NAME1 NAME2 同上,但将 NAME2 用作服务器 help or ? 打印有关常用命令的信息 set OPTION 设置选项 all 打印选项、当前服务器和主机 [no]debug 打印调试信息 [no]d2 打印详细的调试信息 [no]defname 将域名附加到每个查询 [no]recurse 询问查询的递归应答 [no]search 使用域搜索列表 [no]vc 始终使用虚拟电路

domain=NAME 将默认域名设置为 NAME srchlist=N1[/N2/.../N6] 将域设置为 N1,并将搜索列表设置为 N1、N2 等

root=NAME 将根服务器设置为 NAME

27

将重试次数设置为 X 将初始超时间隔设置为 X 秒

设置查询类型(如 A、AAAA、A+AAAA、ANY、CNAME、MX、NS、PTR、SOA 和 SRV)

querytype=X 与类型相同 class=X 设置查询类(如 IN (Internet)和 ANY) [no]msxfr 使用 MS 快速区域传送 ixfrver=X 用于 IXFR 传送请求的当前版本 server NAME 将默认服务器设置为 NAME,使用当前默认服务器 lserver NAME 将默认服务器设置为 NAME,使用初始服务器 root 将当前默认服务器设置为根服务器

ls [opt] DOMAIN [> FILE] - 列出 DOMAIN 中的地址(可选: 输出到文件 FILE)

-a 列出规范名称和别名 -d 列出所有记录 -t TYPE 列出给定 RFC 记录类型(例如A、CNAME、MX、

NS和PTR等)的记录

view FILE 对 'ls' 输出文件排序,并使用 pg 查看 exit 退出程序

(3)TraceRT(TraceRoute)

retry=X timeout=X type=X

用法: tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] [-R] [-S srcaddr] [-4] [-6] target_name

选项: -d 不将地址解析成主机名。 -h maximum_hops 搜索目标的最大跃点数。 -j host-list 与主机列表一起的松散源路由(仅适用于 IPv4)。 -w timeout 等待每个回复的超时时间(以毫秒为单位)。 -R 跟踪往返行程路径(仅适用于 IPv6)。 -S srcaddr 要使用的源地址(仅适用于 IPv6)。 -4 强制使用 IPv4。 -6 强制使用 IPv6。

(4)NetStat

显示协议统计和当前 TCP/IP 网络连接。

NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-t] [interval] -a 显示所有连接和侦听端口。 -b 显示在创建每个连接或侦听端口时涉及的可执行程序。在某些

情况下,已知可执行程序承载多个的组件,这些情况下,显示创建连接或侦听端口时涉及的组件序列。此情况下,可执行程序的名称位于底部[]中,它调用的组件位于顶部,直至达到 TCP/IP。注意,此选项可能很耗时,并且在您没有足够权

28

限时可能失败。

-e 显示以太网统计。此选项可以与 -s 选项结合使用。 -f 显示外部地址的完全限定域名(FQDN)。 -n 以数字形式显示地址和端口号。 -o 显示拥有的与每个连接关联的进程ID。 -p proto 显示 proto 指定的协议的连接;proto 可以是下列任何一个:

TCP、UDP、TCPv6 或 UDPv6。如果与 -s 选项一起用来显示每个协议的统计,proto 可以是下列任何一个: IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP UDPv6。

-r 显示路由表。 -s 显示每个协议的统计。默认情况下,显示IP、IPv6、ICMP、

ICMPv6、TCP、TCPv6、UDP 和 UDPv6统计;

-p 选项可用于指定默认的子网。 -t 显示当前连接卸载状态。 Interval 重新显示选定的统计,各个显示间暂停的间隔秒数。按

CTRL+C 停止重新显示统计。如果省略,则 netstat打印当前的配置信息一次。

(5)ARP

显示和修改地址解析协议(ARP)使用的“IP 到物理”地址转换表。 ARP -s inet_addr eth_addr [if_addr] ARP -d inet_addr [if_addr]

ARP -a [inet_addr] [-N if_addr] [-v] -a 通过询问当前协议数据,显示当前 ARP 项。如果指定 inet_addr,则只显示指定计算机的 IP 地址和物理地址。如果不止一个网络接口使用 ARP,则显示每个ARP 表的项。

-g 与 -a 相同。 -v 在详细模式下显示当前 ARP 项。所有无效项和环回接口上的项都将显示。

inet_addr 指定 Internet 地址。 -N if_addr 显示 if_addr 指定的网络接口的 ARP 项。 -d 删除 inet_addr 指定的主机。inet_addr 可以是通配符 *,以删除所有主机。

-s 添加主机并且将 Internet 地址 inet_addr物理地址 eth_addr 相关联。物理地址是用连字符分隔的 6 个十六进制字节。该项是永久的。

eth_addr 指定物理地址。 if_addr 如果存在,此项指定地址转换表应修改的接口的 Internet 地址。如果不存在,则使用第一个适用的接口。

示例:

> arp -s 157.55.85.212 00-aa-00-62-c6-09 添加静态项。 > arp -a 显示 ARP 表。

(二)网络配置文件

29

(1)HOSTS

用记事本打开hosts文件,首先看见了微软对这个文件的说明。这个文件是根据TCP/IPforWindows的标准来工作的,它的作用是包含IP地址和Host name(主机名)的映射关系,是一个映射IP地址和Hostname(主机名)的规定,规定要求每段只能包括一个映射关系,IP地址要放在每段的最前面,空格后再写上映射的Host name(主机名)。对于这段的映射说明用“#”分割后用文字说明。

HOSTS 的工作方式 在网络上访问网站,要首先通过DNS服务器把网络域名(www.XXXX.com)解析成61.XXX.XXX.XXX的IP地址后,计算机才能访问。如果对于每个域名请求都要等待域名服务器解析后返回IP信息,这样访问网络的效率就会降低,而Hosts文件就能提高解析效率。根据Windows系统规定,在进行DNS请求以前,Windows系统会先检查自己的Hosts文件中是否有这个地址映射关系,如果有则调用这个IP地址映射,如果没有再向已知的DNS 服务器提出域名解析。也就是说Hosts的请求级别比DNS高。

HOSTS的作用 1〉加快域名解析

对于要经常访问的网站,可以通过在Hosts中配置域名和IP的映射关系,这样当输入域名计算机就能很快解析出IP,而不用请求网络上的DNS服务器。

2〉方便局域网用户 在很多单位的局域网中,会有服务器提供给用户使用。但由于局域网中一般很少架设

DNS服务器,访问这些服务要输入难记的IP地址,对不少人来说相当麻烦。现在可以分别给这些服务器取个容易记住的名字,然后在Hosts中建立IP映射,这样以后访问的时候输入这个服务器的名字就行了。

3〉屏蔽网站

现在有很多网站不经过用户同意就将各种各样的插件安装到你的计算机中,有些说不定

就是木马或病毒。对于这些网站我们可以利用Hosts把该网站的域名映射到错误的IP或自己计算机的IP,这样就不用访问了。在Hosts写上以下内容:

127.0.0.1#屏蔽的网站 0.0.0.0#屏蔽的网站

这样计算机解析域名就解析到本机或错误的IP,达到了屏蔽的目的。 4〉顺利连接系统

对于Lotus的服务器和一些数据库服务器,在访问时如果直接输入IP地址那是不能访

问的,只能输入服务器名才能访问。那么配置好Hosts文件,这样输入服务器名就能顺利连接了。

最后要指出的是,Hosts文件配置的映射是静态的,如果网络上的计算机更改了请及时更新IP地址,否则将不能访问。

HOSTS文件的使用

30

存放地址:C:\\WINDOWS\\system32\\drivers\\etc(WindowsXP中)

作用:实现域名本地解析。我们上网时会首选搜索Hosts这个文件是否有相关的解析,如果没有才会通过网络服务的服务器进行解析。如果我们将某个服务器地址与错误的IP地址对应,并存入在Hosts文件,那么该服务器就不能正常访问了,从而间接实现禁止登陆某网站的目的。

格式:IP地址 域名 #注释 举例:

要求:在浏览器输入http://www.orchidy.com 让它自动指向 本机服务器localhost,从而实现地址解析,而且屏蔽了对www.orchidy.com的访问。

方法:在hosts文件中 显示:127.0.0.1 www.orchidy.com #注释

(2)LMHOSTS

LMHOSTS 文件是个纯文本文件,微软提供了一个示例程序 LMHOSTS.SAM,位于 C:\\WinNT\\System32\\Drivers\\Etc 目录下。如果我们需要启用 LMHOSTS 文件查询,则应该将其改名为 LMHOSTS,当然推荐的方法是制作副本(即另存为 LMHOSTS),这样可免除将原文件失手改错而不得不从安装光盘里解压还原出来的麻烦。下面是LMHOSTS 文件的部分内容:

#

# The following example illustrates all of these extensions: #

# 102..94.97 rhino #PRE #DOM:networking #net group's DC # 102..94.102 \"appname \\0x14\" #special app server # 102..94.123 popular #PRE #source server

# 102..94.117 localsrv #PRE #needed for the include #

# #BEGIN_ALTERNATE

# #INCLUDE \\\\localsrv\\public\\lmhosts # #INCLUDE \\\\rhino\\public\\lmhosts # #END_ALTERNATE #

# end of this file.

由上面的示例我们可以看出,LMHOSTS 文件跟我们在前面已经接触过的 HOSTS 文件的格式一样,当然其规则也一样,比如:

#字符是用来注释的;

IP 地址必须放在一行的第一栏,地址和主机名之间必须有空格; 计算机名称最长为 16 个字符,但是只能输入 15 个。

但是与 HOSTS 不同的是,LMHOSTS 文件中可以指定执行某种特殊功能的特定的命令。它们也是用 # 标记的,但如果看到有下面的特殊字符串,则表明其为命令字:

#PRE——这个命令放在 IP 地址和名称后面,表示当系统启动时,先将这个地址预先载入(Preload)到 Cache(内存高速缓存)中。查询时,系统先从 Cache 中开始,如果失败,再利用广播,再失败,才到本 LMHOSTS 文件中顺序读取。

#DOM:domain_name——这个命令放在计算机 NetBIOS 名字之后,表明它是一个域控制器(Domain Controller),这里 domani_name 是域名,表明该控

31

制器属于哪一个域。

#INCLUDE ——这个命令表明将 filename 所指向的另一个 LMHOSTS 文件加入到本文件中,系统从该文件中读取 IP 地址和 NetBIOS 名字。其好处是集中管理 LMHOSTS 文件,即可以将所有用户共享的 LMHOSTS 文件放到服务器上,每个用户再利用 #INCLUDE 命令把它添加到自己的 LMHOSTS 文件中。

#BEGIN_ALTERNATE 和 #END_ALTERNATE 命令必须配套使用,它们的作用是可以在一个 LMHOSTS 文件中指定多个 #INCLUDE 命令,即是说,如果我们有两个以上的域控制器,那么我们就可以 INCLUDE 其上的的 LMHOSTS 文件,一旦某个控制器坏掉,可立即用别的域控制器来替代。

\\0xnn——这里的 \\0xnn 命令是用来在 LMHOSTS 文件中指定包含非打印字符(Non-Printable)的 NetBIOS 名字,它们必须用引号括起来。

关于 Preload 的特别说明:

一个 LMHOSTS 文件中最多只允许 Preload 100 个 IP 地址和计算机名称 #INCLUDE 命令所指向的文件中的所有项都必须加上 #PRE 命令 修改注册表增加预载数目:主键

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Netbt\\Parameters,

新建字符串值 MaxPreLoads,输入自己想要的数目。

LMHOSTS的使用

安装过 Windows NT 4.0 Server 的同学很清楚,就是如果安装了 TCP/IP 协议,则我们

依次选取“开始”/“设置”/“控制面板”/“网络”/“协议”/“TCP/IP 通信协议”/“属性”/“WINS 属性”,则可以在当前页框里看见,系统默认的是“启用 LMHOSTS 查询”,同时还可以启用的是“启用 DNS ”。按照我们前面讲到的,如果想要使用保存在其他目录中甚或其他计算机中的 LMHOSTS 文件,则可以单击旁边的“导入 LMHOSTS”按钮来获取。

LMHOSTS 文件的应用场合是没有 WINS 服务器的网络环境,引入 LMHOSTS 文件的目的

是用来解决广播方式无法跨越路由器的局限的,LMHOSTS 文件与广播方式相辅相行实现网段内外的全通信。这里我们再来看一下它们的的工作进程:

1、系统启动时将 LMHOSTS 文件中被设为#PRE的地址和机器名预载到内存中;

2、客户端发出查询请求时,先在 Cache 中检查是否已存在目的 IP 地址; 3、如果在 Cache 中没有找到,系统改用广播方式再次查找; 4、如果广播查询还是没有找到,就得用到 LMHOSTS 文件了;

5、如果找到了,则把它也添加到 Cache 中保存起来,如果还是没有找到,发送错误

信息到客户端。

(3)Networks

32

Networks 为TCP/IP管理提供网络名到网络ID的解析。下面是文件样例: #Copyright(c) 1993-1999 Microsoft Corp. #

#This file contains network name/network number mappings for

#local networks. Network numbers are recognized in dotted decimal form. #

#Format: #

# [aliases„] [#] #

#For example: #

# loopback 127

# campus 284.122.107 # London 284.122.108

loopback 127

networks文件定义了网络名和网络号的对应关系。 格式为:

网络名 网络号 别名 如:#more /etc/networks main1 112.232.32.0

其中:定义了网络112.232.32.0的网络名为main1。

7、实验报告

要求撰写实验报告描述各个实验过程以及遇到的问题,回答报告中的问题,总结对相应内容的认识。相关问题可以直接使用操作截图来回答。

33

附录

1. JDK简介

JDK是SUN公司提供的Java开发和运行环境。JDK提供了程序员可用来更好地制作并更快运行其程序的扩展类库。Java类库是一组预先开发的程序码,它可以与单独的应用程序相链接。Java类库给程序员提供了一个彻底经过测试的健壮性很好的类集合。通过使用这些类库,程序员就不需要重新编写这些代码,从而节约了时间,提高了效率。下面是安装了JDK之后的主要文件和目录结构:

java

____________|______________________________ | | | bin lib jre

| | ___________________|___________

java.exe tools.jar | |

javac.exe dt.jar bin lib javap.exe ___________|________ ________________|_________ javah.exe | | | | | | | javadoc.exe java.exe classic hotspot rt.jar ext security applet

appletviewer.exe java.dll | | i18n.jar awt.dll jvm.dll jvm.dll

下面将介绍一些主要Java工具的使用,在JDK环境中的Java主要工具如下: * appletviewer 小应用程序浏览器 * java 解释器 * javac 编译器

* javah 头文件生成器 * javadoc API文档生成器 * javap 类文件反汇编器 * jdb Java 语言调试器

这些文件包括在/java/bin/目录中,并可以在任何目录中运行,前提是你在设置运行程序的系统中设置了路径。

2. Appletviewer小应用程序浏览器

Appletviewer 提供了一个Java运行环境,在其中可测试小应用程序Applet。Appletviewer读取包含小应用程序的HTML文件并在一个窗口中运行它们。

在小应用程序的菜单选择中有如下几个选项: * Restart: 重新运行小应用程序

* Reload:重新调取小应用程序。如果.class文件在读取后被改变,此命令将是很有用的。

* Clone:按照HTML文件的命令行变量创建一个新的appletviewer窗口。 * Tag:显示用在HTML文件中的标签,以启动小应用程序。 * Info:提供关于小应用程序的有用信息。

34

* Properties: 此命令允许为appletviewer设置不同的网络和安全配置。交四个对话框允许appletviewer指定HTTP proxy代理服务者及firewall proxy代理服务者运行。这需要知道上述两个proxy代理的地址和端口号,你可以从你的站点管理者那里得到这些信息。网络访问安全性控制包括不同级别的安全性, 包括禁止网络访问。只允许访问小应用程序的主机、无访问。类访问选择合你能够指定在机器上是否对类访问进行。

Appletviewer 是一个基本的工具,和HTML相仿,它处理并显示了Java 小应用程序。Java小应用程序只是全部WWW页面中的一部分,观察小应用程序在其余HTML文件中的适应情况是十分重要的。因此,必需有一个全功能浏览器如 Netscape 或 HotJava。

Appletviewer唯一的可选项就是debug,它将在 Java 语言调试器 jdb 中启动 appletviewer。

3. Java解释器

Java解释器可用来直接解释执行Java字节代码,具体命令行格式如下: C:\\>java options className arguments className必须包括所有软件包信息。不仅有类名本身,还有Java 解释器所期望的类名(不是Java字节代码的文件名),所有在解释器环境下运行的类都必须包括解释器第一次调用时所需的main成员函数,用以传递命令所带的变量。

public static void main(string args[]) {

...... }

下表包括了Java解释器的所有选项。

选项 功能

────────────────────────────── -cs –checksource 此选项让解释器重编译Java源文件已更新的类--重编译已

改变过了的类。

-classpath path 此选项重写CLASSPATH环境变量,告诉Java在哪里能找到类

库。如果其中用冒号分开,则可能包含多个目录。

-mx x 此选项设置内存分配池的最大值。所指定的池必须大于1,0

00字节。另外“K”,“M”可附加在数字上指定是千字节还是兆字节。缺省值是16MB。

-ms x 此选项设置内存分配池的最小值。所指寂的池必须大于1,0

00字节。另外,“K”,“M”可加在数字上指定的是千字节还是兆字节。缺省值是1Mb。

-noasyncgc 此选项关闭异步无用单元收集功能,只有在程序中调用它或

内存溢出的时候,无用单元收集才会被激活。

-ss x 此选项将C线程栈的最大值设置为x,x必须大于1KB,其设定

方式同 -ms。

-oss x 此选项设定Java堆栈最大值为x。 -v,-verbose 此选项告知Java每当类被调用之时,向标准输出设备输出信

35

-verify

-verifyremote -noverify -verbosegc -t -debug

-D propName=newVal

息。

此选项告知Java在所有代码上使用校验。

此选项告知Java 仅仅对类载入器所载入的类进行校验。 此选项告知Java不进行校验。

此选项告知Java让无用单元收集器在它释放内存时显示一条信息。

此选项在Java-g解释器中是可用的,并把执行的情况逐条打印出来。

此选项允许Java调试器与本次Java 解释器会话相联接。它运行时,Java会显示一个密码,用于启动这次调试会话。 此选项允许用户在运行时改变属性值。

4. Javac编译器

Javac编译器读取Java源代码,并将其编译成字节代码,调用Javac的命令行如 下: C:\\>javac options filename.java

值得注意的是,和Java解释器不同,Javac 编译器期望它正在编译的文件具有扩展名.Java。其命令行如下表:

选项 功能

───────────────────────────────

-classpath path 此选项用于设定路径,在该路径上Javac寻找需被调用的

类。该路径是一个用分号分开的目录列表。

-d directory 此选项指定一个根目录。该目录用来创建反映软件包继承

关系的目录数。

-g 此选项在代码产生器中打开调试表,以后可凭此调试产生

字节代码。

-nowarn 此选项禁止编译器产生警告。 -O 此选项告诉javac优化由内联的static、final以及privit

e成员函数所产生的代码。

-verbose 此选项告知Java显示出有关被编译源文件和任何被调用类

库的信息。

5. javah头文件生成器

javah程序创建C头文件和存根文件,这些是把本地C成员函数包入java 所需要的。被创建的头文件给出了有关java类的信息,这些信息是C成员函数与java类交换数据所必需的。存根文件将用来创建将定义java对象的结构与java对象本身数据相联系的C文件。调用javah的命令行如下:

C:\\>javah options classname additionalClasses javah程序有些象java解释器,它只需要类名而不需要写.class扩展名。javah程序可接受多个类名以产生文件头和存根文件,下面列出了 javah程序命令行选项。

36

选项 功能

───────────────────────────────

-o outputfile 此选项告诉javah将产生的所有文件头或存根文件都

放到一个单独的文件\"outputfile\"中。

-d directory 此选项告知javah把产生的文件头或存根文件放入给

定目录。

-td directory 此选项告知javah 程序把临时文件放入目录\"dirrcto

ry\"而不是tmp目录中。

-stubs 此选项告知javah将产生存根文件而非头文件。 -verbose 此选项告知javah将产生文件的状态输出到标准输出

设备。

-classpath path 此选项告知javah用\"path\"目录寻找类文件,多个目录

之间应用分号分开。

6. javap反汇编器

javap命令反汇编一个java字节代码文件, 返回有关可变部分和成员函数的信息,

其命令行如下:

C:\\>javap options classname additionalClasses javap的标准输出是公有变量和类的成员函数。下面是一个输出实例, 它显示的是用javap处理一个简单的java小应用的字节代码所得的结果。javap反汇编器的命令行选项如下: 选项 功能

─────────────────────────────── -h 此选项将建立能够放入C头文件中的信息。

-p 此选项将使javap输出私有和公有的成员函数和变量。

-c 此选项将使javap为各成员函数输出实际已编译过的字节代码。 -classpath path 此选项将使得javap在路径path中寻找Java类。 -v 输出所有的信息

-verify 运行校验器以验证并显示出调试信息 -version 输出javap的版本信息

7. Java调试器jdb

Java调度器为Java程序提供了一个命令行调试环境。它既可在本地,也可在与远程的解释器的一次对话中执行。

jdb于本地机器中可用如下的命令启动:

C:\\>jdb classname

当你使用-debug选项开始一个Java例程时, 必须提供给Jdb 一个密码, 这样Jdb才能开始运转起来。表2-5包含了所有jdb命令。

命令 功能

───────────────────────────────

37

catch calssID 为特定异常出口而中断 classes 列出当前已知的类 clear classID:line 清除一个断点 cont 从断点处继续执行 down[n frames] 下移一个线程的堆栈 dump ID[ID...] 显示所有对象信息 exit(或quit) 退出调试器 help(或?) 列出所有命令

ignore classID 忽略特定的异常出口 list[line number] 显示源代码

load classbame 载入要调试的Java类

locals 当前堆栈帧中显示所有局部变量 memory 报告内存使用情况

methods classID 列出一个类的成员函数集 print ID[ID...] 列出对象或域

resume [threadID...] 恢复线程(默认情况恢复所有线程) run class [args] 开始执行已下载的Java类 step 执行当前行

stop in classID:method 在一成员函数中设一断点 stop at classID:line 在一行设一断点

suspend[threadID...] 停止一个线程(默认情况停止所有线程) threads threadgroup 列出线程 thread threadID 设置当前线程 threadgroups 列出线程组 threadgroup name 设置当前线程组 up [n frames] 上移一个线程堆栈 use [path] 显示或改变源程序路径 where [threadID] or all 使一线程的堆线置空 !! 重复上一次命令

除了调试期间可用的命令,还有两个可选的命令行变量。它们可用于远程调试。具体用法如下所示:

-host hostname 该命令告诉Jdb到哪里去建立远程运行的Java解释器对话过程。 -password password 本选项告诉Jdb 用哪个密码去与远程运行的Java 对话进程相连接。 密码password是由运行带有-debug选项的Java解释器所提供的。

8. Javadoc API文件产生器

Javadoc程序读取一个Java类文件并自动创建一组HTML文件,这些HTML 文件描述了Java类文件的类、变量、成员函数,所有Java类库的APIHTML 文件都可以由此程序创建。Javadoc把软件包名或源文件列表当做一个变量。Javadoc依靠以@打头的备注标记来创建HTML文件,下面就是标注的列表,它们被Javadoc用于在HTML 文件中创建链接。

38

标记 功能

─────────────────────────────── @see classname 此标注在类列表中增加一个到所提供类的\"See Al

so\"条目。

@see classname # method- 此标注创建一个到特定的成员函数的\"See name A

lso\"条目。

@version text 此标注在HTML文件中加入一个版本信息条目。 @author text 此标注在HTML文件中加入一个作者信息条目。 @param name description 此标注用成员函数备注来描述一个成员函数所带

变量。

@return description 此标注用成员函数备注来描述返回值。 @exception classname 此标注用成员函数备注来连接成员函数产生的异

常出口。

除此以外,Javadoc还可以使用两个命令行参数:

-classpath path 此命令行指定寻找Java文件的目录 -d directory 此命令行指定用来放入最终HTML文件十分有用。通

过对它的使用,可让你在源码中加入更多的注释,这对提高程序的可读性来说是非常有用的。

9. JDK开发应用程序举例

1)设置运行环境 建立一批处理文件,设置Java运行时所需的环境变量。如在开发目录中建立的批处理文件为Setenv.bat,包含以下命令:

PATH c:\\java\\bin

//c:\\java\\为JDK安装目录保存并运行此批处理文件。 2)建立Java应用程序

在文本编辑工具中输入以下代码,保存文件名为: HelloWorldApp.java /**

* The HelloWorldApp class implements an application that * simply displays \"Hello World!\" to the standard output. */

class HelloWorldApp {

public static void main(String[] args) {

System.out.println(\"Hello World!\"); //Display the string. } }

3) 编译并运行程序

编译:javac HelloWorldApp.java

编译后,在目录中会生成一个HelloWorldApp.class文件。

39

运行:java HelloWorldApp 在屏幕中输出“Hello World!” 注意输入文件名时要区分大小写。

40

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务