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)); … }