iOS中的网络构架
(从上层到下层依次为Cocoa\Web Kit\Core Foundation\OS\Hardware)
Cocoa (面向对象的框架集) 包含基于OC的API
Cocoa层是基于Core Foundation实现的
NSURL : 就是我们在浏览器上看到的网站的地址,是一个字符串,这个字符串比较复杂,包括很多请求数据,在请求过程中需要解析出来每个部门,所以封装一个 NSURL
Web Kit : iOS8 之后引入的新的框架,有 WKWebView 可以替换 UIKit 的 UIWebView 和 appKit 的 WebView,而且提供了两个平台可以一致使用的接口。(UIWebView 是基于移动版的 Safari,所以性能有限)
Game Kit : 是 iOS SDK 中一个常用的框架,核心功能有三个:1. 交互游戏平台(Game Center) 2. P2P设备通信功能 3. in-Game Voice
Bonjour(NSNetService) : 是 Apple 推出的零配置网络协议,主要目的是在缺少中心服务器的情况下解决网络设备的IP的获取,名称解析和服务发现等关键问题
IP 地址的获取 : 传统网络环境下,设备的IP地址通过两种方式后去,一种是静态配置,通过手工方式为设备指定一个IP地址,一种是动态配置,设备通过路由器的DHCP服务获得动态的IP地址。
每个IP可以对应多个域名,但是一个域名只能对应一个IP
Core Foundation (核心框架) 包含基于C的API
因为直接使用socket需要更多的编程工作,Apple 对OS层socket进行了简单的封装以简化编程任务
包含 CFNetwork(基于CFStream 和 CFSocket)、CFNetServices 和
CoreBluetooth
OS (系统)
BSD : BSD socket 提供了与远端设备、与服务器通信的完全控制能力,但是编程工作最多,Apple 建议我们使用 Core Foundation 及上层的 API 进行编程
Hardware (硬件层)
Wi-Fi Celluar(蜂窝网络) Bluetooth(蓝牙)
从上层框架到下层的移动,会获得更为严密和更大程度的控制,但是失去了上层提供的API的易用性与抽象能力。
四种常见的URL模型:文件、HTTP、HTTPS 和 FTP
SMTP : 邮件协议
抓包
(Wireshark)
目前我们主要是抓http类型的包,先过滤http的,然后通过ip进行过滤
抓包基本方法:先把Wireshark打开,然后快速在网页或是app上与服务器连接(进入网页/点击button等等),再等Wireshark有数据回来后快速点击暂停。
在搜索栏输入 http && (ip.dst == 目标ip)&&(ip.src == 源ip)
HTTP协议 (超文本传输协议)
协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则
Tim Berners-Lee于1990年创造了HTTP协议的首个版本,最初的提案中有三个重要的创新:HTML、HTTP 和 URL
1. HTML 定义了向 文本添加样式 的一种方式 (传过来是什么样子的)
2. HTTP 定义了在服务端与客户端之间 传输数据 的一种方式 (怎么传)
3. URL 定义了在网络机器中 定位唯一资源 的一种方式 (东西在哪)
URL结构
schema://host[:port]/path/…/[?query-string][#anchor]
协议://主机名[:端口]/绝对路径/[?查询字符串1&查询字符串2][锚]
绝对路径和查询字符串不可以包含空格、回车与换行符,因此,URL通常使用百分号进行编码,RFC 3986(http://tools.ietf.org/html/rfc3986)规定了URL百分号编码的详细信息
HTTP请求与响应
http://www.cnblogs.com/yin-jingyu/archive/2011/08/01/2123548.html
HTTP的规范是IETF FRF 2616 http://www.ietf.org/rfc/rfc2616.txt
端口号默认是 80
中括号扩起来的东西是可选的(可写可不写)
在终端中输入 “dig + 网址” 可以查看网址的信息
Web服务器,浏览器,代理服务器
- 当我们打开浏览器,在地址栏中输入URL,我们的浏览器给Web服务器发送了一个Request
- Web服务器接到Request后进行处理,生成相应的Response,然后发送给浏览器,浏览器解析Response中的HTML,然后我们就看到了网页
代理服务器就是网络信息的中转站,它的功能:提高访问速度,大多数的代理服务器都有缓存功能;突破限制,也就是翻墙了;隐藏身份
请求内容
HTTP请求包含3部分:请求行、请求头与请求体,请求头和请求体之间有个空行
HTTP协议是无状态的
同一个客户端的这次请求和上次请求是没有对应关系,对http服务器来说,它并不知道这两个请求来自同一个客户端,当前网页和上一个网页没有联系。为了解决这个问题,Web程序引入了Cookie机制来维护状态
请求内容Request
第一行中的Method表示请求方法,比如“POST”和”GET”,创建一个请求的时候,默认的是GET请求,当使用”GET”方法的时候,body是空的,我们平时上网时使用的是”GET”,是明文传输,所有的内容都会显示,如果需要输入账号和密码等加密传输的东西时,应该使用”POST”传输。
Path-to-resource表示请求资源,Http/version-number 表示http协议的版本号,请求体必须遵循客户端与服务器之间预先确定的数据编码,对于web浏览器来说,通常是表单编码数据,对于移动数据来说,通常是 XML 或 JSON 数据
Get是向服务器发索取数据的一种请求;而Post是向服务器提交数据的一种请求,要提交的数据位于信息头后面的实体中
大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说Content-Length必须出现。
响应内容Response
与请求内容的格式相同,HTTP/version-number表示HTTP协议的版本号,status code 和 message 分别是状态码和状态消息,状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response
TCP:传输层 IP:网络层 (需要了解TCP/IP协议站)
TCP三次握手
报文:网络传输数据的一个单元(数据块)
抓包的时候src代表数据的发送者,dst表示接收者
Cocoa层iOS HTTP API
在URL加载系统中,有3个主要方式可以执行HTTP请求和接收响应
1. 同步 (线程会被阻塞)
2. 队列式异步 (创建一个队列并放入后台线程执行)
3. 异步 (调用委托方法)
所有的URL加载请求方式都会用到这4类对象:
NSURL、NSURLRequest、NSURLConnection 与 NSURLResponse 对象