国际标准化组织(ISO)在1978年将计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。其中每一层都规定有明确的服务及接口标准;把用户的应用程序作为最高层;除了最高层外,中间的每一层都向上一层提供服务,同时又是下一层的用户。
http(超文本传输协议)
HTTP是客户端浏览器或其他程序与Web服务器之间的应用层通信协议,HTTP通信的基本单位是报文。在Http工作之前,客户端通过网络和服务器建立链连接,该连接是通过TCP来完成的,一般TCP接口的端口号是80(传输层主要有两个协议,分别是 TCP 和 UDP)。
常见状态码
![](https://img.haomeiwen.com/i5074489/9133c6de352623e7.png)
HTTP请求方法包括GET、POST、PUT、DELETE、PATCH、HEAD、
OPTIONS、TRACE。其中GET和POST最为常用。
GET和POST的区别
从语义角度来说,GET是从指定的资源请求数据,POST是向指定的资源提交要被处理的数据。通俗点将,GET是获取数据,POST是更新数据。
具体区别可以大致总结为一下几点:
(1) GET的URL可见,POST的URL不可见;
(2) GET请求可以被缓存,POST不会被缓存;
(3) GET请求可以保留在浏览器历史记录中,POST不会;
(4) GET请求有长度限制,2048个字节,POST长度没有限制;
(5) GET请求是幂等性的,POST是非幂等性的;
(6) GET请求的安全性没有POST高。
连接的建立需要通过三次握手,连接的断开需要通过四次挥手。
三次握手:第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据。
四次挥手:第一次握手:TCP发送一个FIN(结束),用来关闭客户到服务端的连接。
第二次握手:服务端收到这个FIN,他发回一个ACK(确认),确认收到序号为收到序号+1,和SYN一样,一个FIN将占用一个序号。
第三次握手:服务端发送一个FIN(结束)到客户端,服务端关闭客户端的连接。
第四次握手:客户端发送ACK(确认)报文确认,并将确认的序号+1,这样关闭完成。
HTTPS(:Hyper Text Transfer Protocol over Secure Socket Layer)
HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP+SSL/TSL
HTTPS使用端口443,而不是象HTTP那样使用端口80来通信。
HTTPS的建立流程
(1)客户使用https的URL访问服务器,要求与服务器建立SSL连接。
(2)服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户端的浏览器与服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
(5)服务器利用自己的私钥解密出会话密钥。
(6)服务器利用会话密钥加密与客户端之间的通信。
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
AFNetworking支持HTTPS
AFNetworking支持HTTPS相关的类为AFSecurityPolicy,其中AFNetworking提供了三种验证方式:
typedefNS_ENUM(NSUInteger, AFSSLPinningMode) {
AFSSLPinningModeNone,// 是默认的认证方式,只会在系统的信任的证书列表中对服务端返回的证书进行验证
AFSSLPinningModePublicKey,// 需要预先保存服务端发送的证书(自建证书),但是这里只会验证证书中的公钥是否正确
AFSSLPinningModeCertificate,// 需要客户端预先保存服务端的证书(自建证书)
};
// AFSecurityPolicy相关属性
// 验证方式,对应上面的三种验证方式
@property(readonly,nonatomic,assign) AFSSLPinningMode SSLPinningMode;
// 自建证书的时候,提供相应的证书
@property(nonatomic,strong,nullable)NSSet *pinnedCertificates;
// 是否允许自建证书
@property(nonatomic,assign)BOOLallowInvalidCertificates;
// 是否需要验证域名
@property(nonatomic,assign)BOOLvalidatesDomainName;
--------------------------------------
// AFSecurityPolicy相关方法
// 验证逻辑,这个方法在AFURLSessionManager这个类中,实现的NSURLSession的两个代理方法中调用。
// 具体验证逻辑,大家可读AFNetworking源码
- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust forDomain:(nullableNSString*)domain;
实际运用
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
policy.allowInvalidCertificates =YES;
policy.validatesDomainName =YES;
// 证书的路径
NSString*cerPath = ...;
NSData*cerData = [NSDatadataWithContentsOfFile:cerPath];
SecCertificateRef certificate = SecCertificateCreateWithData(NULL, (__bridgeCFDataRef)(cerData));
policy.pinnedCertificates = [NSSetsetWithObject:CFBridgingRelease(certificate)];
manager.securityPolicy = policy;
网友评论