格式·协议·标准程序员我爱编程

简述HTTP

2018-01-12  本文已影响87人  SniperPan

HyperText Transfer Protocol(HTTP)

HTTP是一个用于传输超媒体文档(hypermedia documents)的应用层协议,其主要使用场景是网络浏览器和网络服务器之间进行通信。

1. 信息内容:Web Page

浏览器中显示的页面叫做网页(Web Page),其通常由如下两部分构成:

1.1 Hypertext Markup Language(HTML)

Hyper means over or above , 即"超"的意思。所谓超媒体、超文本,意指包括但不限于的意思。典型的超媒体文档类型为HTML。

HTML是一种用于创建网页的标准标记语言,和CSS、JavaScript一起构建了万维网(World Wide Web, WWW)的基础。通常我们可以按如下形式来理解三者的关系:

1.2 Uniform Resource Locator(URL)

Uniform Resource Identifier(URI) 是一个由字符组成的字符串,用于标示具体资源。URI代表的是一种象征,象征着网络中每一个资源都有唯一的标识符以便于访问。URL是URI的一种常见形式,另一种还有Uniform Resource Name(URN),两者区别是:

http://www.someSchool.edu/someDepartment/picture.gif为例,URL通常由两部分组成:

2. 通信流(flow)

HTTP使用TCP作为传输协议,Server与Client交互过程中会建立TCP连接,但并不会保存任何Client的状态信息,因此HTTP也成为无状态(stateless)协议。

计算机相互之间进行通讯通常有两种方式:

2.1 TCP

如前文所述,HTTP通信方式属于请求响应类型,因此单次通信流程通常为:

由于HTTP为无状态协议(即每次通信间无关联),因此通常来讲,HTTP每次通信都是使用独立TCP连接的。大部分网络应用中,client和server会在一定时间内通信多次,从每次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

先放一个示例:

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 ...)

可以看出,组成元素均为可读性强的ASCII字符,具体格式则可进一步细分为如下结构:

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上执行的操作,而该资源将如何呈现、是否已存在或将被动态创建,均基于服务器的实现本身。主流应用中,通常会选择实现如下方法:

HTTP Method RFC Request Has Body Response Has Body Safe Idempotent Cacheable
GET RFC 7231 Optional Yes Yes Yes Yes
HEAD RFC 7231 No No Yes Yes Yes
POST RFC 7231 Yes Yes No No Yes
PUT RFC 7231 Yes Yes No Yes No
DELETE RFC 7231 No Yes No Yes No
CONNECT RFC 7231 Yes Yes No No No
OPTIONS RFC 7231 Optional Yes Yes Yes No
TRACE RFC 7231 No Yes Yes Yes No
PATCH RFC 5789 Yes Yes No No No

3.2 Status codes

自HTTP 1.0开始,响应以状态行开始,而状态行中进一步包含了一个状态码(status code)及对应的文字说明。状态码分为五类,为了便于管理和更加直观表示,第一个数字用于标示响应的类型。

4. 高级控制

4.1 Cache

所谓缓存(Cache),就是指相比服务器本身,在更靠近客户端的链路中设置一个额外的服务器副本。简单来看,缓存技术有两大优势:

因此,缓存技术本质上是降低了单次请求的响应时长,从而提升网络体验。

The Conditional GET

然而大部分时候,副本带来了高可靠性,也带来了同步问题。实际服务器中内容可能随时间推移会发生修改,此时副本服务器中的数据就是相对过期了的,那么必要的同步就势在必行。

什么是必要的同步,就是只有比较数据后发现有更新才进行同步,否则只是无谓的拷贝,占用带宽。判断数据是否发生更新可以从数据本身出发,也可以只从数据标签即元数据出发,只要记录的数据最后更新时间一致,就可以判定数据不必更新,否则,就有更新的必要了。HTTP中这种机制叫做conditional GET,而更新的时间,就是通过Request中的If-modified-since字段给出。

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

前面提到,HTTP是无状态协议,就是说HTTP服务器不会在多个请求之间维护用户信息。但实际应用中,又往往存在这种刚性需求,典型的如购物、新闻浏览等。为了实现宾至如归的错觉,增加用户的黏度,HTTP采用了会话(Session)和Cookie技术。

会话,相当于一次对话。一次对话肯定包括至少一次交互,同样一次会话也至少包括一个请求响应对。因此会话就是由一系列的请求响应对组成。要想在一系列动作中保持某种状态,比较通用的方法就是在动作之外,维护一个变量或者文件,而Cookie的组成元素中,文件就是重要的一环。

Cookie

Cookie技术由四大组件组成:

Cookie的具体使用过程如上图所示,总的来讲,就是通过独立第三发信息(Cookie ID、数据库、Cookie文件)来记录用户信息,并在会话中相关请求响应对中标记,保持服务器与客户端间的同步,实现状态维护。

5. 小结

本篇概述了HTTP的大部分内容,如有兴趣进一步学习研究,可参考相关Spec.

上一篇 下一篇

猜你喜欢

热点阅读