1、项目三 TCP通信及安全编程习题及解答任务一 TCP网络通信界面构建1)、为什么获得的主机名、IP地址信息都是集合?解答:网络设备一般主机名只有一个,但是可以有多个接口、多个IP地址信息,或者一个接口配置多个IP地址信息,所以在System.Net空间中Dns类获取IP地址信息的方法返回都是集合类型。分析:Dns类下获取主机的方法有两: Dns.GetHostName()、Dns.GetHostEntry(string hostname),获取IP地址集合的方法是Dns. GetHostAddresses (string hostname)。2)、Dns类的GetHostAddresses(
2、)和GetHostEntry( )方法有何区别?解答:GetHostAddresses( )参数为string hostname,返回类型为IPAddress;GetHostEntry( )参数为string hostname,返回类型为IPHostEntry,也可从IPHostEntry类中通过属性AddressList获取主机IP地址信息集合,现已不建议使用IPHostEntry类及相关方法、属性。分析:在.NetFrameWork4.0中微软官方已建议不适用IPHostEntry类及相关方法,建议使用Dns. GetHostAddresses (string hostname)来获取IP
3、地址信息集合。3)、集合需要什么数据结构来存储?解答:集合是基本数据类型的聚类,存储时常用的数据结构有数组、列表、字典等类型,C#中分别对应、List、Dictionary,其中T为泛型表示基本数据类型或自定义数据类型,Dictionary可用于存储键值对。分析:C#中数组和List类似,用于存储某种单一数据类型的集合,数组操作没有List操作简单,但是查找速度数组要快一些;Dictionary可用于存储较复杂的键值对数据。4)、获取主机IPV4地址信息的功能有几种方案实现,采用一个单独的类来实现该功能好不好?解答:获取主机IPV4地址可在需要处编码实现,也可编写一个单独的类、方法实现,在需求
4、的地方调用即可,把常用的功能单独写成类、方法可以提高代码的复用度。分析:C#是一门面向对象的语言,代码的高复用是重要特征之一,所以在编码编写过程建议预先规范,把常用的功能封装成类。任务二 TCP网络通信服务器端实现1)、TCP服务器端是如何接收和收发数据的?解答:TCP通信即套接字通信,通信双方通过套接字通道(IP:端口号)进行数据传输,TCP服务器端通过监听套接字有无连接请求,若有连接请求建立套接字通道,之后通过套接字通道发送数据并监听套接字通道有无数据,若有数据读取并处理。分析:C#实现时涉及TcpListener、TcpClient、NetworkStream类,TcpListener用
5、于实现对指定套接字的监听,发现连接请求并建立套接字通道,TcpClient用于描述套接字通道; NetworkStream用于获取套接字通道;数据流,进行数据收发。2)、TCP会话阶段传输的数据最终形态是二进制还是字符串,若应用中须传输字符串,对字符编码有何要求?解答:计算机通信阶段统一传输二进制形式,若需传输字符串,需要在发送端对其进行字符编码转换为二进制形态,之后在接收端采用相应的字符编码对其进行解码,要求收发两段编码保持一致。分析:任务中收发两端统一采用UTF-8编码。3)、TCP服务器端返回给客户端的“Welcome!”信息,其UTF-8编码的十六进制值是什么?解答:对应的十六进制是:
6、77 65 6C 63 6F 6D 65 21,每个字符对应一个十六进制,采用的是ASCII编码。分析:UTF-8编码兼容ASCII编码,字符、数字、标点符号在UTF-8中都采用ASCII编码。4)、Invoke()方法的调用者是哪个类,可以使用this.Invoke()替代ui_text_msg.Invoke()吗?请说明原因。解答:可以,调用者都是组件对象,在任务中this表示的当前窗体类Form,Form也属于组件类,所以可以调用invoke方法。分析:This.invoke和ui_text_msg.invoke都可调用委托。任务三 TCP网络通信客户端实现1) 简述TCP客户端的通信流
7、程,如何在客户端发起半连接操作?解答:TCP客户端的通信流程:发起对服务器端的连接,收到服务器端响应后建立连接;建立好连接后使用该TCP通道进行数据的收发,发送时服务器端也将进行响应;半连接可利用请求-响应模式,当接收到服务器端数据时不对其进行响应使得服务器端消耗资源等待,从而使得服务器端处于挂起状态。分析:。2) 为何说基于IPV4的TCP通信不安全,请举例说明?解答:IPV4通信采用明文传输,数据在传输过程一旦被截获容易造成信息泄露,有潜在的信息安全危害,telnet、http、ftp都基于IPV4,都存在信息安全问题。分析:加密技术可以IPV4的信息安全问题,IPV6是较好的替代方案。3
8、) 若把服务器端的响应信息“welcome!”更改为“你好”,Sniffer软件捕获的是什么数据,是显示出“你好”这两个汉字信息码,如果不能,为什么?解答:Sniffer能捕获到数据:0xe4 0xbd 0xa0 0xe5 0xa5 0xbd,共6个字节,但是在sniffer中显示“你好”字符,因为sniffer默认字符编码为ASCII码。分析:Sniffer可识别ASCII码,无法识别UTF-8编码。任务四 TCP网络通信数据加密与解密1)、为什么需要在TCP通信中采用Base64字符?解答:TCP通信基于计算机网络,而计算机网络由很多网络设备和服务器主机构成,考虑到部分主机性能低下,只能支
9、持ASCII码,所以为了兼容这些低性能的主机,在传输过程统一采用base64对信息进行编码保证每个字节的高位都为0,从而兼容ASCII码,确保信息不丢失。分析:Base64是一种编码规范,是网络传输中一种基本编码,C#自带有相应的转换方法。2)、服务器端响应的“welcome!”信息为何在telnet软件显示为“/3Xu+LbD9DYJQufF0OQxXw=”,为什么字符会以两个“=”结尾?解答: “welcome!”进行128bits的Rijndael加密,输出为长度16的字节数组;之后进行Base64 字符转换,转换的方法是对16个字节按每3个字节作为一个划分,余下用符号“=”不足三个字节
10、,总共有6个划分,第6等分不足三位用两个=符号补齐,之后再把每3个字节4等分,高两位用0补齐,转换为4个字节,总共为24(6X4)个输出字符。分析:Base64是一种编码规范,是网络传输中一种基本编码,C#自带有相应的转换方法,Convert类下FromBase64String、ToBase64String可实现字符串与字节数组间的相互转换。3)、对TCP通信数据采用Rijndael加密后,就能确保TCP通信安全了吗?解答: 不能,TCP通信分为三个阶段:建立、会话、终止,TCP通信数据加密只能保证会话阶段的数据被破解、破译的成本、难度增加并不代表100%安全,且在任务没有实现对客户端的接入认
11、证,服务器端不能有效的对接入用户进行身份识别。分析:SSL、数字证书是一种TCP通信安全的完整方案。任务五 基于SSL/TLS的异步TCP通信安全实现1)、.NetFrameWork 4.0中的SslStream默认情况下采用的加密算法、验证算法、密钥交换算法分别是什么?解答: 加密算法是AES256、验证算法sha1、密钥交换算法是DH(44550)。分析:可在开发设置SSLStream的相关属性从而更改相应算法。2)、结合任务简述对“SSL建立在TCP基础之上”这句话的理解?解答: 任务开发完毕后,当客户端连接服务器端先显示TCP连接建立,之后数字证书验证通过才能建立SSL通道,所以先建立
12、TCP再建立SSL通道;在开发中,基本业务也是先建立TCP通道,之后在此基础之上进行SSL通道建立。分析:数字证书的传输、验证必须依托基础网络,所以TCP是基础。3)、X.509证书的存储位置、区域分别有哪些,请使用makecert工具创建一个测试证书,该证书存储位置是本地计算机,区域是My,自签署证书,私钥可导出,证书主题为MyServer?解答:存储区域有:个人(My)、中间证书颁发机构(CertificateAuthority)、第三方证书颁发机构(AuthRoot)、受信任的根证书颁发机构(Root)、企业信任(My)、企业信任(TrustedPublisher)等,默认是个人(My)区域。创建证书的命令:makecert -r -pe -n cn=MyServer -ss My sky exchange分析:任务使用的是由vs2012颁发的自签署测试用数字证书,证书只能在颁发主机上使用,所以任务中服务器端、客户端都运行在同一个主机上。