你需要了解的事——网络
前言
网络的知识范围很大,本篇文章只提取作为一个前端,我们需要关注的部分。
目录
一、URL
二、HTTP协议
三、Cookie和Session机制
四、HTTPS协议
五、TLS和SSL协议
六、端口
七、网络请求
八、常见的网络响应状态码
九、iOS中的网络请求和数据解析
十、iOS中HTTPS的实现(证书验证)
一、URL
网络的内容很大,我们要如何谈论网络与前端的关系呢,或许,从URL开始是一个可行的方式。
URL是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址
。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置
以及浏览器应该怎么处理它
。
http:// hostname /absoltuePath ?query
- http:// : 协议
- hostname : 主机名
- /absoltuePath : 资源路径(接口名称)
- query : 查询条件(接口字段,多个条件用&连接,
只有get请求才将请求参数拼接到URL后面
)
URL
决定网络通信的目标
和信息处理方式
:协议
决定客户端和服务器之间传输数据的标准和规范,域名/IP
定位通信的服务器,端口号
定位通信的服务器中的服务。
二、HTTP协议
HTTP协议,即超文本传输协议(HTTP,HyperText Transfer Protocol)。是一个客户端和服务器之间传输文本、图片、语音、视频等文件信息的标准和规范。
1、 HTTP和HTTPS协议的发展历程:
HTTP和HTTPS协议的发展历程2、 HTTP协议中规范的网络请求的工作流程:
HTTP协议中规范的网络请求的工作流程TCP层面的三次握手:
- C->S:请求报文
- S->C:确认报文
- C->S:确认报文
HTTP层面的数据请求和响应:
- C->S:请求报文
- S->C:响应报文
TCP层面的四次挥手(客户端或者服务端都可能是先提出终止报文的一方):
- C->S:终止报文
- S->C:确认报文(关闭C->S的连接通道)
- S->C:终止报文
- C->S:确认报文(关闭S->C的连接通道)
3、 HTTP报文的格式
- 请求报文
- 响应报文(这里的实体主体指的就是post请求里的body)
三、Cookie和Session机制
-
由于HTTP协议设计原则是
无状态
的,为了分辨
链接是谁发起的,产生了Session
和Cookie
机制。 -
Session
和Cookie
并不是
http协议的一部分。 -
Cookie机制采用的是在
客户端
保持状态的方案,而Session机制采用的是在服务器端
保持状态的方案。 -
同时,由于采用服务器端保持状态的方案,在客户端也需要保存一个标识,所以Session机制可能需要借助于Cookie机制来达到保存标识的目的,但实际上它还有其他选择。
四、HTTPS协议
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道
,简单讲是HTTP的安全版
。即HTTP下加入SSL
层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
1、HTTPS和HTTP的区别主要为以下四点:
- HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
- HTTP是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的SSL加密传输协议。
- HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是
80
,后者是443
。 - HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
2、HTTP和HTTPS的层次结构区别:
HTTP和HTTPS的层次结构区别3、HTTPS协议下的网络请求工作流程:
HTTPS协议下的网络请求工作流程五、TLS和SSL协议
1、SSL和TLS:
在HTTP和HTTPS协议下的网络请求的层次结构图和工作流程图中,我们看到了区别两者的TSL&SSL,这是什么呢?
- SSL:安全套接层(Secure Sockets Layer)。
- TLS:传输层安全性协议(Transport Layer Security)。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。
- TLS与SSL在
传输层
对网络连接
进行加密
,为网络通信提供安全
及数据完整性
的一种安全协议
。TLS是SSL的继任者
。
2、SSL协议的作用:
-
配备身份证书
,认证用户和服务器,防止被冒充
,确保数据发送到正确的客户机和服务器; -
加密数据
,以防止数据中途被窃取; -
具有数据校验机制
,维护数据的完整性,确保数据在传输过程中不被改变。
3、SSL连接建立的过程
以下红色加粗部分为SSL的四次握手
:
-
C->S
:握手信息:随机数1,协商的加密算法或者客户端支持的加密算法 -
S->C
:响应握手信息:随机数2,匹配好的协商加密算法,C->S的加密算法的子集 -
S->C
:服务端的证书 -
C:对服务端的证书进行验证(评估信任证书),校验它是否是有效的,是否是合法的
评估信任证书:
1、验证 服务端证书的数字摘要 和 服务证书解密后的内容是否一致 (验证是否篡改)
2、初级验证证书链,证书有副证书,证书有副证书,所以需要逐级向上查找到根证书,判断根证书是否在浏览器或者操作系统的可信任列表中 -
C:组装会话秘钥:根据随机数1,随机数2,预主秘钥 组装 会话秘钥(在C和S握手的时候,传递了随机数1和2,所以C和S都有了随机数1和随机数2)
-
C->S
:用服务端传来的证书里的公钥,加密预主秘钥 -
S:通过私钥解密预主秘钥
-
S:组装会话密钥:根据随机数1,随机数2,预主秘钥 组装 会话秘钥
-
C->S:用组装出来的会话秘钥去加密一条消息,把加密后的握手信息传递给服务端,验证服务端能否正常接收客户端加密过的数据消息
-
S->C:用组装出来的会话秘钥去加密一条消息,把加密后的握手信息传递给服务端,验证客户端能否正常接收解密
4、加密
- 对称加密算法(AES、DES):在对称加密算法中,使用的
密钥只有一个
,发收信双方都使用
这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥
。
- 非对称加密算法(RSA):乙方
生成一对密钥
并将其中的一把作为公用密钥(公钥)向其它方公开
;得到该公用密钥的甲方使用该密钥(公钥)
对机密信息进行加密
后再发送给乙方;乙方再用自己保存的另一把专用密钥(私钥)
对加密后的信息进行解密
。
- 对称加密算法和非对称加密算法的比较:对称加密算法的
秘钥要通过网络传输
,如果遭遇截获,第三方就可以使用秘钥自己进行解密。非对称算法的公钥在网络上传输,私钥不在网络上传输
,即使公钥被截获,也无法解密,更加安全。但非对称加密非常损耗性能,一般用来保证预主秘钥传输的安全,包证后续的对称加密的安全,其他网络加密解密还是用对称加密。
两者混用,比保证安全,又保证高效性。
六、端口
端口号定位通信的服务器中的服务。一个端口号对应一个服务。
- 21:FTP服务
- 443:HTTPS
- 1080:代理服务器端口
- 80:用来服务HTTP协议。如果你要做一个服务器,那么你必须这台电脑的80端口给别人连。
七、网络请求
请求方式有9种,但是我们一般使用的多的是get和post:
-
get请求:
- 从服务器请求数据,通常不包含请求体
- get请求所有数据暴露在URL
- 传送数据量较小
- 安全性低
-
post请求:
- 向服务器发送数据
- post数据封装在请求体中
- 传送数据量不受限制
- 安全性高
八、常见的网络响应状态码
- 1xx(临时响应):表示临时响应并需要请求者继续执行操作的状态代码。
- 2xx (成功):表示成功处理了请求的状态代码,说明网页可以正常访问。
- 3xx (重定向):表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
- 4xx(请求错误):这些状态代码表示请求可能出错,妨碍了服务器的处理。
- 5xx(服务器错误):这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
常见状态码:
- 200(成功):服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
- 301(永久移动) 请求的网页已被永久移动到新位置。服务器返回此响应时,会自动将请求者转到新位置。您应使用此代码通知搜索引擎蜘蛛网页或网站已被永久移动到新位置。
- 304(未修改) 自从上次请求后,请求的网页未被修改过。服务器返回此响应时,不会返回网页内容。
- 400(错误请求):服务器不理解请求的语法。
- 401(身份验证错误):此页要求授权。您可能不希望将此网页纳入索引。
- 404(未找到):服务器找不到请求的网页。例如,对于服务器上不存在的网页经常会返回此代码。
- 500(服务器内部错误):服务器遇到错误,无法完成请求。
- 503(服务不可用):目前无法使用服务器(由于超载或进行停机维护)。通常,这只是一种暂时的状态。
- 504(网关超时):服务器作为网关或代理,未及时从上游服务器接收请求。
九、iOS中的网络请求和数据解析
1、iOS中的原生网络请求相关类:
- NSURL:用来标识客服端访问哪台网络服务器的资源。
- NSURLRequest:用来标识客户端发起的网络求情内容(默认的请求方式GET)。
- NSMutableURLRequest:用来标识客户端发起的网络求情内容,有
setHTTPMethod:
和setHTTPBody:
方法,可以设置网络请求的方式,和需要传输的Body。 - NSURLConnection:客户端与服务器端建立的网络连接(初始化的时候有一个协议(NSURLConnectionDataDelegate)的代理只要设置,然后需要实现接收网络响应结果的方法)。
// 1.接收到服务器的响应 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; // 2.接收到服务器的数据,这个方法中,数据是分割返回的,需要拼接。 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; // 3.服务器的数据接收完毕 - (void)connectionDidFinishLoading:(NSURLConnection *)connection; // 4.请求错误 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
- NSURLResponse:服务端给予客户端请求的响应结果。
2、iOS中的第三方网络请求类:
3、iOS中的网络数据解析:
网络请求到的数据是加密的,在服务器数据接收完毕的方法中,将拼接好的数据,进行解析。
- NSJSONSerialization
4、iOS9的ATS特性:
基于安全的考虑,iOS9中新增App Transport Security(简称ATS)特性,强制使用HTTPS,提升安全级别。
为了便于版本迭代,在info.plist
文件的Infomation Property List
中如下设置,可以正常使用HTTP请求:
十、iOS中HTTPS的实现(证书验证)
以下两个代理方法都可以进入证书验证的过程,干涉SSL连接的建立。
- NSURLConnection<NSURLConnectionDelegate>
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;
- NSURLSession<NSURLSessionTaskDelegate>
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler;
/* NSURLSession *session:一次会话
* NSURLSessionDataTask *dataTask:一个网络请求任务
*
* NSURLAuthenticationChallenge *challenge:认证挑战,
* 该类有一个成员变量NSURLProtectionSpace *protectionSpace(受保护空间),
* protectionSpace的成员变量SecTrustRef serverTrust(服务器信任),
* 它携带者服务端关于返回的证书以及系统的默认验证策略。
*
* NSURLSessionAuthChallengeDisposition disposition:标识认证挑战的一个策略(枚举)
* NSURLCredential * _Nullable credentia:用来认证的证书
*/
推荐阅读