面试

网络请求和性能优化

2016-09-06  本文已影响1258人  闪电迷

URL:

"URL":统一资源定位符。协议头/主机地址/路径。

请求协议:

1,file://访问的是本地计算机上的资源。

2,ftp://访问的是共享主机的文件资源。

3,mailto://访问的是电子邮件地址。

4,http://超文本传输协议,访问的是远程的网络资源。

TCP/IP协议。

IP按照层次划分,IP网际协议位于网络层,IP协议的作用就是把各种数据包传送给对象。

TCP按照层次划分,TCP协议位于传输层,提供了可靠的字节流服务,字节流服务指为了翻遍传输大块的数据分割成以报文段为单位的数据包进行管理。而且TCP协议能够确认数据最终是否已经送达到对方。

为了准确无误的将数据送达到目的地,TCP采用了三次握手的策略:握手工程中使用TCP的标志、SYN和ACK。

三次握手过程:发送端首先发送一个带SYN标志的数据包给对方。接收端接收到后,回传一个带有SYN/ACK标志的数据包,以表示传达确认信息,最终发送端再回传一个带ACK标志的数据包,标识握手结束。

DNS服务和HTTP协议一样位于应用层,他提供域名到IP地址间的解析服务。


性能优化:

出发点:1,努力消除或减少不必要的网络延迟。2,将需要传输的数据压缩至最少。

性能优化的最佳实践:

1,减少DNS查找:每次主机名的解析都需要一次网络往返,从而增加了请求的延迟时间,同时还会阻塞后续的请求。

2,重用TCP连接:尽可能的使用持久连接,以消除因TCP握手和慢启动导致的延迟。

3,减少HTTP重定向。HTTP冲定向需要额外的DNS查询、TCP握手等非常耗时,最佳的重定向次数为0.

4,使用CDN(内容分发网络):把数据放在离用户地理位置更近的地方,可以明显减少每次TCP连接的网络延迟,增大吞吐量。

5,删除没有必要请求的资源。

6,在客户端缓存资源:缓存必要的应用资源,避免每次都重复请求相同的内容,例如多图片下载可以考虑使用缓存。

7,内容在传输前先压缩:传输数据之前应该先压缩应用资源,把要传输的字节减少到最小,在压缩的时候确保对每种不同的资源采用最好的压缩手段。

8,消除不必要的请求开销:减少请求的HTTP首部数据(比如HTTP cookie).

9,并行处理请求和响应:请求和响应的派对都会导致延迟,可以尝试并行的处理请求和响应(利用多个HTTP1.1连接实现并行下载,在可能的情况下使用HTTP管道计数)。

10,针对协议版本采取优化措施。升级到HTTP2.0。

网络请求:

"GET和POST请求"区别在于参数的传递。GET参数在url后面,参数不能超过1KB,POST的请求放在请求体中,理论上POST传递的数据量没有限制,具体还得按服务器的处理能力。

iOS中发送请求的方案:1,NSURLConnection:是03年推出的技术,没怎么接触过。

2,NSURLSession:13年iOS7推出以后,用来取代NSURLConnection的技术。

3,第三方框架:AFNetworking。工作中用的比较多,方便快捷。

"使用NSURLSession发送网络请求"创建task,然后执行task。

NSURLSessionTask是一个抽象类,本身是不能使用的,只能使用它的子类:NSURLSessionDataTask、NSURLSessionUploadTask、NSURLSessionDownloadTask。

发送GET和POST请求

/*

发送GET请求:

1,创建NSURLSession对象(或者用单利对象)

NSURLSession *session = [NSURLSession sharedSession];

2,根据URL创建请求。(url后直接跟请求内容)

NSURLRequest *request = [NSURLRequest requestWithURL:url];

3,根据请求创建task。

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) {

//拿到响应头信息

NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;

//4.解析拿到的响应数据

NSLog(@"%@\n%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding],res.allHeaderFields);

}];

4,还得执行task。(task刚创建出来默认是挂起状态的,需要调用该方法启动任务)

[dataTask resume];

还可以使用第二种方法:该方法可以直接填写url参数,内部会将url包装成请求

- (nullable NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error))completionHandler;

发送POST请求:

1,创建NSURLSession对象(或者用单利对象)

NSURLSession *session = [NSURLSession sharedSession];

2,根据URL创建请求对象。(url后请求内容封闭到请求体内部)

NSURLRequest *request = [NSURLRequest requestWithURL:url];

3,修改请求模式为POST。

request.HTTPMethod = @"POST";

4,设置请求体:

request.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];

5,根据请求创建task。

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) {

//拿到响应头信息

NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;

//解析拿到的响应数据

NSLog(@"%@\n%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding],res.allHeaderFields);

}];

6,执行task。

[dataTask resume];

上一篇下一篇

猜你喜欢

热点阅读