网络篇一:网络基础
- 为什么学习网络编程?
- 网络编程是一种实时更新应用数据的常用手段
基本概念
- 在网络编程中,有几个必须掌握的基本概念
- 客户端(Client):移动应用(iOS、android等应用)
- 服务器(Server):为客户端提供服务、提供数据、提供资源的机器
- 请求(Request):客户端向服务器索取数据的一种行为
- 响应(Response):服务器对客户端的请求做出的反应,一般指返回数据给客户端
-
作为移动开发工程师,主要的精力都是放在客户端开发
- 服务器
- 服务器常用的开发语言: java/php/.net/node.js
- 按照软件开发阶段来分,服务器可以大致分为2种
- 远程服务器
- 别名:外网服务器、正式服务器
- 使用阶段:应用上线后使用的服务器
- 使用人群:供全体用户使用
- 速度:取决于服务器的性能、用户的网速
- 本地服务器
- 别名:内网服务器、测试服务器
- 使用阶段:应用处于开发、测试阶段使用的服务器
- 使用人群:仅供公司内部的开发人员、测试人员使用
- 速度:由于是局域网,所以速度飞快,有助于提高开发测试效率
- 远程服务器
- 服务器的基本概念
- 分3类:项目/服务器环境/DNS解析器
- 项目就是你的代码,写完打包成war,这是java项目,然后上传到服务器里的tomcat里,就能访问了
- 这时候只能IP访问,但是你把域名和IP绑定后,就能域名访问了
- 常见的IP访问样式:
http://172.16.15.42:8080/yihuxi/v2.1/user/patients
- http://: 是协议类型
- 172.16.15.42 :是主机地址,也是这台主机的IP地址
- :8080: 端口号,这台主机上的那个应用进程
- /yihuxi/v2.1/user/patients: 资源路径
- 常见的域名访问样式:
https://api.xyjtech.com/yihuxi/v2.1/user/patients
- https://: 是协议类型
- api.xyjtech.com: 通过中间服务器,映射成:
172.16.15.42:8080
- /yihuxi/v2.1/user/patients: 资源路径
- 常见的IP访问样式:
- 意思就是一个中间服务器,他存着域名和服务器IP的映射
- 直接访问服务器IP ,有个DNS解析器,把你的请求最终最终指向服务器的IP地址了
- 服务器也是两个概念
- 硬件服务器就是指你的工程运行的真实机器,比如你的电脑,或者阿里云上的电脑,然后这个服务器上需要装服务器的运行环境,譬如tomcat
- 软件服务器:你写的java项目
- 结构:硬件+软件+你的工程代码
- 为何要放在别人的服务器(硬件)上?
- 咱们的家用电脑没有公网IP
- 只有商用宽带才能有固定公网IP
- 既然使用域名还得解析那么麻烦,为何还要用域名呢?
- 保持对外的稳定,当更换服务器后,只需要域名解析到新的地址就可以
- 有一些是不想直接对外暴露,就用代理去转发
- 比如:APP调用服务器的一个接口,接口地址:
pc.xyjtech.com/login
,pc.xyjtech.com
的实际IP是101.201.116.172:80
;使用代理,我可能实际转发给了101.201.116.173:8080
端口,只是对外统一由pc.xyjtech.com
接收
- 比如:APP调用服务器的一个接口,接口地址:
HTTP
- 如何找到服务器?
- 网络中部署着各种各样的服务器,比如腾讯的服务器、百度的服务器,那么问题来了,客户端如何找到想要连接的服务器?
- 客户端通过URL找到想要连接的服务器
- URL
- 什么是URL?
- URL的全称是Uniform Resource Locator(统一资源定位符)
- 说白了就是用来找资源的
- 通过1个URL,能找到互联网上唯一的1个资源
- URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URL
- URL的基本格式 = 协议://主机地址/路径(例如: http://202.108.22.5/img/bdlogo.gif)
- 协议:不同的协议,代表着不同的资源查找方式、资源传输方式
- 主机地址:存放资源的主机(服务器)的IP地址(域名)
- 路径:资源在主机(服务器)中的具体位置
- URL中常见的协议
- HTTP
- 超文本传输协议,访问的是远程的网络资源,格式是:http://
- http协议是在网络开发中最常用的协议
- file
- 访问的是本地计算机上的资源,格式是:file://(不用加主机地址)
- mailto
- 访问的是电子邮件地址,格式是:mailto:
- FTP
- 访问的是共享主机的文件资源,格式是:ftp://
- HTTP
- 什么是URL?
- HTTP
- HTTP协议的简介
- 不管是移动客户端还是PC端,访问远程的网络资源经常使用HTTP协议
- 客户端该传什么格式的数据给服务器?服务器才能看懂?服务器该返回什么格式的数据给客户端?客户端才能看懂?两边要怎样传输数据才能有效沟通?
- 这就属于网络通信的应用层了,即我给对方写信,应该用哪种格式,对方回信应该用那种格式才能两方都看的懂呢?这就出现了HTTP协议的作用
- HTTP协议的作用
- HTTP的全称是Hypertext Transfer Protocol,超文本传输协议
- 规定客户端和服务器之间的数据传输格式
- 让客户端和服务器能有效地进行数据沟通
- 应用层有那么多协议,为何选择HTTP(即特点)?
- 简单快速:因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快
- 灵活: HTTP允许传输各种各样的数据
- HTTP 0.9和1.0使用非持续连接: 限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间
- HTTP的基本通信过程
- 要想使用HTTP协议向服务器索取数据,得先了解HTTP的通信过程
- 完整的http通信可以分为2大步骤
- 请求:客户端向服务器索要数据
- 响应:服务器返回客户端相应的数据
- 客户端开发主要是如何发送请求和如何解析服务器返回的数据
- 发送HTTP请求的方法
- 在HTTP/1.1协议中,定义了8种发送http请求的方法
- GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
- 根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式
- PUT :增
- DELETE :删
- POST:改
- GET:查
- 最常用的是GET和POST(实际上GET和POST都能办到增删改查)
- 要想使用GET和POST请求跟服务器进行交互,得先了解一个概念
- 参数: 就是传递给服务器的具体数据,比如登录时的帐号、密码
- 在HTTP/1.1协议中,定义了8种发送http请求的方法
- GET和POST对比
- GET和POST的主要区别表现在数据传递上
- GET
- 在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如
http://ww.test.com/login?username=123&pwd=234&type=JSON
- 由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB
- 在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如
- POST
- 发给服务器的参数全部放在请求体中
- 理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)
- GET和POST的选择
- 如果要传递大量数据,比如文件上传,只能用POST请求
- GET的安全性比POST要差些,如果包含机密\敏感信息,建议用POST
- 如果仅仅是索取数据(数据查询),建议使用GET
- 如果是增加、修改、删除数据,建议使用POST
- iOS中发送HTTP请求的方案
- 在iOS中,常见的发送HTTP请求的方案有
- 苹果原生(自带)
- NSURLConnection:用法简单,最古老最经典最直接的一种方案(03年出来的)【坑比较多:大文件下载需要自己处理内存】
- NSURLSession:功能比NSURLConnection更加强大,苹果目前比较推荐使用这种技术【2013推出,iOS7开始出的技术】
- CFNetwork:NSURL*的底层,纯C语言
- 第三方框架
- AFNetworking:简单易用,提供了基本够用的常用功能,维护和使用者多
- 苹果原生(自带)
- 为了提高开发效率,企业开发用的基本是第三方框架
- 在iOS中,常见的发送HTTP请求的方案有
- HTTP通信过程(格式)
- 请求
- HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容
- 请求头:包含了对客户端的环境描述、客户端请求信息等
- GET /minion.png HTTP/1.1 : // 包含了请求方法、请求资源路径、HTTP协议版本
- Host: 120.25.226.186:32812 // 客户端想访问的服务器主机地址
- User-Agent: Mozilla/5.0 // 客户端的类型,客户端的软件环境
- Accept: text/html,
*/*
// 客户端所能接收的数据类型 - Accept-Language: zh-cn // 客户端的语言环境
- Accept-Encoding: gzip // 客户端支持的数据压缩格式
- 请求体:客户端发给服务器的具体数据,比如文件数据(POST请求才会有,请求体)
- 请求头:包含了对客户端的环境描述、客户端请求信息等
- HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容
- 响应
- 客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端
- HTTP协议规定:1个完整的HTTP响应中包含以下内容
- 响应头:包含了对服务器的描述、对返回数据的描述
- HTTP/1.1 200 OK // 包含了HTTP协议版本、状态码、状态英文名称
- Server: Apache-Coyote/1.1 // 服务器的类型
- Content-Type: image/jpeg // 返回数据的类型
- Content-Length: 56811 // 返回数据的长度
- Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间
- 响应体:服务器返回给客户端的具体数据,比如文件数据
- 常见响应状态码
- 200 OK 请求成功
- 400 Bad Request 客户端请求的语法错误,服务器无法解析
- 404 Not Found 服务器无法根据客户端的请求找到资源
- 500 Internal Server Error 服务器内部错误,无法完成请求
- 请求
- HTTP协议的简介
HTTPS
- HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer)
- https == HTTP + ssl(secure socket layer,安全套接字层)
- 是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL(本质就是混合密码)
- 服务器内部受保护空间有一个安全证书,一旦客户端发送https请求,不是立刻返回数据给客户端,而是首先将这个证书传递给客户端
- 客户端要选择是否安装,客户端安装以后,客户端与服务器通道的所有数据都在这个证书内部进行,都通过这个证书进行加密的,此时就是一个安全通道
- 原理: 客户端发送的数据先通过公钥加密,服务器内部有一个私钥,拿到客户端加密后的数据然后通过私钥解密.
- 即使黑客拦截到通道中的数据,没有私钥,也无法进行解密
- 为何一般点击https的网页时,没有看到提示安装证书?
- 以前安装过
- 一些大的网站是可以强制安装的.
- HTTPS和HTTP的区别主要为以下四点:
- https协议需要到ca申请证书,一般免费证书很少,需要交费。
- http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全
- SSL
- SSL层介于应用层和TCP层之间.应用层数据不再直接传送给传输层,而是传递给SSL层,SSL层对收到的数据进行加密,并增加自己的SSL头
- 如下图
iOS中如何发送https的请求?
- 我们知道在手机上不可能弹出一个框让我们安装证书,那怎么办呢?手机上是自动安装证书的.
- iOS中的代码处理如下:
-
项目plist添加安全配置
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
-
代码如下:(直接使用AFN已经封装好了)
- 如果不做证书代码处理,像一些大型的网站是没问题的,他是强制安装,但是一些小型的没有购买CA证书,私签的,是获取不到数据的.
#import "ViewController.h" @interface ViewController () <NSURLSessionTaskDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //设置代理:监控网络请求过程 NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]]; //发送https请求 NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com/"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); }]; [task resume]; } #pragma mark - <NSURLSessionTaskDelegate> //在这个方法中对服务器返回的证书证书进行处理 //AFN中在这个方法中对证书的处理已经封装好了, //如果不做证书处理,有些网站的https不能返回数据. /** * challenge : 挑战、质询 授权质问 * completionHandler : 通过调用这个block,来告诉URLSession要不要接收这个证书 这个block有两个参数: 1. NSURLSessionAuthChallengeDisposition : 如何处理这个安全证书 1. NSURLSessionAuthChallengeUseCredential : 使用这个安全证书 2. NSURLSessionAuthChallengePerformDefaultHandling : 优先使用默认处理(默认忽略) 3. NSURLSessionAuthChallengeCancelAuthenticationChallenge: 取消这个授权质问(取消这个https请求) 4. NSURLSessionAuthChallengeRejectProtectionSpace: 拒绝安全空间 2.NSURLCredential :安全证书 */ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler { //如果公司的https请求,没法返回数据,写上下面两段即可. // 根据服务器的信任信息创建证书对象 //证书在受保护空间中: challenge.protectionSpace.serverTrust // NSURLCredential *crdential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; // 利用这个block说明使用这个证书 // if (completionHandler) { // completionHandler(NSURLSessionAuthChallengeUseCredential, crdential); // } // 如果不是服务器信任类型的证书,直接返回 //challenge.protectionSpace.authenticationMethod :拿到受保护空间的中授权方法 //NSURLAuthenticationMethodServerTrust : 这种证书的类型是服务器发送给客户端证书,客户端点击信任类型的证书,即服务器信任类型的证书 if (![challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) return; !completionHandler ? : completionHandler(NSURLSessionAuthChallengeUseCredential, challenge.proposedCredential); } @end
-