Windows网络编程基础习题解答.docx
《Windows网络编程基础习题解答.docx》由会员分享,可在线阅读,更多相关《Windows网络编程基础习题解答.docx(13页珍藏版)》请在冰豆网上搜索。
Windows网络编程基础习题解答
Windows网络编程基础课后习题作业
软件1202罗伟(1205290203)
第一章:
1.TCP/IP协议栈的五个层次是什么?
在这些层次中,每层的主要任务是什么?
解答:
TCP/IP参考模型分为五个层次:
应用层、传输层、网络层、链路层和物理层。
以下分别介绍各层的主要功能。
应用层是网络应用程序及其应用层协议存留的层次。
该层包括了所有与网络相关的高层协议,如文件传输协议(FileTransferProtocol,FTP)、超文本传输协议(HypertextTransferProtocol,HTTP)、Telent(远程终端协议)、简单邮件传送协议(SimpleMailTransferProtocol,SMTP)、因特网中继聊天(InternetRelayChat,IRC)、网络新闻传输协议(NetworkNewsTransferProtocol,NNTP)等。
传输层的功能是使源端主机和目标端主机上的对等实体可以进行会话。
在传输层定义了两种服务质量不同的协议,即:
传输控制协议(TransmissionControlProtocol,TCP)和用户数据报协议(UserDatagramProtocol,UDP)。
网络层是整个TCP/IP协议栈的核心。
它的功能是通过路径选择把分组发往目标网络或主机,进行网络拥塞控制以及差错控制。
链路层负责物理层和网络层之间的通信,将网络层接收到的数据分割成特定的可被物理层传输的帧,并交付物理层进行实际的数据传送。
物理层的任务是将该帧中的一个一个比特从一个节点移动到下一个节点。
该层中的协议仍然是链路相关的,并且进一步与链路(如双绞线、单模光纤)的实际传输媒体相关。
对应于不同的传输媒体,跨越这些链路移动一个比特的方式不同。
2.请分析路由器、链路层交换机和主机分别处理TCP/IP协议栈中的哪些层次?
解答:
路由器处理TCP/IP协议栈的物理层、链路层和网络层;
链路层交换机处理TCP/IP协议栈的物理层和链路层;
主机处理TCP/IP协议栈的物理层、链路层、网络层、传输层和应用层。
3.请阐述NAT技术的主要实现方式,并思考NAT技术对网络应用程序的使用带来哪些影响?
解答:
网络地址转换(NetworkAddressTranslation,NAT)是接入广域网(WAN)的一种技术,能够将私有(保留)地址转化为合法的IP地址,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。
NAT的实现方式有三种,即静态转换、动态转换和端口多路复用。
NAT有效解决了IP地址短缺的问题,但是它也带来了一些新的问题。
主要体现在:
处于NAT后面的主机不能充当服务器直接接收外部主机的连接请求,必须对NAT设备进行相应的配置才能完成外部地址与内部服务器地址的映射;
处于不同NAT之后的两台主机无法建立直接的UDP或TCP连接,必须使用中介服务器来帮助它们完成初始化的工作。
4.某业务要求实现一个局域网上网行为监控的软件,能够对局域网内用户的上网行为(包括访问站点、使用聊天工具、发布言论等)进行截获和分析,请选择一个合适的网络程序设计方法,并说明该软件设计的主要流程。
解答:
选择使用具有较强数据捕获能力的网络编程方法,如WinPcap编程或WinSock编程中的原始套接字。
局域网上网行为监控软件的主要流程包括:
1)通过交换机的镜像端口或分光方式,搭建局域网流量截获环境,能够将局域网上下行的网络流量复制出来进行后续分析;
2)对镜像出的网络流量进行捕获,得到原始数据;
3)对原始数据进行过滤,识别并保留与上网行为监控相关的协议数据,如HTTP、SMTP、QQ通信协议等;
4)提取不同协议中监控者感兴趣的信息,如访问网址、聊天对象、发布言论等;
5)分析数据,进行重点用户监控和异常行为检测。
第二章网络程序通信模型
习题
1.面向少量客户持续请求的服务器和面向大量客户短期请求的服务器在设计中有哪些区别?
解答:
面向少量客户持续请求的服务器在单位时间内处理的客户请求数量是有限的,但服务器与每个客户端之间的交互时间和频率是持续的。
在这种情况下,服务器一般设计为并发服务器,为每个客户端分配专门的线程以处理其复杂的业务需求。
面向大量客户短期请求的服务器在同一时间可能面临成百上千个客户的大量请求,但每个客户端的请求与响应比较简单。
在这种情况下,服务器需要根据客户的具体业务需求来设计。
如果是类似于时间服务的单次查询-响应服务,可选择循环服务器串行响应每个客户端的请求,避免线程膨胀和维护的复杂性;如果是类似于Web访问较复杂的服务,可选择基于完成端口的异步I/O,与线程池联合管理多个客户端的请求。
2.某业务需要实现一个文件服务器,请给出该文件服务器的设计要点。
解答:
文件服务器主要处理文件的上传与下载业务,在设计时需要考虑以下要点:
1)用户鉴别与权限管理。
文件服务器应具备一定的用户登录和权限管理能力,以辨别用户身份,保护文件访问的合法性。
2)数据传输可靠性。
为了确保文件服务器的传输可靠性,在传输协议选择上,可以使用TCP协议自定义文件传输过程,完成数据传输;或者使用FTP协议,用控制流进行用户授权和传输管理,用数据流具体传送文件。
3)数据传输的效率。
考虑到用户上传和下载大数据的现实体验,文件服务器应提供高效的数据传输能力,比如使用多线程机制提高效率,使用P2P模型支持多点下载等。
4)断点续传
文件服务器应提供断点续传能力,确保在用户下载过程中断并恢复后,能够保存之前的数据和状态并继续后续的下载任务。
实验
1.结合Wireshark网络流量分析工具对网页邮件登录过程进行捕获和分析,说明其基本的工作流程。
解答:
分析流程具体见《Windows网络编程实验》。
2.结合Wireshark网络流量分析工具对迅雷登录和文件下载过程进行捕获和分析,说明其基本的工作流程。
解答:
分析流程具体见《Windows网络编程实验》。
第三章网络数据的内容与形态
习题
1.假设应用程序使用有符号短整型给端口号赋值,当端口号大于32768时,端口号的具体值为多少?
是否合理?
解答:
有符号短整型能够表示的数据范围是-32768~32767,当端口号n大于32768时,短整型最左边一位为1,端口号的值为负数,即-(216-n),这样表示是不合理的,应该选用无符号短整型来描述端口号。
2.大端字节顺序和小端字节顺序是CPU处理多字节数的不同方式。
例如“汉”字的Unicode编码是0x6C49。
那么存储在内存中时数据是如何存储呢?
请在自己的系统平台下观察字节在内存中的具体存储方式。
解答:
在基于X86平台的PC机中,汉字的Unicode编码是6C49,存储在内存中是小端字节序的,具体存储顺序如下:
3.试考虑一个15字节的消息结构:
structintegerMessage{
uint8_tonebyte;
uint16_ttwobytes;
uint32_tfourbytes;
uint64_teightbytes;
}
请问,该消息结构在内存中的实际布置如何?
该结构的长度为多少?
解答:
由于字节对齐的原因,该消息结构在内存中的实际布置如下:
该消息结构的长度为16.
4.假设一个端口扫描应用程序被设计为递增IP地址和TCP端口,并手工构造和发送TCP扫描包给目标方,那么在每次发送数据前,TCP扫描包的哪些字段需要修改,如何修改?
解答:
TCP端口扫描程序面向给定的目的主机,对指定的端口范围进行扫描,扫描过程一般是向目标主机的端口号发送SYN请求,并接收对方的应答,如果对方反馈了SYN应答包则说明该端口开放,否则认为端口不开放。
手工构造TCP扫描包涉及到IP首部和TCP首部的构造,那么在探测过程中,每次TCP扫描包需要修改的字段主要有:
IP首部中目的IP地址、IP首部的校验和清零后重新计算、TCP首部的目标端口号、TCP首部的校验和清零后重新计算。
5.请设计一个远程投票系统的消息传送协议,具体内容包括:
1)投票协议标识
2)投票消息类型
3)投票候选人标识
4)投票结果
使用文本串和二进制两种方式设计投票消息以满足以上需求。
解答:
基于文本串的消息描述方式需要定义一些固定含义的文本串来标识消息内容。
比如:
“VOT”指明投票协议,“TYPE:
”指明消息类型,“CANDIDATE:
”指明候选人,“RESULT:
”指明结果。
则一个具体的消息可以表示为由消息标识声明的文本串,如“VOTTYPE:
2;CANDIDATE:
peter;RESULT:
true”,假设投票消息传送协议基于TCP协议承载,在具体传输过程中,使用一种编码方式(如:
Unicode编码)对该文本串进行描述,并作为TCP协议的数据部分传输。
基于二进制的消息描述方式使用固定大小的数据区域存储消息内容,比如设计投票消息传送协议格式如下:
定义:
协议标识0x01代表投票协议
消息类型0x02代表投票消息
候选人标识0x05代表候选人“peter”的唯一标识
投票结果0x01代表投票,0x02代表反对
那么一次对候选人peter的赞成投票的投票消息为:
0x01020501.
假设投票消息传送协议基于TCP协议承载,在具体传输过程中,二进制描述的投票消息可以直接作为TCP协议的数据部分传输。
第四章协议软件接口
习题
1.阐述使用WindowsSockets编程的环境配置过程。
解答:
WindowsSockets实现一般由两部分组成:
开发组件和运行组件。
开发组件是供程序员开发WindowsSockets应用程序使用的,它包括介绍WindowsSockets实现的文档、WindowsSockets应用程序接口(API)引入库和一些头文件。
头文件winsock.h、winsock2.h分别对应于WinSock1.1和WinSock2.2,是WindowsSockets最重要的头文件,它们包括了WindowsSockets实现所定义的宏、常数值、数据结构和函数调用接口原型。
运行组件是WindowsSockets应用程序接口的动态链接库(DLL),应用程序在执行时通过装入它实现网络通信功能。
两个版本的动态链接库以及与其对应的接口引入库和头文件如下所示。
表4-1WindowsSockets版本中相应的动态链接库
版本
头文件
静态链接库文件
动态链接库文件
1.1
winsock.h
winsock.lib
winsock.dll
2.2
winsock2.h
ws2_32.lib
ws2_32.dll
对动态链接的使用,需要在程序编译前将对应的头文件引入源文件,以便编译环境可以找到相应函数和变量的声明,并在项目中引入静态链接库文件,以便在程序编译通过后,连接时可以找到套接字函数的执行地址。
以WindowsSockets2.2版本为例,对头文件的引入使用以下代码段:
#include“winsock2.h”
对静态链接库的引入使用以下代码段:
#pragmacomment(lib,"ws2_32.lib")
或者在开发环境中的项目菜单中配置增加对“ws2_32.lib”文件的引入,如下图所示。
2.考虑一种提供消息传递的操作系统,阐述如何扩展应用程序接口使其适用于网络通信?
解答:
提供消息传递的操作系统典型的例子是Windows操作系统,该系统最大的特点是图形化的操作界面,其图形化界面是建立在消息处理机制这个基础之上的。
程序不断等待,等待任何可能的输入,然后做判断,根据不同的消息调用消息处理函数进行适当的处理。
这种输入是操作系统捕捉到后以消息形式(一种数据结构)进入程序之中的。
有了消息机制的推动,套接字接口也可以借助消息机制来通知应用程序网络事件满足,具体思路是:
首先为应用程序创建消息传递所需的消息接收窗口和消息队列;然后定义与网络事件相关联的消息;之后通过系统调用注册网络事件与消息的对应关系;最后,当网络事件发生时,系统触发消息通知应用程序处理。
通过以上基本步骤实现了基于消息机制的异步网络操作。
3.阐述程序、套接字、端口和协议之间的关系。
解答:
程序和套接字的关系:
一个程序可以同时使用多个套接字,不同套接字完成不同的传输任务。
多个应用程序可以同时使用同一个套接字,不过这种情况并不常见。
套接字和端口的关系:
每个套接字都有一个关联的本地TCP或UDP端口,它用于把传入的分组指引到应该接收它们的应用程序。
一个端口上可能关联多个套接字,流式套接字的服务器上可能同时有监听套接字和连接套接字,它们都与一个TCP的端口号相关联;一个套接字一般只会关联一个唯一的本地端口号。
端口和协议的关系:
TCP和UDP的端口号是独立使用的。
实验
1.调用WindowsSockets的API函数获得本地主机和远端域名的IP地址,如果一个主机名称对应了多个IP地址,请依次打印。
解答:
实现过程具体见《Windows网络编程实验》。
第五章流式套接字编程
习题
1.思考套接字接口层与TCP实现之间的关系,结合数据发送和接收分析数据的传递过程以及两个层次的具体工作。
解答:
对应于TCP数据的发送和接收,套接字实现设计了两个独立的缓冲区,分别用于缓存应用程序请求发送的数据和等待接收的数据(一般以先进先出队列的形式保存)。
从应用程序实现、套接口实现和协议实现三个层次来观察数据发送的过程,数据发送在实施过程中主要涉及到两个缓冲区:
一个是应用程序发送缓冲区,即调用send()函数时由用户申请并填充的缓冲区,这个缓冲区保存了用户即将使用协议栈发送的TCP数据;另一个是TCP套接口的发送缓冲区,在这个缓冲区中保存了TCP协议尚未发送的数据和已发送但未得到确认的数据。
数据发送涉及到两个层次的写操作:
从应用程序发送缓冲区拷贝数据到TCP套接口的发送缓冲区,和从TCP套接口的发送缓存将数据发送到网络中。
数据接收在实施过程中主要涉及到另外两个缓冲区,一个是TCP套接口的接收缓冲区,在这个缓冲区中保存了TCP协议从网络中接收到的与该套接口相关的数据;另一个是应用程序的接收缓冲区,即调用recv()函数时由用户分配的缓冲区,这个缓冲区用于保存从TCP套接口的接收缓存收到并提交给应用程序的网络数据。
数据接收也涉及到两个层次的写操作:
从网络上接收数据保存到TCP套接口的接收缓冲区,和从TCP套接口的接收缓冲区拷贝数据到应用程序的接收缓冲区中。
2.在基于流式套接字的网络应用程序设计中,假设客户端以8字节-12字节-8字节-12字节的顺序交替发送数据给服务器,请思考,服务器的接收操作每次能够接收到多少字节的数据?
为什么?
解答:
服务器接收操作每次能够接收到的数据长度是不确定的,这是因为TCP传送数据的形态是没有间隔的字节流,数据接收仅与接收调用的时间和当前主机内核缓存中尚未提交应用程序的数据有关,与发送端发送多少次和TCP如何传送没有直接的关系,我们不能准确地预测一个特定的接收操作到底返回多少字节。
3.思考使用TCP进行数据传输的应用程序是否一定不会出现数据丢失?
应用程序应在哪些具体操作上考虑可靠性问题?
解答:
使用TCP进行数据传输的应用程序也可能会出现数据丢失,这是因为TCP是一个端到端的协议,这意味着通信的双方只关心自己提供了一个可靠的传输机制,“端”是对等方的TCP协议实现,而不是对等方的应用程序。
应用程序的可靠性需要应用程序自己提供。
导致TCP传输出现失败的现象有:
在正常的TCP连接上,TCP确认的数据实际上有可能不会到达它的目的应用程序,服务器的TCP实现不确认接收到了数据,如:
发生永久的或暂时的网络紊乱,对等方的应用程序崩溃,对等方的应用程序运行的主机崩溃等。
网络程序设计人员应注意到这些失败模式对TCP应用程序的影响,在数据发送、接收、连接关闭等操作上,注意函数调用时机,关注函数调用结果,尽可能全面地处理TCP传输中可能遇到的失败模式。
实验
1.使用流式套接字编程设计一个并发的回射服务器,该服务器具有并发处理客户请求的功能,当多个客户端同时请求服务器回射时,服务器能够同时接收到多个客户端的请求并相应做出回射响应。
解答:
实现过程具体见《Windows网络编程实验》。
2.设计一个网络测试程序,客户端能够模拟“发送-发送-……-接收”的操作序列,采用send()和WSASend()两种发送方式进行请求发送,测试在这两种发送操作下服务器的响应时间有何差别,并说明原因。
解答:
实现过程具体见《Windows网络编程实验》。
第六章数据报套接字编程
习题
3.思考套接字接口层与UDP实现之间的关系,结合数据发送和接收分析数据的传递过程以及两个层次的具体工作。
解答:
数据发送过程和接收过程类似,以数据接收为例,从应用程序实现、套接口实现和协议实现三个层次来观察接收的过程,数据接收在实施过程中主要涉及到两个缓冲区,一个是UDP套接口的接收缓冲区,在这个缓冲区中保存了UDP协议从网络中接收到的与该套接口相关的数据;另一个是应用程序的接收缓冲区,即调用recvfrom()函数时由用户分配的缓冲区recvbuf,这个缓冲区用于保存从UDP套接口的接收缓存收到并提交给应用程序的网络数据。
数据接收涉及到两个层次的写操作:
从网络上接收数据保存到UDP套接口的接收缓冲区,和从UDP套接口的接收缓冲区拷贝数据到应用程序的接收缓冲区中,如下图所示。
4.在基于数据报套接字的网络应用程序设计中,假设客户端向服务器发送了两个数据报,一个报文长度为800字节,另一个报文长度为1200字节,设置服务器端的接收缓冲区为1000字节,进行三次接收操作,请思考,服务器在三次接收操作时各发生何种现象,实际接收到的字节长度为多少?
解答:
第一次接收操作接收到完整的800字节的报文,recvfrom()函数返回800;
第二次接收操作接收1000字节的报文,recvfrom()函数返回1000,第二个报文后续的200字节内容被截断丢弃;
第三次接收操作依赖于套接字的工作模式,如果是阻塞模式,则接收函数阻塞,如果设置了接收超时,则在超时时间到时返回接收超时错误;如果是非阻塞模式,则接收函数立刻返回,错误类型是WSAEWOULDBLOCK.
5.总结使用UDP进行数据传输的应用程序应在哪些具体操作上考虑可靠性问题?
解答:
由于UDP协议是一个不可靠的协议,使用UDP进行数据传输的应用程序会因为网络环境、主机环境的差异带来数据传递过程中发生丢失、乱序、重复等问题,那么在程序运行过程中需要考虑:
发送操作:
发送出去的数据可能会丢失,需要考虑超时重传问题;发送目的地可能并不存在,需要判断目的应用程序的状态。
接收操作:
接收到的数据可能重复,需要判断重复数据;接收到的数据可能是噪音,需要排除噪音;接收到的数据可能乱序,需要考虑重组;可能无法接收到预期的数据,需要考虑反馈确认和流量控制问题。
实验
1.设计一个网络测试程序,客户端能够高速发送数据,服务器端接收数据并统计接收到的数据报文个数,测试当前系统和网络环境下,服务器的丢包率为多少?
解答:
实现过程具体见《Windows网络编程实验》。
2.在上题的测试程序基础上,修改系统接收缓存,测试系统接收缓存的大小与程序丢包率之间的关系,并解释原因。
解答:
实现过程具体见《Windows网络编程实验》。
第七章原始套接字编程
习题
1.原始套接字在处理数据发送和接收时与流式套接字和数据报套接字有哪些不同?
解答:
在使用原始套接字进行数据传输的编程过程中,增加了诸多操作,如套接字选项的设置、传输协议首部的构造、网卡工作模式的设定以及接收数据的过滤与判断等。
使用原始套接字发送数据需要填写的数据内容更加复杂,根据应用的不同,原始套接字可以有两种数据填充的选择:
仅构造IP数据或构造IP首部和IP数据。
此时程序设计人员需要根据实际需要对套接字选项IP_HDRINCL进行配置。
使用原始套接字接收数据时,网络接口提交给原始套接字的数据并不一定是网卡接收到的所有数据,如果希望得到特定类型的数据包,应用程序需要对套接字的接收进行控制,设定接收选项SIO_RCVALL,或者通过bind()、connect()函数明确端点地址。
由于原始套接字的数据传输也是无连接的,网络接口提交给原始套接字的数据很可能存在噪音,因此在接收到数据后,需要对数据进行一定条件的过滤。
2.某程序员在Windows7环境下,使用原始套接字构造TCP的SYN请求实现半开端口扫描,但结果发现网络中并没有看到SYN请求的发送,请分析原因并给出解决思路。
解答:
在Windows环境下,原始套接字的支持一直是个备受争议的问题,不同版本的Windows环境对原始套接字给出了一些限制。
在Windows7、WindowsVista、WindowsXPSP2和WindowsXPSP3中,通过原始套接字发送数据的能力受到了诸多限制,其中对TCP的限制是TCP的数据不能通过原始套接字发送。
因此,如果仍要在Windows7环境下开发SYN半开端口扫描,那么需要选择其它的编程方法,如WinPcap编程。
实验
1.使用原始套接字编程,实现UDP回射客户端的主要功能。
该客户端具备IP原始数据包的构造、发送和接收功能,能够从控制台获取用户输入,将用户输入的字符串作为UDP的数据填充回射请求,发送给回射服务器,接收服务器发回的响应,并将响应打印到命令行中。
解答:
实现过程具体见《Windows网络编程实验》。
2.设计一个路径探测器,能够实现类似于traceroute功能,获取从探测源到达目的主机的路由器路径和延迟。
解答:
实现过程具体见《Windows网络编程实验》。
第八章网络通信中的I/O操作
习题
1.简述阻塞与非阻塞、同步与异步的区别。
解答:
同步和异步概念与消息的通知机制有关。
对于消息处理者而言,在同步的情况下,由处理消息者自己去等待消息是否被触发;在异步的情况下,由触发机制来通知处理消息者,然后进行消息的处理。
同步和异步仅仅是关于所关注的消息如何通知的机制,而不是处理消息的机制。
阻塞和非阻塞与消息的处理机制有关。
阻塞模式是指在指定套接字上调用函数执行操作时,在没有完成操作之前,函数不会立即返回。
非阻塞模式是指在指定套接字上调用函数执行操作时,无论操作是否完成,函数都会立即返回。
同步与阻塞,异步与非阻塞并不是两对相同的概念,要注意消息的通知和消息的处理是不同的。
2.简述WSAAsyncSelect模型和WSAEventSelect模型的主要区别和各自在使用中的优缺点。
解答:
WSAAsyncSelect模型和WSAEventSelect模型都是WindowsSockets引入的异步处理网络I/O的基本方法。
WSAEventSelect模型与基于WSAAsyncSelect的异步I/O模型的最主要的区别是网络事件发生时系统通知应用程序的方式不同。
WSAAsyncSelect模型依赖消息通知,而WSAEventSelect模型允许在多个套接字上接收以事件为基础的网络事件的通知。
WSAAsyncSelect模型基于Windows消息机制实现,其优点是:
在系统开销不大的情况下可以较简单地同时处理多个客户端的网络I/O。
其缺点是:
消息的运转需要有消息队列,为了支持消息机制,就必须创建一个窗口来接收消息,另外,在一个窗口中处理大量的消息也可能成为性能的瓶颈。
WSAEventSelect模型不依赖于消息,所以可以在没有窗口的环境下比较简单地实现对网络通信的异步操作。
该模型的缺点是等待的事件对象的总数是有限制的(每次只能等待64