iOS开发:iOS中的HTTP协议

来源:互联网 发布:不是windows平台fips 编辑:程序博客网 时间:2024/06/06 03:12

1.HTTP协议:

Hypertext Transfer Protocol 超文本传输协议
该协议用于规定客户端和服务端之间的传输规则,所传输的内容不局限于文本
这里写图片描述

1.1 HTTP优点:

  • 简单快速:http协议简单,通信速度很快;
  • 灵活:http协议允许传输任意类型的数据;
  • 短连接:http协议限制每次连接只处理一个请求,服务器对客户端的请求作出响应后,马上断开连接。这种方式可以节省传输时间。

2.HTTP的请求与响应

POST请求的示例图:
这里写图片描述
以上示例图中其实已经包含了一个HTTP请求所必备的几大要素:请求行、请求头(headerField)、请求体(body);同理,响应也有状态行、响应头、实体内容。接下来我们逐个展开。

2.1 请求行

请求行包含请求方法(Method)、统一资源标识符(URI)HTTP版本号
这里写图片描述
- 请求方法就是我们所熟悉的 GET POST PUT HEAD等
- URI就是URL中排除掉Host剩下的部分,也就是资源在服务器本地上的路径
- HTTP版本号,目前主流的版本是1.1(1999年开始采用),最新的版本号是2.0(2015年5月发布)

2.2 请求头

这里写图片描述
上面方框中的内容就是我们请求头中包含的具体数据
HTTP请求在iOS中用NSURLRequest与NSMutableRequest表示;HTTP响应用NSHTTPURLRequest表示

  • Host:m.baidu.com 客户端想要访问的目标服务器主机地址
  • Accept:让服务端知道客户端所能接受的数据类型,如text/html
  • Content-Type:body中的数据类型,如application/json;charset=UTF-8
  • Accept-Encoding:客户端支持的数据压缩格式:如gzip
  • User-Agent: 客户端的软件环境,我们可以更改该字段为自己客户端的名字,比如QQ music v1.11,比如浏览器Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Maxthon/4.5.2
  • Connection: keep-alive,该字段是从HTTP 1.1才开始有的,用来告诉服务端这是一个持久连接,“请服务端不要在发出响应后立即断开TCP连接”。关于该字段的更多解释将在后面的HTTP版本简介中展开
  • Content-Length: body的长度,如果body为空则该字段值为0。该字段一般在POST请求中才会有。
    注:POST请求的body请求体也有可能是空的,因此POST中Content-Length也有可能为0
  • Cookie: 记录者用户信息的保存在本地的用户数据,如果有会被自动附上

2.3 请求体

真正需要发给服务端的数据,在使用POST-multipart上传请求中请求体就是上传文件的二进制NSData类型数据;在GET请求中请求体为空;在普通的POST请求中请求体就是一些表单数据。在iOS中一般用NSURLRequest与NSMutableURLRequest的HTTPBody属性表示,添加body用-[NSMutableURLRequest setHTTPBody:]。

2.4 响应:服务器返回客户端想要的数据

http协议规定:一个完整的http响应包含’状态行’,’响应头’,’实体内容’三个部分;

  • 状态行:包含了http协议版本,状态吗,状态英文名称.
    “HTTP/1.1 200 OK”
    这个部分需要讲的是错误码。事实上HTTP请求错误码可以根据错误码从左往右第一个数字大致分为以下几类:
    1XX:信息提示。不代表成功或者失败,表示临时响应,比如100表示继续,101表示切换协议
    2XX: 成功
    3XX: 重定向
    4XX:客户端错误,很有可能是客户端发生问题,如亲切可爱的404表示未找到文件,说明你的URI是有问题的,服务器机子上该目录是没有该文件的;414URI太长
    5XX: 服务器错误,比如504网关超时
    错误码是不用去记的,出错了再查对应的错误码含义就行。但是知道上面的分类有助于第一时间做出大体的判断,起码你能清楚是服务端还是客户端的原因。

  • 响应头:包含了对服务器的描述,对返回数据的描述.
    Content-Encoding: gzip(服务器支持的数据压缩格式) Content-Length: 1528(返回数据的长度)
    Content-Type:application/xhtml+xml;charset=utf-8(返回数据的类型)
    Date: Mon,15Jun201509:06:46GMT(响应的时间) Server: apache (服务器类型)

  • 实体内容:服务器返回给客户端的具体数据(图片/html/文件…).


3.发送HTTP请求

在iOS开发中,发送http请求的方案有很多,常见的有如下几种:

  • 苹果原生:
    1).NSURLConnection:用法简单,古老经典的一种方案。
    2).NSURLSession:iOS7以后推出的技术,功能NSURLConnection更加强大。
    3).CFNetWork:NSURL的底层,纯C语言,一般不用。
  • 第三方框架:
    AFNetWorking(OC);Alamofire(swift);

4.HTTP版本简介

4.1 HTTP 1.1之前

  • 不支持持久连接,一旦服务器对客户端发出响应就立即断开TCP连接
  • 无请求头和响应头
  • 客户端的前后请求是同步的,下一个请求必须等上一个请求从服务端拿到响应之后才能发出,有点类似多线程的同步机制

4.2 HTTP 1.1 (主流版本)

与1.1之前的版本相比,做了以下性能上的提升

  • 增加请求头和响应头
  • 支持持久连接。客户端通过请求头中指定Connection为keep-alive告知服务端不要在完成响应后立即释放连接。HTTP是基于TCP的,在HTTP 1.1中一次TCP连接可以处理多次HTTP请求
  • 客户端不同请求之间是异步的。下一个请求不必等到上一个请求回来后再发出,而可以连续发出请求,有点类似多线程的异步处理。

4.3 HTTP 2.0

本着向下兼容的原则,1.1版本有的特性2.0都具备,也使用相同的API。但是2.0将只用于https网址。由于2.0的普及还需要比较长的一段时间,这里不展开,更多新特性请参考这篇文章。

4.4 HTTP1.1版本的革新:支持持久连接的意义

HTTP是基于TCP连接的,如果连接被频繁地启动然后断开就会花费很多资源在TCP三次握手以及四次挥手上,效率低下。以请求一个网页为例,我们知道,一个html网页上的图片资源并不是直接嵌入在网页上,而只是提供url,图片仍需要额外发HTTP 请求去下载。一个网页从请求到最终加载到本地往往需要经过过个HTTP请求。在1.1版本之前请求一个网页就需要发生多次”握手-挥手”的过程,每次连接之间相互独立;而1.1及之后的版本最少只需要一次就够。
还有就是异步请求,就像多线程的异步请求一样,两次请求不必顺序执行,可以异步加载

以上特性可以用下图表示:
这里写图片描述
我们可以看到:1、N次请求其实只建立了1次TCP连接,2、N次请求连续异步发出。


5.HTTP、Socket、TCP的区别

这三个概念经常被谈到,也是比较容易被混掉的概念。在回顾之前我们先看一下这三者在TCP/IP协议族中的位置关系:

HTTP是应用层的协议,更靠近用户端;TCP是传输层的协议;而socket是从传输层上抽象出来的一个抽象层,本质是接口。所以本质上三种还是很好区分的。尽管如此,有时候你可能会懵逼,HTTP连接、TCP连接、socket连接有什么区别?好吧,如果上面的图解释的还是不够清楚的话,我们继续往下看。

5.1 TCP连接与HTTP连接的区别

上面我们说过,HTTP是基于TCP的,客户端网服务端法索一个HTTP请求时第一步就是要建立与服务端的TCP连接,也就是三次握手的过程:“你好,你好,你好”,从HTTP 1.1开始支持持久连接,也就是一次TCP连接可以发送多次HTTP请求
小总结:HTTP基于TCP

5.2 TCP连接与Socket连接的区别

在图4.1中我们提到,socket层只是在TCP/UDP传输层上做的一个抽象接口层,因此一个socket连接可以基于连接,也有可能基于UDP。基于TCP协议的socket连接同样需要通过三次握手建立连接,是可靠的;基于UDP协议的socket连接不需要建立连接的过程,不过对方能不能收到都会发送过去,是不可靠的,大多数的即时通讯IM都是后者。
小总结:Socket也基于TCP

5.3 HTTP连接与Socket连接的区别

区分这两个概念是比较有意义的,毕竟TCP看不见摸不着,HTTP与Socket是实实在在能用到的。

  • HTTP是短连接,Socket是基于TCP的长连接。尽管从HTTP 1.1开始支持持久连接,但仍无法保证始终连接

  • HTTP连接服务器端无法主动发送消息,Socket连接双方请求的发送没有先后限制。这点就比较重要了,在客户端还没有发送消息给服务端前,服务端无法发送消息给客户端。必须满足看过的发送消息在前,服务端回复在后。Socket连接双方类似peer2peer的关系,一方可以随时向另一方喊话。


以上就是我通过网上搜索的一些前辈的经验总结出来的内容,也是自己对知识的一种积累吧。下篇文章想对Socket的内容做一些了解,先去看看资料… (逃
参考网址:
http://www.cocoachina.com/ios/20160325/15773.html
http://www.cocoachina.com/ios/20160223/15347.html

原创粉丝点击