HyperText Transfer Protocol(HTTP)
HTTP 是一个用于传输超媒体文档(hypermedia documents)的应用层协议,其主要使用场景是网络浏览器和网络服务器之间进行通信.
1. 信息内容:web Page
浏览器中显示的页面叫做网页 (Web Page),其通常由如下两部分构成:
html 文件,描述对象和布局等信息
对象,单个页面中可能包含多个对象,这些对象可以是图片,文件,视频等.对象可能以 URL 形式给出
1.1 Hypertext Markup Language(HTML)
Hyper means over or above , 即 "超" 的意思.所谓超媒体,超文本,意指包括但不限于的意思.典型的超媒体文档类型为 HTML.
HTML 是一种用于创建网页的标准标记语言,和 CSS,JavaScript 一起构建了万维网(World Wide Web, WWW)的基础.通常我们可以按如下形式来理解三者的关系:
HTML 结构化元素:通过标记符号来标记要显示的网页中的各个基本元素如文字,图片甚至音视频等
CSS 呈现形式:定义不同呈现方式如字体,颜色,边距等
JavaScript 负责界面功能:定义不同组件的行为,形成交互
1.2 Uniform Resource Locator(URL)
Uniform Resource Identifier(URI) 是一个由字符组成的字符串,用于标示具体资源.URI 代表的是一种象征,象征着网络中每一个资源都有唯一的标识符以便于访问.URL 是 URI 的一种常见形式,另一种还有 Uniform Resource Name(URN),两者区别是:
URN 类似于人名,标示一个资源名称
URL 类似于地址,标示如何找到该资源
以
http://www.someSchool.edu/someDepartment/picture.gif
为例,URL 通常由两部分组成:
存储对象的主机名, www.someSchool.edu
主机中对象的具体路径,
/someDepartment/picture.gif
2. 通信流 (flow)
HTTP 使用 TCP 作为传输协议,Server 与 Client 交互过程中会建立 TCP 连接,但并不会保存任何 Client 的状态信息,因此 HTTP 也成为无状态 (stateless) 协议.
计算机相互之间进行通讯通常有两种方式:
请求响应(request-response) 向对端主机发送请求后需等待响应,这类通信过程就是由一系列的单次通信构成,典型应用如网页浏览
单向(one-way ) 向对端主机发送消息后无需等待回复,典型应用如邮件
2.1 TCP
如前文所述,HTTP 通信方式属于请求响应类型,因此单次通信流程通常为:
建立 TCP 连接
发送 HTTP 消息(message, 应用层信息单元)
读取服务器响应
关闭 TCP 连接
由于 HTTP 为无状态协议(即每次通信间无关联),因此通常来讲,HTTP 每次通信都是使用独立 TCP 连接的.大部分网络应用中,client 和 server 会在一定时间内通信多次,从每次 request 和 response 是否通过同一 TCP 链接发送的角度来看,可以划分为两种:
短连接(non-persistent connections),每个 request/response 对均使用单独 TCP 链接
长连接(persistent connections),每个 request/response 对均使用同一 TCP 链接
在 HTTP 0.9 和 1.0 中,连接均会在单词请求响应后关闭,而 TCP 连接的建立和消亡需要经过三路握手,四路断开,因此需要一定额外时间开销.有鉴于此,从 HTTP 1.1 开始,所有连接默认为长连接.更进一步地,如果不必每个单次通信都需等待响应后才能继续下一个通信,则可以实现流水线技术,提高并发量.
2.2 Message 格式
解决了连接的问题,剩下的就是消息格式了.前面提过,通信的基础是有效的转换和逆转换,转换需要规则,规则就是协议.对于 HTTP 而言,存在两种规则,分别为 request 和 response.
HTTP 1.1 及之前版本中,message 均是可读性强字符.在 HTTP 2 中,这些消息将被先封装至二进制结构 frame 中,并通过 frame header 进行其他如复用等配置.
2.2.1 Request
先放一个示例:
可以看出,组成元素均为可读性强的 ASCII 字符,具体格式则可进一步细分为如下结构:
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
(data data data data data ...)
2.2.2 Response
HTTP/1.1 200 OK
Connection: close
Date: Tue, 09 Aug 2011 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 09 Aug 2011 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ...)
3. 字段定义
3.1 Request methods
HTTP 请求中定义了 method 字段以标明希望在 URL 上执行的操作,而该资源将如何呈现,是否已存在或将被动态创建,均基于服务器的实现本身.主流应用中,通常会选择实现如下方法:
GET 请求所需资源,该请求除获取数据外不应产生其他效果
HEAD 功能与 GET 相当,区别在于响应中不包括具体数据,即不含 response body.可以理解为 GET 的轻量级,只查看元信息而不实际获取.
POST 将请求 body 中内容推送至服务器,或是存储在 URI 指定的资源下,或是其他实现形式
PUT 将请求 body 中内容存储至服务器中 URI 指定位置,如该 URI 已有资源,将被修改;如无资源,则将创建
DELETE 删除服务器中指定资源
TRACE 告知服务器回传所收请求,以便客户端确认链路中是否发生修改行为
OPTIONS 返回服务器在指定 URL 上所支持的方法,如 URL 为'*',则查询对象为服务器本身
CONNECT 告知服务器去返回指定 URL,并将其获取到的 Response 转发回请求客户端,相当于代理,网页开发中并不常用,仅预留做管理
PATCH 对资源进行局部修改操作
自 HTTP 1.0 开始,响应以状态行开始,而状态行中进一步包含了一个状态码(status code)及对应的文字说明.状态码分为五类,为了便于管理和更加直观表示,第一个数字用于标示响应的类型.
HTTP Method RFC Request Has BodyResponse Has BodySafeIdempotentCacheable
GET RFC 7231OptionalYesYesYesYes
HEAD RFC 7231NoNoYesYesYes
POST RFC 7231YesYesNoNoYes
PUT RFC 7231YesYesNoYesNo
DELETE RFC 7231NoYesNoYesNo
CONNECT RFC 7231YesYesNoNoNo
OPTIONS RFC 7231OptionalYesYesYesNo
TRACE RFC 7231NoYesYesYesNo
PATCH RFC 5789YesYesNoNoNo
3.2 Status codes
1xx Informational responses 标明请求已被接收并解析,常用于服务器需较长时间处理请求时告知客户端正在处理,且客户端需等待最终的回复.
2xx Success 标明请求已被接收,解析且已生效.
Continue
Switching Protocols
Processing
Early Hints
3xx Redirection 标明客户端需要采取额外措施来完成整个请求,通常用于 URL 重定向.
200 OK
201 Created
202 Accepted
203 Non-Autoritative Information (Since HTTP/1.1)
204 No Content
205 Reset Content
206 Partial Content
207 Multi-Status
208 Already Reported
226 IM Used
4xx Client errors 标明可能由客户端引发的错误,除 HEAD 方法外,其余情况中这类 Response 将会在 Body 中包含错误情况的详细说明,以及是临时或永久状况.
Multiple Choices
Moved Permanently
Found
See Other
Not Modified
Use Proxy
Switch Proxy
Temporary Redirect
Permanent Redirect
5xx Server error 标明可能由服务器本身引发的错误.
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication
408 Request Timeout
409 Conflict
410 Gone
411 Length Required
412 Precondition Failed
413 Payload Too Large
414 URI Too Long
415 Unsupported Media Type
416 Range Not Satisfiable
417 Expectation Failed
418 I'm a teapot
421 Misdirected Request
422 Unprocessable Entity
423 Locked
424 Failed Dependency
426 Upgrade Required
428 Precondition Required
429 Too Many Requests
431 Request Header Fields Too Large
451 Unavailable For Legal Reasons
4. 高级控制
Internal Server Error
Not Implemented
Bad Gateway
Service Unavailable
Gateway Timeout
HTTP Version Not Supported
Variant Also Negotiates
Insufficient Storage
Loop Detected
Not Extended
Network Authentication Required
4.1 Cache
所谓缓存(Cache),就是指相比服务器本身,在更靠近客户端的链路中设置一个额外的服务器副本.简单来看,缓存技术有两大优势:
通过分流,降低了服务器本身负载,提高整体并发
缩短链路带宽,长度,降低传输引发的延时
因此,缓存技术本质上是降低了单次请求的响应时长,从而提升网络体验.
The Conditional GET
然而大部分时候,副本带来了高可靠性,也带来了同步问题.实际服务器中内容可能随时间推移会发生修改,此时副本服务器中的数据就是相对过期了的,那么必要的同步就势在必行.
什么是必要的同步,就是只有比较数据后发现有更新才进行同步,否则只是无谓的拷贝,占用带宽.判断数据是否发生更新可以从数据本身出发,也可以只从数据标签即元数据出发,只要记录的数据最后更新时间一致,就可以判定数据不必更新,否则,就有更新的必要了.HTTP 中这种机制叫做 conditional GET,而更新的时间,就是通过 Request 中的 If-modified-since 字段给出.
前面提到,HTTP 是无状态协议,就是说 HTTP 服务器不会在多个请求之间维护用户信息.但实际应用中,又往往存在这种刚性需求,典型的如购物,新闻浏览等.为了实现宾至如归的错觉,增加用户的黏度,HTTP 采用了会话(Session)和 Cookie 技术.
GET /fruit/kiwi.gif HTTP/1.1
Host: www.exotiquecuisine.com
If-modified-since: Web, 7 Sep 2011 09:23:24
4.2 Session and Cookie
会话,相当于一次对话.一次对话肯定包括至少一次交互,同样一次会话也至少包括一个请求响应对.因此会话就是由一系列的请求响应对组成.要想在一系列动作中保持某种状态,比较通用的方法就是在动作之外,维护一个变量或者文件,而 Cookie 的组成元素中,文件就是重要的一环.
Cookie
Cookie 技术由四大组件组成:
Response 中 Cookie header line 用于返回服务器为用户所分配的 Cookie ID
Request 中 Cookie header line 用于告知服务器请求来自于哪一个为用户的 Cookie ID
用户客户端上本地存储维护的 Cookie 文件,记录用户行为
网站本身的后台数据库,保存了用户与 Cookie ID 间映射关系等数据
Cookie 的具体使用过程如上图所示,总的来讲,就是通过独立第三发信息(Cookie ID,数据库,Cookie 文件)来记录用户信息,并在会话中相关请求响应对中标记,保持服务器与客户端间的同步,实现状态维护.
5. 小结
本篇概述了 HTTP 的大部分内容,如有兴趣进一步学习研究,可参考相关 Spec .
来源: http://www.jianshu.com/p/b7063bf26f62