2002年度网络设计师级下午试卷

本试卷的 5 道试题都是必答题,请全部解答。每题 15 分,满分75分。
试题一

阅读以下说明,回答问题 1 至问题 4,将解答填入答题纸的对应栏内。

【说明】

设有 A,B,C,D 四台主机都处在同一个物理网络中,A 主机的 IP 地址是 192.155.12.112,B 主机的IP 地址是 192.155.12.120,C 主机的 IP 地址是 192.155.12.176,D 主机的 IP 地址是 192.155.12.222。共同的子网掩码是 255.255.255.224。

【问题1】

 A,B,C,D 四台主机之间哪些可以直接通信?哪些需要通过设置网关(或路由器)才能通信?请画出网络连接示意图,并注明各个主机的子网地址和主机地址。

 【问题2】

 若要加入第五台主机 E,使它能与 D 主机直接通信,其 IP 地址的设定范围应是多少?

【问题3】

不改变 A 主机的物理位置,将其 IP 地址改为 192.155.12.168,试问它的直接广播地址和本地广播地址各是多少?若使用本地广播地址发送信息,请问哪些主机能够收到?

【问题4】

若要使主机 A,B,C,D 在这个网上都能直接相互通信,可采取什么办法?

 

试题二

阅读以下有关网络接入方案的说明,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。

【说明】

某单位己完成了主干网络的建设任务,现在需要对其职工住宅区的用户接入主干网的技术方案作选型设计。职工住宅已有的通信条件是:(1)电话线 (2)电视缆。在不重新布线的前提下,以下 5 种技术方案可供选择:(1)异步拨号 (2)ISDN (3)ADSL (4)Cable Mode (5)无线扩频技术。

【问题1】

若采用电话线方式上网,并按要求在计算机连入网络的同时能通电话,连网速率高于500Kbps,可以选用哪种技术方案?其最高通信速率为多少?

【问题2】

若采用电视铜缆接入计算机主干网络,用户端需增添什么设备?网络通信速率为多少?

【问题3】

依据 ISO/OSI 参考模型对无线扩频网络设备进行分类,可以分为哪几种类型?用无线扩频设备实现网络互连需要何种配套设备?

 

试题三

阅读以下有关网络结构的说明,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。

【说明】

如图所示,GSW 为千兆以太网交换机,内设 ATM 模块。SWI 为100M/l000Mbps 以太网交换机,SWZ为ATM/100Mbps 以大网交换机,RT 为中心路由器; S1 和 S2 为服务器,分别经千兆以太网卡和 155M ATM 网卡与 GSW(千兆以太网交换机)和 ATM 交换机相连,PC1、SI、SZ、PC4 划在 VLAN1 中,PC2、PC5 划到 VLAN2 中,PC3、PC6 划到 VLAN3 中。

【问题1】

为了实现 VLAN1,VLAN2 和 VLAN3 的虚拟网络划分,在 ATM 和 RT 路由器中应设置哪几种服务协议?(如 BUS)

【问题2】

试述从 PC1 发送一个 IP 包到 PC4 数据封装与解封的全过程。

【问题3】

试述从 PC1 发送一个 IP 包到 PC2 的路由计算过程和传送路径。

 

试题四

阅读以下有关网络设备安装与调试的叙述,分析设备配置文件,回答问题 1 至问题 3,把解答填入答题纸的对应栏内。

虚拟局域网(Virtual LAN)是与地理位置无关的局域网的一个广播域,由一个工作站发送的广播信息帧只能发送到具有相同虚拟网号的其他站点,可以形象地认为,VLAN 是在物理局域网中划分出的独立通讯区域。 在以交换机为核心的交换式局域网络中,VLAN 技术应用广泛,其优势在于控制了网络上的广播风暴,增加了网络的安全性,利于采用集中化的管理控制。其中,基于端口的 VLAN 划分方式较为常见,通过将网络设备的端口划归不同的 VLAN 实现广播帧的隔离。

【问题1】

请指出现有虚拟局域网络的四种划分方式。

【问题2】

在基于端口的VLAN划分中,交换机上的每一个端口允许以哪三种模式划入 VLAN 中,并简述它们的含义。

【问题3】

以下为 Cisco 以太网交换机 Catalyst 2924(ws-c2924xlA,拥有 24 个 10/100M 自适 应端口)的VLAN 划分命令,请解释【l】~【3】处的标有下划线部分配置命令的含义。(“//”后为注释内容)

switch> en //进入特权执行态

switch# config term //进入通用配置状态

switch(config)# interface vlan 1 //配置 vlan 1(ID为 1的 Vlan) 

【l】(此处有2条下划线)

switch(config-if)#  ip address 202.112.111.23 255.255.255.0

switch(config-if)#  management

switch(config-if)#  exit         //退出对 vlan 的配置状态

......

......

switch(config)#  interface fa0/1 //配置第一模块的第 2 个端口

【2】(此处有2条下划线)

switch(config-if)#  switchport mode access

switch(config-if)#  switchport acess vlan

switch(conflg-if)#  exit //退出对端口的配置状态

......

......

switch(config)# interface fa0/2  //配置第一模块的第 3 个端口

【3】(此处有2条下划线)

switch(config-if)#  switchport mode multi

switch(config-if)#  switchport multi vlan add 2,3

switch(config-if)#  exit //退出对端口的配置状态

 

试题五

请阅读以下说明和 Socket 程序,将应填入___(n)___处的字句写在答题纸的对应栏内。

【说明】

网络应用的基本模型是客户机/服务器模型,这是一个不对称的编程模型,通信的双方扮演不同的角色:客户机和服务器。

一般发起通信请求的应用程序称为客户软件,该应用程序通过与服务器进程建立连接,发送请求,然后等待服务器返回所请求的内容。服务器软件一般是指等待接收并处理客户机请求的应用程序,通常由系统执行,等待客户机请求,并且在接收到请求之后,根据请求的内容,向客户机返回合适内容。

本题中的程序较为简单,客户机接收用户在键盘上输入的文字内容,服务器将客户机发送来的文字内容直接返回给客户机,在通信过程中服务器方和客户机方都遵守的通信协议如下:

由客户机首先发送请求,该请求由首部和内容两大部分组成,两个部分各占一行文字,通过行结束符 '\n'隔离。

首部只有一个 Length 域,用于指定请求的内容部分的长度,首部的结构为:'关键词Length'+''+ 数值 +'\n’

内容部分为一行文字,其长度必须与 Length 域的数值相符 例如,客户机的请求为“Length 14\nHello,my baby!”,服务器接收请求处理后返回文字“Hello,my baby!”。

<注:Socket 函数与数据结构,以及用户自定义函数的解释见附录一>

【Socket程序】

服务器主程序部分:

#include<stdio.h>

……//引用头文件部分略>

#define SERVER_PORT 8080 //服务器监听端口号为8080

#define BACKLOG  5       //连接请求队列长度

int main( int argc, char *argv[ ]){

int listenfd,connfd   //监听套接字、连接套接字描述符

struct sockaddr_in servaddr;//服务器监听地址

listenfd =___(1)___; //创建用于监听的套接字

if (listenfd<0){ 

fprintf( stderr,"创建套接字错误!")

exit(1);

 }  //套接字创建失败时打印错误信息

bzero(&servaddr.sizeof(servadd));//将地址结构置空

servaddr.sin_family = AF_INET;  //设置地址结构遵循 TCP/IP 协议

servaddr.sin_addrs_addr = htonl.(___(2)____);//设置监听的 IP 地址为任意合法地址,并将该地址转换为网络字节顺序

servaddr.sin_port = ___(3)___;  //设置监听的端口,并转化为网络字节顺序

if ( bind(____(4)_____)<0 ){ 

fprintf( stderr,"绑定套接字与地址!"); 

exit(1);

 } //将监听地址与用于监听的套接字绑定,绑定失败时打印错误信息

if ( listen( listedfd,BACKLOG)<0 ){ 

fprintf(stderr,"转换套接字为监听套接字!");

exit(1);

 } //将用于监听的套接字由普通套接字转化为监听套接字

for (;;) {

connfd=____(5)____;

 //从监听套接字的连接队列中接收己经完成的连接,并创建新的连接套接字

if(connfd<0){ 

fprintf(stderr,”接收连接失败!”);

exit(1);

 }//接收失败打印错误信息

serv_respon(connfd); //运行服务器的处理函数

___(6)___; //关闭连接套接字   }

close(listenfd);//关闭监听套接字   }

 

服务器通信部分:

#include <stdio.h>

 …… //引用头文件部分略>

void serv_respon( int sockfd ){

int nbytes; char buf[1024];

for( ;;){

nbytes=read_requ(sockfd,buf,1024);

//读出客户机发出的请求,并分析其中的协议结构,获知请求的内容部分的长度,并将内容复制到缓冲区buf中,

if ( nbytes == 0 ) return; //如客户机结束发送就退出

else if ( bytes<0 ){

fprintf( siderr,"读错误情息:%s\n",strerror( errno ) );

return;

}//读请求错误打印错误信息

if ( write_all ( sockfd,buf,nbytes )<0 )

 //将请求中的内容部分反向发送回客户机

fprintf( siderr,"写错误信息:%s\n",strerror( errno) );

 }

 }

int read_requ( int sockfd,char*buf int size ){

char inbuf[256];

int n; int i;

i = read_line( sockfd,inbuf,256 );

//从套接字接收缓冲区中读出一行数据,该数据为客户请求的首部

 if ( 1<O ) return(i);

else if ( i==0 ) return(0);

if ( strncmp( inbuf,"",6 ) == 0)

sscanf( ____(7)____,"%d",&n ); //从缓冲区buf中读出长度信息

else{

sprintf( buf," ",14 );

return(14);

}//取出首部Length域中的数值,该数值为内容部分的长度

return( read_all( sockfd,buf,n ) ); //从接收缓冲区中读出请求的内容部分

 }

int get_char(int fd,char *ch) {

static int offset=0;

static int size=0;

static char buff[1024];

//声明静态变量,在 get_char 多次被调用期间,该变量的内存不释放

for ( ;size <= 0 || __(8)__;){

size = read( fd,buf,1024 ); //一次从套接字缓冲区中读出一个数据块

if ( size<0 ){

if ( errno==EINTR ){

size=0;

contine; 

//EINTR表示本次读操作没有成功,但可以继续使用该套接字读出数i

}else

return(-1);

offset = 0; //读出数据后,将偏址置为 0

*ch = buf[___(9)___];//将当前的字符取出,并将偏址移向下一字符

return(1);

int read_line(int fd, char*buf, int maxlen) {

int i,n;

char ch;

for ( i=0;i<maxlen;){

n = get_char( fd,&ch );//取出一个字符

if ( n == l ){

buff[i++]=ch; //将字符加入字符串中

if ( ___(10)___ ) break;

}else if ( n< ) return(-1);

else break;

 }

buf[i]='\0';

return(i);

}

//函数 read_line 的作用是读出请求的首部,其处理的方法是每次调用 get_char 函数,取出一个字符,检查该字符是否是回车符'\n',如果是回车符,就返回请求的首部。

//get_char 的处理方式较为特殊,并不是每次调用 read 函数读一个字符,而是一次从缓冲区中读一块内容,再一次一个字符提交给函数 read_line,如果提交完了就再读一块,这样就可以提高读缓冲区的效率。另外,由于客户机是分两次调用 writ_all 函数将请求的首部和内容发送给服务器,因此 get_char 不会取出请求内容部分的字符。

 

附录一 部分SOCKET数据结构与函数

地址结构

sockaddr_in:

sockaddr_in 类型的结构定义,sockaddr_in 是通用套接字结构 sockaddr 在 TCP/IP 协议下的结构重定义,为 TCP/IP 套接字地址结构。

Struct sockaddr_in{

short int sin_family;//地址类型 AF_XXX,其中 AF_INET 为 TCP/IP 专用

unsigned short int sin_port;//端口号

struct in_addr sin_addr;//Internet地址

//端口号以及 Internet地址使用的是网络字节顺序,需要通过函数htons转换

struct_inaddr {

_u32 s_addr;//类型为unsignel long

 

hostent:

hostent 类型的结构定义

struct hostnet{

char *h_name;     //主机的正式名称

char* *h_aliases; //别名列表

nit h_addrtvPe;  //主机地址类型:AF_XXX

int h_length;    //主机地址长度:4字节(32位)

char* *h_addr_list;//主机 IP 地址列表

#define h_addr h_addr_list[0]

二、基本函数

int socket( int domain,int type,int protocol );

函数 socket 创建一个套接字描述符,如果失败返回 -1。domain 为地址类型,type 为套接字类型,本题中为 SOCK_STREAM;protocol 指定协议,本题中为 0。

Int connect( int sockfd,struct sockaddr *servaddr,int addrlen );

函数 connect 与服务器建立一个连接,成功返回 0,失败返回 -1。servaddr 为远程服务器的套接字地址,包括服务器的 IP 地址和端口号;addrlen 为地址的长度。

int read( int fd,char *buf,int len );

int write( int fd,char *buf,int len );

函数 read 和 write 从套接字读和写数据,成功返回数据量大小,否则返回 -1。buf 指定数据缓冲区,len 指定接收或发送的数据量大小。

int bind( int sockfd,struct sockaddr *myaddr,int addrlen );

函数 bind 将本地地址与套接字绑定在一起,成功返回 0,否则返回 -l ;myaddr 是本机地址;addrlen 为套接字地址结构的长度。

int listen( int sockfd,int backlog );

函数 listen 将一个套接字转换为倾听套接字,成功返回 0,否则返回 -1;backlog 为请求队列的最大长度。

Int accept( int sockfd,struct sockaddr *addr,int *addrlen );

函数 accept 从倾听套接字的完成连接中接收一个连接,如果完成连接队列为空,那么这个进程睡眠,失败时返回 -1,成功时返回新的套接字描述符。Sockfd 为倾听套接字,addr 为客户机的地址,addlen 为地址长度,在调用时用常量 NULL 代替 addr 与 addlen 表示无须取出客户机的地址信息

struct hostent *gethostbyname( const char *hostname );

函数 gethostbyname 查询指定的域名地址对应的IP地址,返回一个 hostent 结构的指针,如果不成功返回 NULL。

 

三、用户自定义函数

int read_all( int fd,void *buf,int nbyte );

函数 read all 从参数 fd 指定的套接字描述符中读取 nbytes 字节数据至缓冲区 buf 中,成功返回实际读的字节数( 可能小于 nbyte ),失败返回 -1。

int write_all( int fd,void *buf,int nbyte );

函数 write_all 向参数 fd 指定的套接字描述符中写入缓冲区 buf 前 nbyte 字节的数据,成功返回实际写的字节数( 始终等于 nbyte ),失败返回 -l。

 

write_requ 函数为客户机发送请求的函数;read_requ 函数为服务器获取请求的函数

回目录      老顽童校对整理 2003 年 2 月