HTTP协议

简介

HTTP 本质是位于OSI应用层的一种协议,全拼: hypertext transfer protocol 超文本传输协议(就是说什么数据格式都能传输)

本质是 请求—响应

请求

由三部分组成:请求行、请求头、请求体

如图:
osi

请求行

第一行是请求行:
请求方法(METHOD) 统一资源标识符(URI) HTTP版本号

1
2
3
请求方法: POST /GET /HEAD /PUT /DELETE
URI:URI就是URL中排除掉HOST剩下的部分,也就是资源在服务器上的地址
HTTP版本号目前主流是1.1

区别

HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接。
HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。
当然HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的
HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。

请求头header

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Host: 目标服务器的网络地址

Accept: 让服务端知道客户端所能接收的数据类型,如text/html */*

Content-Type: body中的数据类型,如application/json; charset=UTF-8

Accept-Language: 客户端的语言环境,如zh-cn

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请求中才会有。
Cookie: 记录者用户信息的保存在本地的用户数据,如果有会被自动附上

请求体

真正需要发给服务端的数据,在使用POST-multipart上传请求中请求体就是上传文件的二进制NSData类型数据;在GET请求中请求体为空;在普通的POST请求中请求体就是一些表单数据。

响应

osi

响应行

包含HTTP版本号、状态码、状态码对应的英文名称

状态码对应的信息

1
2
3
4
5
6
7
8
9
1XX:信息提示。不代表成功或者失败,表示临时响应,比如100表示继续,101表示切换协议

2XX: 成功

3XX: 重定向

4XX:客户端错误,很有可能是客户端发生问题,如亲切可爱的404表示未找到文件,说明你的URI是有问题的,服务器机子上该目录是没有该文件的;414URI太长

5XX: 服务器错误,比如504网关超时

响应头与响应体

与请求头与请求体基本一致,除却一些字段

HTTP版本差异

HTTP 1.1之前

1
2
3
4
5
不支持持久连接。一旦服务器对客户端发出响应就立即断开TCP连接(频繁创建会话费资源、影响性能)

无请求头跟响应头

客户端的前后请求是同步的。下一个请求必须等上一个请求从服务端拿到响应后才能发出,有点类似多线程的同步机制。(异步会走多线程,快捷)

HTTP 1.1(主流版本)

1
2
3
4
5
6
7
与1.1之前的版本相比,做了以下性能上的提升

增加请求头跟响应头

支持持久连接。客户端通过请求头中指定Connection为keep-alive告知服务端不要在完成响应后立即释放连接。HTTP是基于TCP的,在HTTP 1.1中一次TCP连接可以处理多次HTTP请求

客户端不同请求之间是异步的。下一个请求不必等到上一个请求回来后再发出,而可以连续发出请求,有点类似多线程的异步处理。

HTTP 2.0

1
本着向下兼容的原则,1.1版本有的特性2.0都具备,也使用相同的API。但是2.0将只用于https网址。

坚持原创技术分享,您的支持将鼓励我继续创作!