iOS网络协议--HTTP/TCP/IP
一. TCP/IP协议
-
TCP、IP协议的介绍
两台电脑要通讯就必须遵守共同的规则,就好比两个人要沟通就必须使用共同的语言一样。一个只懂英语的人,和一个只懂中文的人由于没有共同的语言(规则)就没法沟通。两台电脑之间进行通讯所共同遵守的规则,就是网络协议。
-
TCP/IP协议的制定
国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI(开放式系统互联)模型。要制定通讯规则,内容会很多,比如要考虑A电脑如何找到B电脑,A电脑在发送消息给B电脑时是否需要B电脑进行反馈,A电脑传送给B电脑的数据的格式又是怎样的?内容太多太杂。OSI模型制定的七层标准模型是:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。虽然国际化组织制定了这样一个网络协议的模型,但是实际上互联网通讯视同的网络协议是TCP/IP网络协议。
TCP/IP是一个协议族,也是按照层次划分。共四层:应用层,传输层,互连网络层,网络接口层。那么TCP/IP协议和OSI模型有什么区别呢?OSI网络协议模型,是一个参考模型,而TCP/IP协议是事实上的标准。TCP/IP协议参考了OSI模型,但是并没有严格按照OSI规定的七层去划分,而只是划分了四层,个人决定这样会更简单点,当划分太多层次时,你很难区分某个协议是属于哪个层次的。TCP/IP协议和OSI模型也并不冲突,TCP/IP协议中的应用层协议,就对应于OSI中的应用层,表示层,会话层。就像以前有工业部和信息产业部,现在实行打不制后只有工业和信息化部一个部门,但是这个部门还是要做以前两个部门一样多的事情,本质上没有多大的差别。TCP/IP中有两个重要的协议,传输层的TCP协议和互连网络层的IP协议,因此就拿这两个协议做代表,来命名整个协议族了,在说TCP/IP协议时,是指整个协议族。
TCP/IP协议分为四个层次,但我们并不需要了解所有层次的协议,我觉得主要关注应用层和传输层的协议就可以了。拿寄送邮件举例,A寄邮件给B,A关心的是用什么格式写什么内容给B(应用层内容),是寄挂号信还是寄平信(传输层内容), 但是A是不会去关注邮件传送过程中采用了那条路线,邮递员是如何把信件递送到B手里的(互连网络层,网络接口层)。
先说传输层,传输层有多个协议,但最主要的是TCP和UDP协议,两则的区别在于TCP协议需要接收方反馈,UDP协议不需要接收方反馈。TCP就像挂号信,A电脑发信息给B电脑后,需要得到B电脑的反馈,这样A电脑就能知道B电脑是否已经收到信息。UDP就像平信,A电脑发信息给B电脑后,B电脑并不给A电脑反馈,A电脑发送信息出去后并不知道B电脑是否已经收到。因此,TCP传输比UDP传送更可靠,但是TCP传输的效率就不如UDP了。至于,在传送过程中具体选择哪种传送方式,需要具体问题具体分析。在不可靠的网络传送过程中一般选择TCP传送方式。在讲求效率,或者不在乎传送失误的情况下可以选择UDP方式来提高传输速率。
应用层的协议有很多,每一个协议代表一种类型的服务。HTTP协议,万维网服务。FTP协议,文件传送服务。POP3,邮件服务,SOAP(简单对象访问协议)协议webService服务。
在理解TCP/IP协议的过程中,我遇到了困惑。
- 什么是socket?
- 以前有听说过socket编程这种说法,也有的说套接字编程。我在搜索关于socket的资料时,发现有的说socket是指一个连接,有的说socket是指一个端点。拿打电话做比喻,A电话机和B电话机正在通话,那么socket是指的是A和B之间的连接线呢,还是指电话机(端点)?
- 我现在的理解是,socket就是一个连接中的一个端点,一次通讯(连接)a,b端都会有一个socket。一个socket对应一个连接。
- SOAP可以使用HTTP协议进行传输吗?
- 在了解SOAP协议的过程中,看到介绍说SOAP可以通过TCP,UDP,HTTP协议来传送。这也是让人困惑的描述。一看这句话,就会感觉HTTP怎么和TCP,UDP协议并列了呢?难道HTTP还是属于传输层协议?再加上HTTP中文译名的问题,名字听上去像传输层,初学者又要开始头大了。
- 事实上,HTTP是应用层的协议,这一点可以毫无怀疑,那么现在新问题来了,SOAP和HTTP都是应用层协议,怎么说SOAP能用HTTP协议来传输呢?应用层的协议可以用应用层的协议传送吗?
- 我查阅了资料,是这样一回事,SOAP将信息进行XML(Extensive Markup Language可扩展标示语言)序列化后,再用HTTP协议的方式再打包进行传送,传送的方式还是TCP或者UDP,做个比喻就好理解了。TCP和UDP都是公路,暂且把TCP认为是一般公路,UDP是高速公路,SOAP和HTTP就都是汽车,那么SOAP和HTTP都可以在TCP和UDP上跑。说SOAP可以通过HTTP来传送,实际就是说SOAP是小轿车,HTTP是装轿车的卡车,把SOAP的信息装到HTTP里面,然后再运输,当然走的道路还是TCP或UDP。
- 说SOAP可以通过HTTP协议来传输,这句话不太准确,比较准确的说法是:SOAP信息可以使用HTTP协议包装后通过TCP或UDP传输。
二、HTTP协议
HTTP (全称:Hyper Text Transport Protocol) 超文本传输协议,是一种应用层的协议;Transport有运输,转移之意。不管是移动客户端还是PC端,访问远程的网络资源经常使用HTTP协议。
-
URL
-
基本介绍
URL的全称是Uniform Resource Locator (统一资源定位符)
通过1个URL,能找到互联网上唯一的一个资源,也就是一个资源对应唯一一个URL。
URL的基本格式 = 协议://主机地址/路径。 http://www.cnblogs.com/songlei0601/articles/5959241.html http://101.169.1.1/songlei/sl.gif 协议:不同的协议,代表着不同的资源查找方式、资源传输方式 主机地址:存放资源的主机的IP地址(域名) 路径:资源在主机中的具体位置
- URL中常见的协议
- HTTP 超文本传输协议,访问的是远程的网络资源,格式是http://
- file 访问的是本地计算机上的资源,格式是file://(不用加主机地址)
- mailto 访问的是电子邮件地址,地址是mailto:
- FTP 访问的是共享主机的文件资源,格式是ftp://
-
-
HTTP协议简介
- HTTP协议的作用
-
规定客户端和服务器之间的数据传输格式
-
让客户端和服务器能有效地进行数据沟通
1、 ---------请求 客户端 ----HTTP协议----> 服务器 2、 ---------响应 客户端 <----HTTP协议---- 服务器
-
为什么选择使用HTTP?
- 简单快速。 因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快
- 灵活。 HTTP允许传输任意类型的数据
- HTTP 0.9和1.0使用非持续连接,限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间。
-
HTTP向服务器索取数据的过程
- 请求:客户端向服务器索要数据
- 响应:服务器返回客户端相应的数据
-
- HTTP协议的作用
三、HTTP通信过程 - 请求和响应
-
HTTP通信过程 - 请求
HTTP协议规定:一个完整的由客户端发给服务器的HTTP请求中包含以下内容:
- 请求行:包含了请求方法、请求资源路径、HTTP协议版本
GET /Users/songleiMac/Downloads/sl.jpg HTTP/1.1
- 请求头:包含了对客户端的环境描述、客户端请求的主机地址等信息
Host: 192.168.1.105:8080// 客户端想访问的服务器主机地址
User-Agent: Mozilla/5.0(Macintosh; Intel Mac OS X 10.12) Firefox/30.0//客户端的类型,客户端的软件环境
Accept:text/html, */*// 客户端能接受的数据类型
Accept-Language:zh-cn// 客户端的语言环境
Accept-Encoding:gzip//客户端支持的数据压缩格式
- 请求体:客户端发给服务器的具体数据,比如文件数据。
-
HTTP通信过程-响应
客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端
HTTP协议规定:1个完整的HTTP响应中包含以下内容:
- 状态行:包含了HTTP协议版本、状态码、状态英文名称
HTTP/1.1 200 OK
- 响应头:包含了对服务器的描述、对返回数据的描述
Server: Apache-Coyote/1.1//服务器的类型
Content-Type:image/jpeg//返回数据的类型
Content-Length: 56800//返回数据的长度
Date: wed. 9 Nov 2016 16:23:52 GMT //响应的时间
- 实体内容:服务器返回给客户端的具体数据,比如文件数据
客户端------请求行、请求头、请求体------>服务器
客户端<------响应行、响应头、实体内容------服务器
-
补充
推荐工具:Firebug
虫子的作用:拦截所有的http请求。
-
常见的响应状态吗
- 状态码----英文名称----中文描述
- 200----OK----请求成功
- 400----Bad Request----客户端请求的语法错误,服务器无法解析
- 404----Not Found----服务器无法根据客户端的请求找到资源
- 500----Internal Server Error----服务器内部错误,无法完成请求
四、发送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请求
要想使用GET和POST请求跟服务器进行交互,得先了解一个概念:参数就是传递给服务器的具体数据,比如登录时的账号、密码
GET和POST对比:GET和POST的主要区别表现在数据传递上
GET
在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如
http://www.test.com/login?username=123&pwd=123&type=JSON注意:由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB
POST
发给服务器的参数全部放在请求体中
理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)
-
GET和POST的选择
选择GET和POST的建议:
- 如果要传递大量数据,比如文件上传,只能用POST请求
- GET的安全性比POST要差些,如果包含机密、敏感信息,建议用POST
- 如果仅仅是索取数据(数据查询),建议使用GET
- 如果是增加、修改、删除数据,建议使用POST
-
iOS中发送HTTP请求的方案
在iOS中,常见的发送HTTP请求(GET和POST)的解决方案有:
-
苹果原生(自带):
NSURLConnection: 用法简单,最古老最经典最直接的一种方案
NSURLSession: iOS 7 新出的技术,功能比NSURLConnection更加强大
CFNetWork: NSURL 的底层,纯C语言
-
第三方框架:
ASIHttpRequest: 外号“HTTP终结者”,功能极其强大,可惜早已停止更新。
AFNetworking: 简单易用,提供了基本够用的常用功能。
-
-
ASI和AFN架构对比:
说明:AFN基于NSURL, ASI基于CFHTTP, ASI的性能更好一些。