TCP IP课程复习题+部分答案(修改版)

TCP IP课程复习题+部分答案(修改版)
TCP IP课程复习题+部分答案(修改版)

2015年TCP/IP网络编程复习题

一、选择题

1、要对IP协议直接访问,必须使用()套接字

①数据流②数据报③原始④没有办法

2、下列套接字函数可产生套接字的是()

①send ②accept ③connect ④close

3、使用数据报套接字进行网络通信的应用层协议是()

①FTP ②POP3 ③PPP ④SNMP

4、要建立数据报套接字,在socket函数中需要使用的参数是()。

① SOCK_DGRAM②SOCK_STREAM ③ SOCK_RAM ④SOCK_PACKET

5、下面的属于IPv4地址结构的是()。

① sockaddr_in ②sockaddr ③ addr ④in_addr

6、初始化信号量应该使用的函数名是()。

① pthread_cond_init ②pthread_create ③ sem_init ④pthread_mutex_init

7、下列哪个协议是应用层的()

①IGMP ②HTTP ③ARP ④ICMP

8、下列哪个协议是应用层的()

①CSMA ②SMTP③TCP ④ICMP

9、在Linux下,下列哪个函数用来关闭一个套接字()

①closesocket,②WSACleanup ③close④exit

10、在数据流式套接字中()套接字函数将产生网络报文

① socket ②bind ③ sendto ④connect

11、下列套接字函数中,不能用于数据流通信的是()

①socket ②bind ③ send ④recvfrom

12、下列套接字函数中,需要地址结构作为参数的是()

①socket ②recvfrom ③ send ④close

13、 listen函数的作用是()

①接受连接请求②设置等待连接状态③连接套接字到目的地④指定本地地址

14、 winsock中提供的用于消息机制的函数是()

①WSAStartup ② WSAEventSelect ③WSACleanup ④WSAAsynSelect

15、将长整形数值从网络顺序转换为本机顺序的函数( )

①ntohl ② htons ③ htonl ④ ntohs

16、下列哪个函数在linux系统下网络程序不能使用( )

①closesocket ② select ③close ④ printf

17、套接字函数在完成其任务之前不返回,我们称之为()

①消息机制②事件机制③阻塞方式④非阻塞方式

18、属于网络层的协议()

① CSMA/CD ② ICMP ③ FTP ④ UDP

19、属于链路层的协议()

① CDMA ② ICMP ③ PPP ④ UDP

20、下列应用中使用TCP传输的是()

①实时视频② IP电话③网页传输④ DNS

21、下列应用中使用UDP传输的是()

①文件传输② IP电话③网页传输④电子邮件

22、 IP协议具有如下哪个特点()

①保证传输可靠性②无连接的数据报③建立虚电路④进行拥塞控制

23、下列哪个特点是TCP协议没有的()

①保证传输可靠性②流量控制③建立虚电路④进行拥塞控制

24 在网络通信中,客户机要访问服务器程序,必须知道服务器的()

①地理位置②程序名称③所在国家④端口和主机地址

25、下列哪个套接字函数不能用于客户程序()

①socket ②send ③accept ④ connect

26、下列哪个套接字函数不能用于服务器程序()

①socket ②sendto ③accept ④ connect

27、下列哪个套接字函数不能用于服务器程序()

①listen ②send ③accept ④ connect

28、网络应用程序运行在网络系统的()上

①端系统②核心系统③路由器④网线

29、下列设施属于网络核心系统的是()

①路由器②智能手机③Web服务器④ PC

30、根据规定,网络字节序是()

①Big endian ② Little endian ③和Intel x86一致④说不清

31、浏览器是一种()

①HTTP客户端②HTTP服务器③文件服务器④邮件客户端

32、已知IP地址的点分十进制形式,下列哪个函数能够得到其整数形式()

①gethostbyname ②inet_ntoa ③inet_addr ④gethostbyaddr

二、判断题

1.服务器必须先于客户端启动。( √ )

2.并发服务器比循环服务器性能好。( × )

3.在并发服务器中,线程越多越好 ( × )

4.有些场合下只能使用UDP进行网络通信。( √ )

5.多个线程可以共享全局变量。( √ )

6.多进程并发时,可通过共享变量来交换信息。 ( √ )

7.互斥锁是一种多进程同步机制 ( √ )

8.套接字是操作系统提供的一组用于网络通信的API。( √ )

9.发送一个UDP报文,接受方可能收到两个UDP报文。 ( × )

10.发送两个TCP数据,接收方可能一次收到全部数据。( √ )

11.UDP客户使用connect函数时,没有向网络发送任何数据报文。( √ )

12.TCP协议只能用于点到点通信。( √ )

13.一个数据报套接字可以和多个其他套接字同时通信 ( √ )

14.使用数据流网络通信可以减少网络流量。 ( × )

15.在winsock中,应该使用open函数打开一个套接字 ( × )

16.数据流式套接字是基于TCP协议的 ( √ )

17.UDP的端口号数量比TCP的端口号数量少。( × )

18.总是用close函数关闭一个套接字 ( × )

19.数据流套接字通信时,用目的IP地址和目的端口号可以唯一确定一个套接口 ( √ )

20.TCP协议在传输数据之前,必须先建立连接。 ( √ )

21.客户机程序必须绑定一个周知端口才能进行网络通信。 ( × )

22.UDP协议可以用于多点对多点的网络通信( √ )

23.TCP服务器用listen函数获得一个客户的网络连接。( × )

24.要实现ping程序功能可以使用数据报套接字( √ )

25.tftp协议是使用udp协议来实现的。( √ )

26.可以使用数据报套接字来传输文件( √ )

27.多进程并发比多线程并发性能更好 ( × )

28.多线程并发比单线程并发性能更好。 ( × )

29.要实现ping程序功能应该使用原始套接字。 ( √ )

30.可以用TCP协议进行组播通信。 ( × )

31.对于循环的面向连接的服务器同一时刻只有一个套接字。 ( × )

32.根据主机域名得到IP地址的函数是gethostbyname。 ( √ )

33.一个数据报套接字可以和多个其他套接字同时通信。 ( √ )

34.多进程并发时,可通过共享变量来交换信息。 ( √ )

35.互斥锁和信号量都是多线程同步机制。 ( √ )

36.TCP服务器用bind函数获得一个客户的网络连接。 ( × )

三、简答题

1、端口有什么作用?为什么需要周知端口?

端口就是程序与程序之间的通讯的接口。周知端口是众所周知的端口号,其中80端口分配给WWW服务,有了周知端口就可以确定并使用该端口的服务类型。

2、在网络通信时为什么要采用客户服务器模式?

因为数据需要隔离。在C/S模式之前,是文件共享形式的网络服务,文件直接暴露在客户机面前,客户机可以随意篡改。而采用CS模式,客户机的使用者是无法直接获取数据文件的,必须要通过客户端软件操作。

3、如何确定一个套接字是被动的(用于服务器的)?

看它是等待传入链接的套接字还是发起连接的套接字,等待传入链接的套接字是被动的(即用于服务器的)。

4、试比较无连接和面向连接的网络通信特点。

面向连接服务的特点:

①面向连接服务的数据传输必须经过连接建立,连接维护,释放连接3个阶段。

②面向连接服务在数据传输过程中,各个分组不需要携带目的节点的地址。

③面向连接服务传输可靠性高,但是协议复杂,通信效率低。

非连接的服务的特点:

①非连接服务中,每个分组都需要携带完整的目的节点地址,各个分组在系统中独立传送。

②非连接服务中的数据在传输过程不需要经过连接建立,连接维护,释放连接3个阶段。

③由于非连接服务发送的分组可能经历不同的路径发送到目的节点,因此可能出现乱序,重复,丢

失的现象。

④非连接服务的可靠性不好,但是省去很多保证机制,协议相对简单,通信效率比较高。

5、有哪几种网络应用程序体系结构,各有什么特点?

B/S体系结构、C/S体系结构、P2P体系结构

B/S体系结构特点:

(1).维护和升级方式简单。

(2).成本降低,选择更多。

(3).应用服务器运行数据负荷较重。

C/S体系结构特点:

(1).应用服务器运行数据负荷较轻。

(2).数据的储存管理功能较为透明。

(3).传统的C/S体系结构没能提供用户真正期望的开放环境。

(4).C/S架构还有高昂的维护成本且投资大

P2P体系结构特点:

(1).网络中计算机的数量比较少

(2).对等网络分布范围比较小,通常在一间办公室或一个家庭内。

(3).网络安全管理分散,因此数据保密性差。

(4).通过最直接交换来共享资源和服务、采用非集中式,各结点地位平等,兼作服务器和客户机。

6、网络服务器有哪些类型,各有什么特点?

7、TCP报文是如何定位一个应用程序的?

8、相对于虚电路网络,数据报网络有哪些优缺点?

虚电路技术的主要特点:在数据传输之前必须通过虚呼叫设置一条虚电路。

优点:可靠、保持顺序;

缺点:如有故障,则经过故障点的数据全部丢失.

数据报的特点:在目的地需要重新组装报文。

优点:如有故障可绕过故障点,无延迟,不需要连接。

缺点:不能保证按顺序到达,丢失不能立即知晓。

9、window下,有哪些网络编程模型?

阻塞模型、消息机制、select模型、异步选择模型、事件选择模型、重叠I/O模型、完成端口

10、DNS的作用是什么?哪个套接字函数实现了dns的功能?

DNS的作用:把域名转换成为网络可以识别的ip地址

inet_ntoa()实现了dns的功能

11、DNS的作用是什么?它采用了什么传输层协议?

DNS的作用:把域名转换成为网络可以识别的ip地址

DNS服务器之间传输时使用TCP协议,而客户端与DNS服务器之间传输时用的是UDP协议。

12、DNS的作用是什么?网络编程时用什么函数来实现?

DNS的作用:把域名转换成为网络可以识别的ip地址

gethostbyname()

13、套接字有哪几种类型,分别适用什么场合?

流套接字、数据报套接字和原始套接字。

流套接字是双向的、有序的、无重复并且记录的数据流服务,它适用于处理大量数据。

数据报套接字支持双向的数据流,但并不保证数据传输的可靠性、有序性和无重复性,但它保留记录边界。原始套接字允许对较低层次的协议直接访问,比如IP、 ICMP协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备。

14、实现并发的方式有哪几种?

单进程,单线程、多进程、select + 多线程、epoll方式。

15、哪些情况下适合使用循环服务器?

客户访问速度慢于CPU处理速度,没有状态的UDP服务器。

16、什么是多线程同步,有哪些方法?

指多线程通过特定的东西(如互斥量)来控制线程之间的执行顺序(同步)。

方法:

1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。

2.互斥量:为协调共同对一个共享资源的单独访问而设计的。

3.信号量:为控制一个具有有限数量用户资源而设计。

4.事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。

17、服务器死锁有哪些原因?

18、什么是网络地址,一个网络地址包含哪些内容?

网络地址(Network address)是互联网上的节点在网络中具有的逻辑地址。

网络地址通常可分成网络号和主机号两部分,用于标识网络和该网络中的设备。

19、recvfrom( )与recv( )函数的主要区别是什么?

recvfrom( )多了两个参数,可以用来接收对端的地址信息。

udp协议用recvfrom( ),tcp协议使用recv( )。

20、与C/S模型相比,P2P模型有哪些优缺点?

优点:

1.网络比较简单,网络分布范围比较小

2.通过最直接交换来共享资源和服务、采用非集中式,各结点地位平等,兼作服务器和客户机。

3.不需要专门的服务器来做网络支持,也不需要其他的组件来提高网络的性能,因而组网成本较低

缺点:网络安全管理分散,因此数据保密性差。

二、填空题(共6小题,共20分,每空1.5分)

1、知道一个主机的域名,要获取其IP地址应该使用 gethostbyname() 函数。

2、套接字是通过调用系统函数 socket()来创建的。

3、在Linux系统中,用于在指定的套接字上发送数据的系统函数是 send() ,也可用于向指定文件中

写入指定的字节数据存放到指定的缓存区。

4、实现并发的方式有多进程、多线程和单线程select() 。

5、在Linux系统中,关闭套接字的函数是 close(),终止当前进程的函数是 exit()。

6、Linux系统提供了3种主要的线程同步机制,分别是互斥锁、信号量和条件变量。

四、问答题

1、给出TCP的客户/服务器网络通信基本流程图并说明其工作过程。

2、给出一种UDP的客户/服务器网络通信流程图并说明其工作过程。

3、分别说明UDP和TCP协议的功能特点及适用场合。

TCP特点:是面向连接的传输控制协议;具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;面向连接,传输可靠。

适用场合:使用在面向连接的场合和用于传输大量数据的场合。

UDP特点:提供了无连接的数据报服务;在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序;面向非连接,传输不可靠;

适用场合:使用在面向不连接的场合和传输少量数据的场合。

4、试分析网络服务器程序和客户端程序有哪些不一样的地方?

5、简述基于单线程并发的面向连接服务器程序设计流程。

五、程序阅读。

1、利用select复用IO TCP服务器编程

msock = passiveTCP(service, QLEN);//建立一个被动的套接字

nfds = getdtablesize();

FD_ZERO(&afds);

FD_SET(msock, &afds);

while (1)

{

memcpy(&rfds, &afds, sizeof(rfds));

①if (select(nfds, &rfds, (fd_set *)0, (fd_set *)0,(struct timeval *)0) < 0)

errexit("select: %s\n", strerror(errno));

② if (FD_ISSET(msock, &rfds))

{

int ssock;

alen = sizeof(fsin);

③ssock = accept(msock, (struct sockaddr *)&fsin, &alen);

if (ssock < 0)

errexit("accept: %s\n", strerror(errno));

④FD_SET(ssock, &afds);

}

for (fd=0; fd

⑤if (fd != msock && FD_ISSET(fd, &rfds))

if (echo(fd) == 0) //对就绪的套接字描述符fd进行echo服务后关闭

{

close(fd);

FD_CLR(fd, &afds);

}

}

2、利用多线程实现TCP服务器编程

if ((retval = WSAStartup(0x202, &wsaData)) != 0)

{

ErrorPro("WSAStartup");

}

listen_socket = socket(AF_INET, socket_type, 0);

if (listen_socket == INVALID_SOCKET)

{

ErrorPro("socket");

}

local.sin_family = AF_INET;

local.sin_addr.s_addr = INADDR_ANY;

local.sin_port = htons(port);

if (bind(listen_socket,(struct sockaddr*)&local, sizeof(local) ) == SOCKET_ERROR)

{

ErrorPro("bind");

}

if (listen(listen_socket, 5) == SOCKET_ERROR) )

{

ErrorPro("listen");

}

printf("监听端口:%d, 使用TCP\n", port);

fromlen =sizeof(from);

while(1)

{

msgsock = accept(listen_socket,(struct sockaddr*)&from, &fromlen);

if (msgsock == INVALID_SOCKET)

{

ErrorPro("accept");

}

printf("从%s收到连接, 端口是:%d\n", inet_ntoa(from.sin_addr), htons(from.sin_port));

if(quitag)

break;

_beginthread(Handle, 0, (LPVOID)msgsock);

}

closesocket(msgsock);

closesocket(listen_socket);

WSACleanup();

return 0;

}

3、简单UDP套接字服务器程序

int main(void){

unsigned short port= 5001; //端口号

int socket_type = ①; //缺省使用UDP连接

char Buffer[1280]; //收发缓冲区

int retval, fromlen, i, isconnected = 0; //临时变量

struct sockaddr_in local, from; //套节字地址结构变量

SOCKET sock; //套节字变量

WSADATA wsaData; //windows套节字信息

//先输入服务器程序所需要的基本信息:端口号,套节字类型

//建立套节字

sock = ②(PF_INET, socket_type, 0);

if (sock == INVALID_SOCKET) {

printf("错误号:%d\n", WSAGetLastError());

WSACleanup();

return -1;

}

// 拷贝解析的信息到sockaddr_in结构中

local.sin_family = AF_INET;

local.sin_addr.s_addr = INADDR_ANY;

local.sin_port = ③;

//绑定网络地址到套接字

if (bind(sock,(struct sockaddr*)&local, sizeof(local) ) == SOCKET_ERROR) { printf("bind()失败,错误号:%d\n", WSAGetLastError());

WSACleanup();

return -1;

}

printf("监听端口:%d, 使用协议:%s\n", port,

(socket_type == SOCK_STREAM)? "TCP": "UDP");

while(1) {

fromlen =sizeof(from);

//等待接收网络信息

retval = ④(sock, Buffer, sizeof (Buffer), 0, (⑤)&from, &fromlen); //

面向UDP

printf("从%s收到数据报,端口是:%d\n", inet_ntoa(from.sin_addr), htons(from.sin_port));

… }

相关主题
相关文档
最新文档