七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
物理层:计算机节点直接透明的比特流传输。尽可能屏蔽掉传输介质和物理设备直接的差异,使上层不必关心不同的传输介质带来的差异。主要目的是确定与传输媒体的接口一些特性。
数据链路层:两台主机之间的数据传输,总是在一段段的链路上传送,这需要特点的链路层协议。将网络层交付的IP数据包组装成帧,在两个节点直接传输帧。每一帧包含数据和必要的控制信息,控制信息包括每一帧的起止比特位。此外也检查每一帧是否有差错,如果有则丢弃
网络层: 选择两台主机直接的路由和交换节点。保证数据按时成功传送。在发送数据时,网络层包传输层报文或用户数据报封装成分组,并传输给数据链路层。在网络层使用的协议是无连接的网际协议(Internet Protocol)和许多路由协议,因此我们通常把该层简单地称为 IP 层。
传输层:这一层是包括了TCP和UDP,是比较重要的。其任务是为两台主机之间提供通信服务。应用层利用该服务传输应用层数据报文,并不针对某一种应用协议,多个应用可以使用同一个传输层服务。由于一台主机可以由多个线程,传输层也会被复用和分用。所谓复用就是指多个应用层进程可同时使用下面传输层的服务,分用和复用相反,是传输层把收到的信息分别交付上面应用层中的相应进程。
会话层:负责建立、管理和中止表示层实体至今的通信。该层提供了数据交换的界定和同步功能。包括建立检查点和恢复方法方案。
表示层: 是通信的应用程序能解释交换数据的含义。上为应用层提供服务,向下接收来自会话层的服务。主要包括:数据压缩、数据加密和数据描述。这使得应用程序不必担心在计算机上表示和存储的内部格式差异
应用层: 其作用是通过应用程序间的交互来完成特定的网络应用。该层协议定义了应用进程之间的交互规则,通过不同的应用层协议为不同的网络应用提供服务

Https: ssl + http 进行身份认证,加密传输;
SSL 协议的作用就是在传输层对网络连接进行加密
iOS中的NSURLSession会自动验证证书的有效性;
http:就是超文本传输协议;属于应用层协议,用于请求和响应服务器,以及数据封装;(TCP属于传输层协议,三次握手,发送报文给服务端,服务端接受报文,进入响应,返回报文;客户端接受报文,进入链接建立状态,回应报文);由请求行(包括,请求方法,URI,http版本号),请求头(host:目标网址,accept:接受数据类型,Connection连接方式,User-Agent客户端类型),请求内容 响应状态(200,404) 四部分组成;

HTTPS就是在HTTP的基础上,在传输层和应用层之间了一个SSL层;使用第三方CA颁发的证书;
一、首先HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一致、证书的公钥(RSA加密)等进行校验;
二、客户端如果校验通过后,就根据证书的公钥的有效, 生成随机数,随机数使用公钥进行加密(RSA加密);
三、消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名;
四、发送给服务端,此时只有服务端(RSA私钥)能解密。
五、解密得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)

http 断点续传原理
HTTP协议设置请求头内容,支持只请求某个资源的某一部分。
Range 请求的资源范围;
Content-Range 响应的资源范围;
在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,来实现断点续传。
分块请求资源实例:
Eg1:Range: bytes=306302- :请求这个资源从306302个字节到末尾的部分;
Eg2:Content-Range: bytes 306302-604047/604048:响应中指示携带的是该资源的第306302-604047的字节,该资源共604048个字节;
客户端通过并发的请求相同资源的不同片段,来实现对某个资源的并发分块下载。从而达到快速下载的目的。目前流行的FlashGet和迅雷基本都是这个原理。
例如:
1.客户端下载一个1024K的文件,已经下载了其中512K
2.网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段:
Range:bytes=512000-
这个头通知服务端从文件的512K位置开始传输文件
3.服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加:
Content-Range:bytes 512000-/1024000
并且此时服务端返回的HTTP状态码应该是206,而不是200。

HTTP通信机制是在一次完整的 HTTP 通信过程中,客户端与服务器之间将完成下列7个步骤:
1:建立 TCP 连接
在HTTP工作开始之前,客户端首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,因此 Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是80;
2:客户端向服务器发送请求命令
一旦建立了TCP连接,客户端就会向服务器发送请求命令;
例如:GET/sample/hello.jsp HTTP/1.1
3:客户端发送请求头信息
客户端发送其请求命令之后,还要以头信息的形式向服务器发送一些别的信息,之后客户端发送了一空白行来通知服务器,它已经结束了该头信息的发送;
4:服务器应答
客户端向服务器发出请求后,服务器会客户端返回响应;
例如: HTTP/1.1 200 OK
响应的第一部分是协议的版本号和响应状态码
5:服务器返回响应头信息
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同响应向用户发送关于它自己的数据及被请求的文档;
6:服务器向客户端发送数据
服务器向客户端发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 响应头信息所描述的格式发送用户所请求的实际数据;
7:服务器关闭 TCP 连接
一般情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接,然后如果客户端或者服务器在其头信息加入了这行代码 Connection:keep-alive ,TCP 连接在发送后将仍然保持打开状态,于是,客户端可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

网页输入url到浏览器显示页面的过程
https://zhuanlan.zhihu.com/p/133906695

iOS中AFN缓存配置
1:配置缓存空间:

NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 
                                            diskCapacity:20 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];    //设置共享缓存容器

2:AFN默认已经实现了willCacheResponse代理方法,只要满足这个代理方法的触发条件,那么该响应就会被缓存到本地。
并且如果在缓存响应之前想要修改这个响应,可以设置AFN的一个block,在这个block中修改响应信息,如下。(当然也可以在这个block中设置过滤,根据请求信息过滤掉不想缓存的响应)

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager setDataTaskWillCacheResponseBlock:^NSCachedURLResponse * _Nonnull(NSURLSession * _Nonnull session, 
           NSURLSessionDataTask * _Nonnull dataTask, NSCachedURLResponse * _Nonnull proposedResponse) {
    //修改响应信息
    NSURLResponse *response = proposedResponse.response;
    NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse*)response;
    NSDictionary *headers = HTTPResponse.allHeaderFields;
    NSCachedURLResponse *cachedResponse;
    //这里就可以针对Cache-Control进行更改,然后直接我们通过某方法获取NSCachedURLResponse的时候就可以先去判断下头域信息
    NSMutableDictionary *modifiedHeaders = headers.mutableCopy;
    [modifiedHeaders setObject:@"max-age=1000" forKey:@"Cache-Control"];
    NSHTTPURLResponse *modifiedResponse = [[NSHTTPURLResponse alloc] initWithURL:HTTPResponse.URL statusCode:
                                                   HTTPResponse.statusCode HTTPVersion:@"HTTP/1.1" headerFields:modifiedHeaders];
    cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:modifiedResponse data:proposedResponse.data
                                                 userInfo:proposedResponse.userInfo storagePolicy:proposedResponse.storagePolicy];
            
    return cachedResponse;      //返回修改后的响应
}];

如果想要AFN使用已经保存好的响应,那么直接设置AFN的缓存策略允许使用缓存即可,几种缓存使用策略上面已经介绍过了

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
通常在实际应用中需要根据不同的网络状态设置不同的缓存策略,一般对于JSON数据来说,因为它通常是非资源文件,可能会经常变动,所以在有网的情况下需要禁用缓存来实时刷新,在无网的情况下才使用缓存数据。通常可以配合AFN的网络监听一起使用,以达到在不同的网络环境下使用不同的缓存策略的效果。

//使用AFN框架来检测网络状态的改变

-(void)AFNReachability{
    /*
     AFNetworkReachabilityStatusUnknown     = 未知
     AFNetworkReachabilityStatusNotReachable   = 没有网络
     AFNetworkReachabilityStatusReachableViaWWAN = 3G
     AFNetworkReachabilityStatusReachableViaWiFi = WIFI
     */
    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                self.manager.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataDontLoad;
                break;
            case AFNetworkReachabilityStatusNotReachable:
                self.manager.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataDontLoad;
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                self.manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringCacheData;
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                self.manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringCacheData;
                break;
            default:
                self.manager.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataDontLoad;
                break;
        }
    }];
    //开始监听
    [manager startMonitoring];
}

参考连接:
http://www.cocoachina.com/articles/15773
https://blog.csdn.net/zhangliangzi/article/details/51336564
https://juejin.im/post/5a069b6d51882509e5432656
https://www.jianshu.com/p/6e9e4156ece3
https://blog.csdn.net/yicixing7/article/details/79320821
https://www.jianshu.com/p/45b9e905f84d