13.服务器图片改了,url没有变,需求,服务器的图片变了,就从服务器加载图片,如果服务器的没变,就从本地加载
1.请求要是可变的,缓存策略要是每次从服务器加载.
2.记录每次响应的etag
3.在下次发送请求时,将etag发送给服务器. 由服务器判断内容有没有发生改变.如果没有发生改变,则不会将数据返回给客户端,如果变了,就返回。
#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
/**
* 记录响应的etag
*/
@property (nonatomic, copy) NSString *etag;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// URL
NSURL *url = [NSURL URLWithString:@"http://localhost/itcast/images/head1.png"];
// Request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15.0];
// 通过请求对象将etag发送给服务器
if (self.etag) {
[request setValue:self.etag forHTTPHeaderField:@"If-None-Match"];
}
// 默认就是GET请求
NSLog(@"request.HTTPMethod = %@",request.HTTPMethod);
// 发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
NSLog(@"%@---%zd",response,data.length);
//httpResponse为子类属性,把response强转成NSHTTPURLResponse
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
// 获得响应的etag
self.etag = httpResponse.allHeaderFields[@"Etag"];
// 判断状态码是否是304: 服务端的数据和本地的是一样的,服务器的内容没有发生变化
if (httpResponse.statusCode == 304) {
NSLog(@"加载本地数据");
// 根据请求对象获得对应的缓存响应对象
NSCachedURLResponse *cacheResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
// 获得缓存数据
data = cacheResponse.data;
}
NSLog(@"etag = %@",self.etag);
// 将二进制数据转换成UIImage
UIImage *image = [UIImage imageWithData:data];
// 显示图片
self.iconView.image = image;
}];
}
@end
12、写出四个不同的http返回状态码以及分别所代表的意思。
404表示请求的资源不存在
8、常用的数据格式是JSON还是XML,分别用哪些即时方式,优缺点是什么?
答:
XML目前设计了两种解析方式:DOM和 SAX。
JSON只提供整体解析方案XML的优点:.格式统一,符合标准;数据共享比较方便。
XML的缺点: 文件庞大,文件格式复杂,传输占带宽;JSON的优点:数据格式比较简单,易于读写,易于解析
JSON的缺点:没有XML那么通用性
9、实现或使用过哪些加密算法?
答:
对称加密算法 DES, 3DES, AES
非对称加密算法: RSA, DSA, ECC
323、TCP/IP通信建立的过程怎样,端口有什么作用?
答:
发出将建立通信会话的第一个数据包之前,发送方主机上的TCP/IP协议执行以下四个不同的步骤:1.TCP/IP将主机名或NetBIOS名称解析为IP地址。
2.使用目标IP地址和IP路由表,TCP/IP确定要使用的接口和下一跃点IP地址。
3.对于共享访问技术(例如,以太网、令牌环和分布式光纤数据接口(FDDI))上的单播IP流量,地址解析协议(ARP)将下一跃点IP地址解析为媒体访问控制(MAC)地址(也称为数据链接层地址)。对于以太网和FDDI上的多播IP流量,目标多播IP地址会被映射到相应的多播MAC地址。对于令牌环上的多播IP流量,使用功能地址0xC0-00-00-04-00-00。对于共享访问技术上的广播流量,MAC地址会被映射到0xFF-FF-FF-FF-FF-FF。4.之后,IP数据报会被发送到通过ARP解析的MAC地址、多播映射或MAC级广播地址。
网络访问要通过不同的协议进行,各种协议要通过不同的端口进行访问,如25端口是邮件端口,3389超级终端(就是木马程序最想打开的端口),8000=腾讯OICQ服务器端等等很多很多,记住常用的几个就可以了。
端口:说白了就相当于门,每个门都对应着相对的TCP/IP
318、简要说下Http通信协议的原理,与Socket协议的区别有哪些?
答:
HTTP协议:简单对象访问协议,对应于应用层,HTTP协议是基于TCP连接的
tcp协议:对应于传输层
ip协议:对应于网络层
TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。
Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,才能使用TCP/IP协议。
http连接:http连接就是所谓的短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断掉;
socket连接:socket连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该连接以释放网络资源。
309、请写出同步网络请求和异步网络请求函数。
答:首先在ios模拟器上创建一个text窗口(我起名叫tongbu):
//同步网络请求函数
//获取名叫tongbu文本框的内容
NSString *txt=self.tongbu.text;
//创建url对象
NSURL *url=[NSURLURLWithString:txt];
//创建请求对象
NSURLRequest *req=[NSURLRequest requestWithURL:url];
//发起同步,赶回数据给data
NSData*data=[NSURLConnection sendSynchronousRequest:req returningResponse:nilerror:nil];
//异步网络请求
在ViewController.m文件上的- (void)viewDidLoad方法里
NSString*txt2=self.tongbu.text;
//创建url对象
NSURL *url2=[NSURLURLWithString:txt2];
//创建请求对象
NSURLRequest*req2=[NSURLRequest requestWithURL:url2];
//发送请求并建立一个代理
[NSURLConnectionconnectionWithRequest:req2 delegate:self];
//因为代理人是自己所以让自己遵守协议
协议在ViewController.h文件里
@interface ViewController :
UIViewController//因为代理对象是对象所以让自己遵守协议
//同时创建一个NSMutableData类型的对象来接从网络上接收的数据,同时创建3个协议方法来进行接收数据
@property(retain,nonatomic)NSMutableData*data;
//协议方法
//1连接接收响应,表示成功建立连接
-(void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse *)response{
self.data=[[NSMutableData alloc]init];//创建代理对象,并初始化数据
}
//2连接接收数据
//形参(NSData *)表示接收到的数据
-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData *)data{
[self.data appendData:data];//向data反复添加数据
}
//3连接成功
-(void)connectionDidFinishLoading:(NSURLConnection*)connection{
NSLog(@"连接成功");
}
230.网络通信用过哪些方式?
答
1、使用socket的方式进行通信。
2、使用asynsocket类库进行通信。
178.常用的XML文件的解析方式有哪些?它们各自的区别是什么?
1)有两种解析方式:DOM解析与SAX解析。
2)DOM解析必须先完成DOM树的创建,在处理规模较大XML文档时就很耗内存,占用资源较多。
3)与DOM不同,SAX是用事件驱动模型,解析XML时每遇到一个开始或结束标签、或者属性、或者一条指令时,程序就会产生一个事件进行相应的处理,因此,SAX相对于DOM来说更适合操作较大的XML文档
132.网络通信用过哪些方式?
(附网址:http://blog.csdn.net/chang6520/article/details/7967698)
同样也是代码解释
iOS设备的网络通信的方法,有如下两个大类:
1、使用socket的方式进行通信。
以TCP为利,对于TCP来说,是要区分服务端和客户端的。服务端:通常的方法是服务端启动后监听,是否有客户端连接,如果有连接,则建立与客户端的通信。客户端的方法通常是连接服务端,当连接成功之后,就希望发送数据了。2、使用asynsocket类库进行通信。
133.如何处理多个网络请求并发的情况?
答:
(附网址:http://www.cnblogs.com/yanhuaxuanlan/p/4683557.html)
答案都是代码,大家可以打开网址仔细阅读
1.并发当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。2.并行当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
3.区别并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。
62.网络图片处理问题中怎么解决一个相同的网络地址重复请求的问题?
答案:利用字典图片地址为key,下载操作为value
55.NSURLSession在什么情况下会存在循环引用的问题,怎么解决?
答:
(1)在使用NSURLSession签订其代理的时候会存在循环引用问题,因为其代理是retain强引用
(2)解决方案
(1)在下载完成后取消NSURLSession会话并释放Session,赋值为nil。
(2)再视图将要消失时也执行同样的操作。为了防止没有下载完成就跳转控制器。
具体如下:
/**视图将要消失的时候,取消session*/
- (void)viewWillDisappear:(BOOL)animated
{
[superviewWillDisappear:animated];
//任务完成,取消NSURLSession
[self.sessioninvalidateAndCancel];
//释放会话
self.session =nil;
}
56.如何自己实现GET缓存?
答:
1.使用GET请求数据
2.iOS系统SDK已经做好了缓存。需要的仅仅是设置下内存缓存大小、磁盘缓存大小、以及缓存路径,代码如下:
NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:urlCache];
58.如果提交一个Json格式的数据给后台服务器,后台服务器返回的是一段普通文字,用NSURLConnection/NSURLSession/AFN分别如何实现?
答:
1.使用NSURLConnection发送请求的步骤很简单
(1)创建一个NSURL对象,设置请求路径(设置请求路径)
(2)传入NSURL创建一个NSURLRequest对象,设置请求头和请求体(创建请求对象)
(3)使用NSURLConnection发送NSURLRequest(发送请求)2.使用NSURLSession发送请求的步骤很简单
1)确定请求路径(一般由公司的后台开发人员以接口文档的方式提供),GET请求参数直接跟在URL后面
2)创建请求对象(默认包含了请求头和请求方法【GET】),此步骤可以省略
3)创建会话对象(NSURLSession)
4)根据会话对象创建请求任务(NSURLSessionDataTask)
5)执行Task
6)当得到服务器返回的响应后,解析数据(XML|JSON|HTTP)
59.请描述一下SDWebImage内部实现的原理
答:SDWebImage底层实现有沙盒缓存机制,主要由三块组成
1、内存图片缓存
2、内存操作缓存
3、磁盘沙盒缓存
118.网络通信用过哪些方式?
解: ios设备的网络通信的方法,有如下两个大类:
1、使用socket的方式进行通信。
2、使用asynsocket类库进行通信。
119.如何处理多个网络请求并发的情况?
解: //了解(并发)当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。
遇到这种情况建议使用第三方的网络库。比如AFNetworking。也可以通过GCD和NSOperationQueue来控制并发
5、在网络请求中如何提高性能?
1.减少请求带宽-JSON和XML是常见的请求与响应提的编码方式。压缩模式的效率在很大程序上取决于待压缩的数据,通常情况下JSON更高效
2.降低请求延迟
3.避免网络请求-利用缓存机制,缓存的内容就不要再次请求了
6、如何保证数据安全性(请求和存储)?
对称加密,非对称加密。
6、发送10个网络请求,然后再接收到所有回应之后执行后续操作,如何实现?
使用dispatch_group_t,开始一个任务enter,结束一个任务release,完成之后回调notify
dispatch_group_t queueGroup = dispatch_group_create();
dispatch_group_enter(queueGroup);
dispatch_group_leave(queueGroup);
dispatch_group_notify(queueGroup, dispatch_get_main_queue(), ^{
...........
});
10、发送10个网络请求,然后再接收到所有回应之后执行后续操作,如何实现?
参考答案:
从题目分析可知,10个请求要全部完成后,才执行某一功能。比如,下载10图片后合成一张大图,就需要异步全部下载完成后,才能合并成大图。
做法:通过dispatch_group_t来实现,将每个请求放入到Group中,将合并成大图的操作放在dispatch_group_notify中实现。
dispatch_queue_tqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_tgroup = dispatch_group_create();
dispatch_group_async(group, queue, ^{ /*加载图片1 */ });
dispatch_group_async(group, queue, ^{ /*加载图片2 */ });
dispatch_group_async(group, queue, ^{ /*加载图片3 */ });
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 合并图片
});
6、TCP和UDP的区别是什么?
TCP:传输控制协议、 有链接的、可靠的、
UDP:用户数据报协议、无链接的、不可靠、
8、TCP和UDP的区别是什么?
参考答案:
- TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序传输)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
- UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快,传输的是报文。
6、MD5和Base64的区别是什么,各自场景是什么?
参考:http://www.cnblogs.com/XL-Sunny/p/5614012.html
MD5: 不可逆、消息完整性保护。用于:1、一次性验证。2.安全访问认证。3、数字证书
Base64: 可逆、是一种编码方式,主要作用不是加密,是用来避免‘字节’中不能转换成可显示字符的数值,将二进制数据转换成文本数据,方便使用HTTP协议等。使用场合:表示、传输、储存一些二进制数据。
9、MD5和Base64的区别是什么,各自使用场景是什么?
参考答案:
做过加密相关的功能的,几乎都会使用到MD5和Base64,它们两者在实际开发中是最常用的。
- MD5:是一种不可逆的摘要算法,用于生成摘要,无法逆着破解得到原文。常用的是生成32位摘要,用于验证数据的有效性。比如,在网络请求接口中,通过将所有的参数生成摘要,客户端和服务端采用同样的规则生成摘要,这样可以防篡改。又如,下载文件时,通过生成文件的摘要,用于验证文件是否损坏。
- Base64:属于加密算法,是可逆的,经过encode后,可以decode得到原文。在开发中,有的公司上传图片采用的是将图片转换成base64字符串,再上传。在做加密相关的功能时,通常会将数据进行base64加密/解密。
6、网络通信用过哪些方式(100%的人说了AFNetworking...)
TCP
HTTP
HTTPS
UDP
Socket
6、如何处理多个网络请求并发的情况
参考:http://www.cnblogs.com/yanhuaxuanlan/p/4683557.html
用信号量,dispatch_semaphore_t
6、在网络请求中如何提高性能
1.减少请求带宽-JSON和XML是常见的请求与响应提的编码方式。压缩模式的效率在很大程序上取决于待压缩的数据,通常情况下JSON更高效
2.降低请求延迟
3.避免网络请求-利用缓存机制,缓存的内容就不要再次请求了
<不是很懂>
6、在网络请求中如何保证安全性
参考:http://blog.csdn.net/jt521xlg/article/details/49717571
1.用户post请求,不直接暴露参数信息
2.重要的数据,要加密,常见的MD5(不可逆),AES(可逆)
3.非重要的数据,要签名
4.利用token校验时效性
12、常见的Http状态码有哪些?
参考答案:
- 302是请求重定向。
- 500及以上是服务器错误,如503表示服务器找不到、3840表示服务器返回无效JSON。
- 400及以上是请求链接错误或者找不到服务器,如常见的404。
- 200及以上是正确,如常见的是200表示请求正常。
- 100及以上是请求接受成功。
更详细请阅读: Http状态码详细说明
13、iOS与H5交互的方式有哪些?
参考答案:
- 通过协议在shouldStartRequest中捕获请求,获取scheme来判断预先定义的功能,然后调用native代码。比如,定义点击图片调用native来展示大图,那么js接收到点击时,重定向将图片的url添加上自定义scheme,如HYBImagePreview://这样。更详细请阅读我的文章:Swift版、 Objective-C版本
- 通过iOS7以后引入的JavascriptCore框架来实现,通过注入对象的方式来实现,维护起来更简单。更详细请阅读我的文章:Oc版本与JS交互、Swift版与JS交互、如何使用的是WKWebView,可阅读WKWebView与JS交互
- 通过WebViewJavascriptBridge这个第三方库来实现,具体百度吧!
10、下面请求数据用了什么协议,请求的数据格式是什么?
UIWebView *webView=[[UIWebView alloc] initWithFrame:self.view.frame];
[webView loadRequest:[NSURLRequest request WithURL:[NSURLURL WithString:http:@"//pzpromop.s3.amazonaws.com/PromoNeutral.html"]]];
[self.view addSubview:webView];
使用了http协议请求的是html格式的数据
13 想传输一张图片,可以用什么协议传输?
答 可以用http ftp等协议。
4、如何处理多个网络请求并发的情况?
http://www.cnblogs.com/yanhuaxuanlan/p/4683557.html
1.并发当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。这种方式我们称之为并发(Concurrent)。2.并行当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
3.区别并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。
5.请简述你对缓存的实现和管理
要用到缓存的话,无非就是为了节约用户的流量,让我们程序响应快。那么,缓存又有两个了,一个内存缓存,一个银盘缓存,其实就是,第一检测有无内存缓存,有就加载,如果没有内存缓存,那就去看银盘的一个缓存,如有有就加载,没有,请求服务器。
在第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据,那就要把服务器返回的放入内存缓存中去,再写入硬盘,也可以叫做沙盒了
怎么实现的话,其实就是NSURLCache类缓存数据
缓存的注意事项:经常更新:不能用缓存!比如股票、彩票数据一成不变:果断用缓存。偶尔更新:可以定期更改缓存策略 或者 清除缓存。如果大量使用缓存,会越积越大,建议定期清除缓存
1、如何使应用程序在后台保持socket长连接?
通过设置以下属性可以保持socket连接和数据的继续传输:
1.需要在Info.plist文件中添加UIBackgroundModes中的VOIP键值;
2.设置流属性
CFReadStreamRef和CFWriteStreamRef通过如下方法设置kCFStreamNetworkServiceType属性为kCFStreamNetworkServiceTypeVoIP;
CFReadStreamSetProperty(theReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
CFWriteStreamSetProperty(theWriteStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
NSInputStream 和NSOutputStream通过如下方法设置NSStreamNetworkServiceType属性为NSStreamNetworkServiceTypeVoIP;
[self.stream setProperty: NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType];
3.这里有一个问题,就是客户端是通过心跳来和服务端保持连接,心跳是由定时器触发的,当我退到后台以后,定时器方法被挂起,那么通过如下设置来在后台运行定时器
- (void)applicationDidEnterBackground:(UIApplication *)application{
UIApplication *app = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier bgTask;
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
if (bgTask != UIBackgroundTaskInvalid)
{
bgTask = UIBackgroundTaskInvalid;
}
});
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
if (bgTask != UIBackgroundTaskInvalid)
{
bgTask = UIBackgroundTaskInvalid;
}
});
});
}
152.Do you use SDWebImage? If yes, why doyou choose this library? If no, how do you load an image from Internet to anUIImageView?
翻译:你使用SDWebImage吗?如果使用,你为什么使用这个库,如果不使用,你是怎样加载一张网络图片的?
答案:这个类库提供一个UIImageView类别以支持加载来自网络的远程图片。具有缓存管理、异步下载、同一个URL下载次数控制和优化等特征。
14 用NSURL初始化的NSData对象,用哪个类去解析?
答:这个需要根据NSData数据是什么类型 然后可以用对应的解析工具来解析。
16、afn底层怎么实现
整理AFNetworking
AFNetworking是对NSURLConnection和NSURLSession做的封装
在AFNetworking1.0版本用NSURLConnection —>AFHTTPRequestOperationManager在AFNetworking2.0版本用NSURLSession —>AFHTTPSessionManager
可以进行一些网络请求啊,数据上传,下载,检测网络状态等
一般开发中使用afn更多将afn封装成隔离网络框架,一个网络工具类,在网络工具类内部使用自定义的POST,GET方法将afn请求进一步封装,可以最大程度的降低对afn的依赖。
使用隔离网络框架好处,将所有网络请求交给网络工具类处理,更加方便后期的修改和维护。
再进行封装的话可以将数据库和隔离网络框架封装成DAL数据访问层(data Access Layer)。
增加DAL层的好处是,模型只需要调用自定义的接口就能加载数据,不需要关心数据是怎么来的,所有操作由内部完成,如果本地有数据,就加载本地缓存数据,如果没有,就调用网络隔离框架进行网络请求
将所有网络请求交给网络工具类处理,更加方便后期的修改和维护
再进行封装的话可以将数据库和隔离网络框架封装成DAL数据访问层(data Access Layer)
增加DAL层的好处是,模型只需要调用自定义的接口就能加载数据,不需要关心数据是怎么来的,所有操作由内部完成,如果本地有数据,就加载本地缓存数据,如果没有,就调用网络隔离框架进行网络请求
17.请解释下列HTTP状态码的含义?并列举你在开发过程中遇到的状态码,并说明造成的原因和你的解决方法。
(1).1xx (2).2xx
(3).3xx (4).4xx
(5).5xx
状态码 1信息提示 2成功 3重定向 4访问被拒绝 5服务器错误
15.AFNetWofking和ASIHttpRequest都是著名的Objective-C网络通讯开源项目,你能说说两者之间的区别吗(AF包含2.0和3.0)?
一、底层实现
1、AFN的底层实现基于OC的NSURLConnection和NSURLSession
2、ASI的底层实现基于纯C语言的CFNetwork框架
3、因为NSURLConnection和NSURLSession是在CFNetwork之上的一层封装,因此ASI的运行性能高于AFN
AFNetworking的下载地址: https://github.com/AFNetworking/AFNetworking二、对服务器返回的数据处理
1、ASI没有直接提供对服务器数据处理的方式,直接返回的是NSData/NSString
2、AFN提供了多种对服务器数据处理的方式
(1)JSON处理-直接返回NSDictionary或者NSArray
(2)XML处理-返回的是xml类型数据,需对其进行解析
(3)其他类型数据处理三、监听请求过程
1、AFN提供了success和failure两个block来监听请求的过程(只能监听成功和失败)
*success : 请求成功后调用
*failure : 请求失败后调用
2、ASI提供了3套方案,每一套方案都能监听请求的完整过程
(监听请求开始、接收到响应头信息、接受到具体数据、接受完毕、请求失败)
*成为代理,遵守协议,实现协议中的代理方法
*成为代理,不遵守协议,自定义代理方法
*设置block四、在文件下载和文件上传的使用难易度
1、AFN
*不容易实现监听下载进度和上传进度
*不容易实现断点续传
*一般只用来下载不大的文件
2、ASI
*非常容易实现下载和上传
*非常容易监听下载进度和上传进度
*非常容易实现断点续传
*下载大文件或小文件均可
3、实现下载上传推荐使用ASI五、网络监控
1、AFN自己封装了网络监控类,易使用
2、ASI使用的是Reachability,因为使用CocoaPods下载ASI时,会同步下载Reachability,但Reachability作为网络监控使用较为复杂(相对于AFN的网络监控类来说)
3、推荐使用AFN做网络监控-AFNetworkReachabilityManager六、ASI提供的其他实用功能
1、控制信号旁边的圈圈要不要在请求过程中转
2、可以轻松地设置请求之间的依赖:每一个请求都是一个NSOperation对象
3、可以统一管理所有请求(还专门提供了一个叫做ASINetworkQueue来管理所有的请求对象)
*暂停\恢复\取消所有的请求
*监听整个队列中所有请求的下载进度和上传进度
18.HTTP请求属于OSI中的哪一层?
七层结构:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
tcp属于传输层;http属于应用层。
1、401.402.403.常见的网络错误
404表示请求的资源不存在
2、网络七层协议
网络七层协议
OSI是一个开放性的通信系统互连参考模型,他是一个定义得非常好的协议规范。OSI模型有7层结构,每层都可以有几个子层。 OSI的7层从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 ;其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端的数据流。
中文名 网络七层协议
外文名 Open System Interconnection
英文缩写 OSI
属 性 开放式系统互联参考模型目录
1 各层功能
▪ 应用层
▪ 表示层
▪ 会话层
▪ 传输层
▪ 网络层
▪ 数据链路层
▪ 物理层
2 分层优点
3 主要组成
▪ 语义
▪ 语法
▪ 时序
4 发展
5 详细介绍
▪ 物理层
▪ 数据链路层
▪ 网络层
▪ 传输层
▪ 会话层
▪ 表示层
▪ 应用层
6 总结
7 好处各层功能
1、应用层
与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。示例:TELNET,HTTP,FTP,NFS,SMTP等。2、表示层
这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASCII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据。在接收方将标准的ASCII转换成接收方计算机的字符集。示例:加密,ASCII等。3、会话层
它定义了如何开始、控制和结束一个会话,包括对多个双向消息的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。4、传输层
这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。5、网络层
这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。示例:IP,IPX等。6、数据链路层
它定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。示例:ATM,FDDI等。7、物理层
OSI的物理层规范是有关传输介质的特这些规范通常也参考了其他组织制定的标准。连接头、帧、帧的使用、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。示例:Rj45,802.3等。分层优点
(1)人们可以很容易的讨论和学习协议的规范细节。
(2)层间的标准接口方便了工程模块化。
(3)创建了一个更好的互连环境。
(4)降低了复杂度,使程序更容易修改,产品开发的速度更快。
(5)每层利用紧邻的下层服务,更容易记住各层的功能。
大多数的计算机网络都采用层次式结构,即将一个计算机网络分为若干层次,处在高层次的系统仅是利用较低层次的系统提供的接口和功能,不需了解低层实现该功能所采用的算法和协议;较低层次也仅是使用从高层系统传送来的参数,这就是层次间的无关性。因为有了这种无关性,层次间的每个模块可以用一个新的模块取代,只要新的模块与旧的模块具有相同的功能和接口,即使它们使用的算法和协议都不一样。
网络中的计算机与终端间要想正确的传送信息和数据,必须在数据传输的顺序、数据的格式及内容等方面有一个约定或规则,这种约定或规则称做协议。主要组成
语义:
是对协议元素的含义进行解释,不同类型的协议元素所规定的语义是不同的。例如需要发出何种控制信息、完成何种动作及得到的响应等。
语法:
将若干个协议元素和数据组合在一起用来表达一个完整的内容所应遵循的格式,也就是对信息的数据结构做一种规定。例如用户数据与控制信息的结构与格式等。
时序:
对事件实现顺序的详细说明。例如在双方进行通信时,发送点发出一个数据报文,如果目标点正确收到,则回答源点接收正确;若接收到错误的信息,则要求源点重发一次。发展:
70年代以来,国外一些主要计算机生产厂家先后推出了各自的网络体系结构,但它们都属于专用的。
为使不同计算机厂家的计算机能够互相通信,以便在更大的范围内建立计算机网络,有必要建立一个国际范围的网络体系结构标准。
国际标准化组织ISO 于1981年正式推荐了一个网络系统结构----七层参考模型[1] ,叫做开放系统互连模型(Open System Interconnection,OSI)。由于这个标准模型的建立,使得各种计算机网络向它靠拢,大大推动了网络通信的发展。
OSI 参考模型将整个网络通信的功能划分为七个层次,见图1。它们由低到高分别是物理层(PH)、数据链路层(DL)、网络层(N)、传输层(T)、会话层(S)、表示层(P)、应用层(A)。每层完成一定的功能,每层都直接为其上层提供服务,并且所有层次都互相支持。第四层到第七层主要负责互操作性,而一层到三层则用于创造两个网络设备间的物理连接。详细介绍
1、物理层
物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础。物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境。1.1媒体和互连设备
物理层的媒体包括架空明线、平衡电缆、光纤、无线信道等。通信用的互连设备指DTE和DCE间的互连设备。DTE即数据终端设备,又称物理设备,如计算机、终端等都包括在内。而DCE则是数据通信设备或电路连接设备,如调制解调器等。数据传输通常是经过DTE——DCE,再经过DCE——DTE的路径。互连设备指将DTE、DCE连接起来的装置,如各种插头、插座。LAN中的各种粗、细同轴电缆、T型接、插头,接收器,发送器,中继器等都属物理层的媒体和连接器。
1.2物理层的主要功能
1.2.1为数据端设备提供传送数据的通路,数据通路可以是一个物理媒体,也可以是多个物理媒体连接而成。一次完整的数据传输,包括激活物理连接,传送数据,终止物理连接.所谓激活,就是不管有多少物理媒体参与,都要在通信的两个数据终端设备间连接起来,形成一条通路。
1.2.2传输数据.物理层要形成适合数据传输需要的实体,为数据传送服务。一是要保证数据能在其上正确通过,二是要提供足够的带宽(带宽是指每秒钟内能通过的比特(BIT)数),以减少信道上的拥塞。传输数据的方式能满足点到点,一点到多点,串行或并行,半双工或全双工,同步或异步传输的需要。
1.3物理层的一些重要标准
物理层的一些标准和协议早在OSI/TC97/C16 分技术委员会成立之前就已制定并在应用了,OSI也制定了一些标准并采用了一些已有的成果.下面将一些重要的标准列出,以便读者查阅.ISO2110:称为"数据通信----25芯DTE/DCE接口连接器和插针分配"。它与EIA(美国电子工业协会)的"RS-232-C"基本兼容。ISO2593:称为"数据通信----34芯DTE/DCE----接口连接器和插针分配"。ISO4092:称为"数据通信----37芯DTE/DEC----接口连接器和插针分配".与EIARS-449兼容。CCITT V.24:称为"数据终端设备(DTE)和数据电路终接设备之间的接口电路定义表".其功能与EIARS-232-C及RS-449兼容于100序列线上。
2、数据链路层
数据链路可以粗略地理解为数据通道。物理层要为终端设备间的数据通信提供传输媒体及其连接.媒体是长期的,连接是有生存期的.在连接生存期内,收发两端可以进行不等的一次或多次数据通信.每次通信都要经过建立通信联络和拆除通信联络两过程.这种建立起来的数据收发关系就叫作数据链路.而在物理媒体上传输的数据难免受到各种不可靠因素的影响而产生差错,为了弥补物理层上的不足,为上层提供无差错的数据传输,就要能对数据进行检错和纠错.数据链路的建立,拆除,对数据的检错,纠错是数据链路层的基本任务。
2.1链路层的主要功能
链路层是为网络层提供数据传送服务的,这种服务要依靠本层具备的功能来实现。链路层应具备如下功能:
2.1.1链路连接的建立,拆除,分离。
2.1.2帧定界和帧同步。链路层的数据传输单元是帧,协议不同,帧的长短和界面也有差别,但无论如何必须对帧进行定界。
2.1.3顺序控制,指对帧的收发顺序的控制。
2.1.4差错检测和恢复。还有链路标识,流量控制等等.差错检测多用方阵码校验和循环码校验来检测信道上数据的误码,而帧丢失等用序号检测.各种错误的恢复则常靠反馈重发技术来完成。
2.2数据链路层的主要协议
数据链路层协议是为发对等实体间保持一致而制定的,也为了顺利完成对网络层的服务。主要协议如下:
2.2.1 ISO1745--1975:"数据通信系统的基本型控制规程".这是一种面向字符的标准,利用10个控制字符完成链路的建立,拆除及数据交换.对帧的收发情况及差错恢复也是靠这些字符来完成.ISO1155, ISO1177, ISO2626, ISO2629等标准的配合使用可形成多种链路控制和数据传输方式.
2.2.2 ISO3309--1984:称为"HDLC 帧结构".ISO4335--1984:称为"HDLC 规程要素 "。ISO7809--1984:称为"HDLC 规程类型汇编"。这3个标准都是为面向比特的数据传输控制而制定的。有人习惯上把这3个标准组合称为高级链路控制规程.
2.2.3 ISO7776:称为"DTE数据链路层规程".与CCITT X.25LAB"平衡型链路访问规程"相兼容。
2.3链路层产品
独立的链路产品中最常见的当属网卡,网桥也是链路产品。MODEM的某些功能有人认为属于链路层,对此还有争议.数据链路层将本质上不可靠的传输媒体变成可靠的传输通路提供给网络层。在IEEE802.3情况下,数据链路层分成了两个子层,一个是逻辑链路控制,另一个是媒体访问控制。下图所示为IEEE802.3LAN体系结构。
AUI=连接单元接口 PMA=物理媒体连接
MAU=媒体连接单元 PLS=物理信令
MDI=媒体相关接口
3、网络层
网络层的产生也是网络发展的结果.在联机系统和线路交换的环境中,网络层的功能没有太大意义.当数据终端增多时。它们之间有中继设备相连.此时会出现一台终端要求不只是与唯一的一台而是能和多台终端通信的情况,这就是产生了把任意两台数据终端设备的数据链接起来的问题,也就是路由或者叫寻径。另外,当一条物理信道建立之后,被一对用户使用,往往有许多空闲时间被浪费掉.人们自然会希望让多对用户共用一条链路,为解决这一问题就出现了逻辑信道技术和虚拟电路技术。
3.1网络层主要功能
网络层为建立网络连接和为上层提供服务,应具备以下主要功能:
3.1.1路由选择和中继.
3.1.2激活,终止网络连接.
3.1.3在一条数据链路上复用多条网络连接,多采取分时复用技术 .
3.1.4差错检测与恢复.
3.1.5排序,流量控制.
3.1.6服务选择.
3.1.7网络管理.
3.2网络层标准简介
网络层的一些主要标准如下:
3.2.1 ISO.DIS8208:称为"DTE用的X.25分组级协议"
3.2.2 ISO.DIS8348:称为"CO 网络服务定义"(面向连接)
3.2.3 ISO.DIS8349:称为"CL 网络服务定义"(面向无连接)
3.2.4 ISO.DIS8473:称为"CL 网络协议"
3.2.5 ISO.DIS8348:称为"网络层寻址"
3.2.6 除上述标准外,还有许多标准。这些标准都只是解决网络层的部分功能,所以往往需要在网络层中同时使用几个标准才能完成整个网络层的功能.由于面对的网络不同,网络层将会采用不同的标准组合.
在具有开放特性的网络中的数据终端设备,都要配置网络层的功能.现在市场上销售的网络硬设备主要有网关和路由器.4、传输层
传输层是两台计算机经过网络进行数据通信时,第一个端到端的层次,具有缓冲作用。当网络层服务质量不能满足要求时,它将服务加以提高,以满足高层的要求;当网络层服务质量较好时,它只用很少的工作。传输层还可进行复用,即在一个网络连接上创建多个逻辑连接。 传输层也称为运输层.传输层只存在于端开放系统中,是介于低3层通信子网系统和高3层之间的一层,但是很重要的一层.因为它是源端到目的端对数据传送进行控制从低到高的最后一层.有一个既存事实,即世界上各种通信子网在性能上存在着很大差异.例如电话交换网,分组交换网,公用数据交换网,局域网等通信子网都可互连,但它们提供的吞吐量,传输速率,数据延迟通信费用各不相同.对于会话层来说,却要求有一性能恒定的界面.传输层就承担了这一功能.它采用分流/合流,复用/解复用技术来调节上述通信子网的差异,使会话层感受不到.
此外传输层还要具备差错恢复,流量控制等功能,以此对会话层屏蔽通信子网在这些方面的细节与差异.传输层面对的数据对象已不是网络地址和主机地址,而是和会话层的界面端口.上述功能的最终目的是为会话提供可靠的,无误的数据传输.传输层的服务一般要经历传输连接建立阶段,数据传送阶段,传输连接释放阶段3个阶段才算完成一个完整的服务过程.而在数据传送阶段又分为一般数据传送和加速数据传送两种。传输层服务分成5种类型.基本可以满足对传送质量,传送速度,传送费用的各种不同需要.传输层的协议标准有以下几种:
ISO8072:称为"面向连接的传输服务定义"
ISO8072:称为"面向连接的传输协议规范"
5、会话层
会话层提供的服务可使应用建立和维持会话,并能使会话获得同步。会话层使用校验点可使通信会话在通信失效时从校验点继续恢复通信。这种能力对于传送大的文件极为重要。会话层,表示层,应用层构成开放系统的高3层,面对应用进程提供分布处理,对话管理,信息表示,恢复最后的差错等.
会话层同样要担负应用进程服务要求,而运输层不能完成的那部分工作,给运输层功能差距以弥补.主要的功能是对话管理,数据流同步和重新同步。要完成这些功能,需要由大量的服务单元功能组合,已经制定的功能单元已有几十种.现将会话层主要功能介绍如下.
5.1为会话实体间建立连接。
为给两个对等会话服务用户建立一个会话连接,应该做如下几项工作:
5.1.1将会话地址映射为运输地址
5.1.2选择需要的运输服务质量参数(QOS)
5.1.3对会话参数进行协商
5.1.3识别各个会话连接
5.1.4传送有限的透明用户数据
5.2数据传输阶段
这个阶段是在两个会话用户之间实现有组织的,同步的数据传输.用户数据单元为SSDU,而协议数据单元为SPDU.会话用户之间的数据传送过程是将SSDU转变成SPDU进行的.
5.3连接释放
连接释放是通过"有序释放","废弃","有限量透明用户数据传送"等功能单元来释放会话连接的.会话层标准为了使会话连接建立阶段能进行功能协商,也为了便于其它国际标准参考和引用,定义了12种功能单元.各个系统可根据自身情况和需要,以核心功能服务单元为基础,选配其他功能单元组成合理的会话服务子集.会话层的主要标准有"DIS8236:会话服务定义"和"DIS8237:会话协议规范".6、表示层
表示层的作用之一是为异种机通信提供一种公共语言,以便能进行互操作。这种类型的服务之所以需要,是因为不同的计算机体系结构使用的数据表示法不同。例如,IBM主机使用EBCDIC编码,而大部分PC机使用的是ASCII码。在这种情况下,便需要会话层来完成这种转换。
通过前面的介绍,我们可以看出,会话层以下5层完成了端到端的数据传送,并且是可靠,无差错的传送.但是数据传送只是手段而不是目的,最终是要实现对数据的使用.由于各种系统对数据的定义并不完全相同,最易明白的例子是键盘,其上的某些键的含义在许多系统中都有差异.这自然给利用其它系统的数据造成了障碍.表示层和应用层就担负了消除这种障碍的任务.
对于用户数据来说,可以从两个侧面来分析,一个是数据含义被称为语义,另一个是数据的表示形式,称做语法.像文字,图形,声音,文种,压缩,加密等都属于语法范畴.表示层设计了3类15种功能单位,其中上下文管理功能单位就是沟通用户间的数据编码规则,以便双方有一致的数据形式,能够互相认识.ISO表示层为服务,协议,文本通信符制定了DP8822,DP8823,DIS6937/2等一系列标准.
7、应用层
应用层向应用程序提供服务,这些服务按其向应用程序提供的特性分成组,并称为服务元素。有些可为多种应用程序共同使用,有些则为较少的一类应用程序使用。应用层是开放系统的最高层,是直接为应用进程提供服务的。其作用是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务.其服务元素分为两类:公共应用服务元素CASE和特定应用服务元素SASE.CASE提供最基本的服务,它成为应用层中任何用户和任何服务元素的用户,主要为应用进程通信,分布系统实现提供基本的控制机制.特定服务SASE则要满足一些特定服务,如文卷传送,访问管理,作业传送,银行事务,订单输入等.
这些将涉及到虚拟终端,作业传送与操作,文卷传送及访问管理,远程数据库访问,图形核心系统,开放系统互连管理等等.应用层的标准有DP8649"公共应用服务元素",DP8650"公共应用服务元素用协议",文件传送,访问和管理服务及协议.
总结
OSI七层模型是一个理论模型,实际应用则千变万化,因此更多把它作为分析、评判各种网络技术的依据;对大多数应用来说,只将它的协议族(即协议堆栈)与七层模型作大致的对应,看看实际用到的特定协议是属于七层中某个子层,还是包括了上下多层的功能。
好处编辑
1.使人们容易探讨和理解协议的许多细节。
2.在各层间标准化接口,允许不同的产品只提供各层功能的一部分,(如路由器在一到三层),或者只提供协议功能的一部分。(如Win95中的Microsoft TCP/IP)
3.创建更好集成的环境。
4.减少复杂性,允许更容易编程改变或快速评估。
5.用各层的headers和trailers排错。
6.较低的层为较高的层提供服务。
7.把复杂的网络划分成为更容易管理的层。