关于HTTP协议的一切

2017-08-10

关于HTTP协议的一切

怎么理解协议

在总结HTTP协议之前,先来讲讲什么是协议。做过游戏行业的人应该对此理解比较深刻,因为游戏的通信协议没有太通用的规范,都是框架制定时候来约定的。按我理解,协议就是服务端和客户端通信时候所采用的规范和格式。

HTTP协议简介

HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系 列的RFC,RFC 1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算 机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。

关键词: 应用层协议,无状态协议
无状态协议的意思可以理解成请求之间是独立不影响的,因此服务端开发的时候需要引用session的概念来保持会话的持续性。

HTTP协议的格式 - Request

HTTP Request由三个部分组成: 请求行,消息报头(Header),请求正文(body)

格式实例

POST /test/test/index HTTP/1.1

  • POST: HTTP的请求方式
  • /test/test/index: 请求Web服务器的目录地址
  • HTTP/1.1: URI(Uniform Resource Identifier,统一资源标识符)及其版本

问题引申:URL和URI区别

URI 是统一资源标识符,而 URL 是统一资源定位符。因此,笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。例如 mailto、news 和 isbn URI 都是 URN 的示例。

URI—Universal Resource Identifier通用资源标志符

Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
URI一般由三部组成

  • 访问资源的命名机制
  • 存放资源的主机名
  • 资源自身的名称,由路径表示,着重强调于资源。

URL—Uniform Resource Location统一资源定位符

URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
URL一般由三部组成

  • 协议(或称为服务方式)
  • 存有该资源的主机IP地址(有时也包括端口号)
  • 主机资源的具体地址。如目录和文件名等

Host

请求的Web服务器域名地址

User-Agent

HTTP客户端运行的浏览器类型的详细信息。通过该头部信息,Web服务器可以判断当前HTTP请求的客户端的浏览器类型。

例子:
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11

Accept

指定客户端能够接受的内容类型,内容类型中的先后次序表示客户端接收的先后次序。

例子:
Accept:text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,/;q=0.5
备注:
在Prototyp(1.5)的Ajax代码封装中,将Accept默认设置为“text/JavaScript, text/html, application/xml, text/xml, /”。这是因为Ajax默认获取服务器返回的Json数据模式。
在Ajax代码中,可以使用XMLHttpRequest 对象中setRequestHeader函数方法来动态设置这些Header信息。

注意:很多参数后面都会有’q’参数,根据HTTP协议的14.1章,这个’q’参数可以理解喜好参数。例如上面q=0.9为最高,会优先选择text/plain类型,然后再到0.8最后0.5为空。

Accept-Language

指定HTTP客户端浏览器用来展示返回信息所优先选择的语言

例子:
Accept-Language: zh-cn,zh;q=0.5
这里默认为中文。

Accept-Encoding

指定客户端浏览器可以支持的web服务器返回内容压缩编码类型。表示允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。而这里设置的就是客户端浏览器所能够支持的返回压缩格式。

例子:
Accept-Encoding: gzip,deflate
备注:
其实在百度很多产品线中,apache在给客户端返回页面数据之前,将数据以gzip格式进行压缩。

Accept-Charset

浏览器可以接受的字符编码集

例子:
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7

Content-Type

显示此HTTP请求提交的内容类型。一般只有post提交时才需要设置该属性。

例子:
Content-type: application/x-www-form-urlencoded;charset:UTF-8
有关Content-Type属性值可以如下两种编码类型:
1.“application/x-www-form-urlencoded”: 表单数据向服务器提交时所采用的编码类型,默认的缺省值就是“application/x-www-form-urlencoded”。 然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低。
2.“multipart/form-data”: 在文件上载时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据,也支持二进制数据上载。
当提交为单单数据时,可以使用“application/x-www-form-urlencoded”;当提交的是文件时,就需要使用“multipart/form-data”编码类型。
在Content-Type属性当中还是指定提交内容的charset字符编码。一般不进行设置,它只是告诉web服务器post提交的数据采用的何种字符编码。
一般在开发过程,是由前端工程与后端UI工程师商量好使用什么字符编码格式来post提交的,然后后端ui工程师按照固定的字符编码来解析提交的数据。所以这里设置的charset没有多大作用。

Connection

表示是否需要持久链接,如果Web服务器接收到值为”Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Appley,图片),显著地减少下载所需要的时间。要实现这一点,Web服务器需要在返回客户端HTTP头信息中发送一个Content-Length头参数(返回信息正文的长度),最简单的实现方法就是:先把内容写入ByteArrayOutputStream,然 后在正式写出内容之前计算它的大小。

例子:
Connection: keep-alive

Keep-Alive

显示此HTTP连接的Keep-Alive时间,使客户端到服务端的连接持续有效,当出现对服务器的后续请求时,Keep-Alive功能避免了建立或者重新建立连接。
以前HTTP请求是一站式连接,从HTTP/1.1协议之后,就有了长连接,即在规定的Keep-Alive时间内,连接是不会断开的。

例子:
Keep-Alive: 300

可以保持长连接那么HTTP协议还是无状态的吗?答案是肯定的,因为保持长连接是保持TCP的连接,协议本身依然不会保存事务处理的信息。

HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。

Referer

包含一个URL,用户从该URL代表的页面出发访问当前请求的页面

Cache-Control

客户端是否支持cache。no-cache表示客户端不支持cache,如max-age=3600,告诉User Agent 该请求的响应结果在多长时间内有效,在有效期内,当用户再次需要访问时,直接从客户端本地提取,不需要访问服务器。

Date

消息产生的当前时间

例子:
Mon, 21 Aug 2017 07:50:24 GMT

If-Modified-Since

如果请求消息包含If-Modified-Since标题域,GET方法的语法就变成“条件GET”,即“(conditional GET)”。 条件GET方法可以对指定资源进行判断,如果它在If-Modified-Since标题域中的指定日期后发生了更新,才启动传输,否则不传输。这种条件GET允许被缓存的实体在不必经过多次请求或不必要的数据传输就能进行刷新,从而有助于降低网络负载。

Last-Modified

上次修改的时间

ETag

一般应用在文件下载上,用于标识响应内容的最后修改时间或内容较验码,当下一次User agent需要时,服务首先判断这二个值是否跟服务器上一致,一样则不需要返回内容。

例子:
“1cbf3-dfd-3a2adcd8”

Expires

该请求的响应结果在什么时间失效,在没有失效之前,代理可直接从缓存中返回以前的响应结果。

Pragma

包括实现特定的指令,它可应用到响应链上的任何接收方

例子:
Pragma: no-cache

HTTP Response

Response组成部分也有三部分:状态行,Header,Body

###

HTTP Response Header

Response的Header参数跟Request很多类似,重复的在此省略

Status

状态码

服务端设置客户端cookie。设置格式是name=value,设置多个参数时中间分号隔开。Set-Cookie时还会用到几个参数:PATH设置有效路径,DOMAIN设置cookie生效的域名,Expire设置cookie的有效时间,0表示关闭浏览器就失效。

Location

当服务器返回3xx重定向时,该参数实现重定向。广告链接的跳转就使用这种协议。

Content-Length

附属体(数据实体)的长度

常见例题

1.下面HTTP头中_不是和浏览器缓存相关
A. Expires
B. Cache-Control
C. ETag
D. Date

解析:Expires表示缓存过期的时间,Cache-Control表示缓存的规则(不保留或者或留多久),ETag和Last-Modified配合使用查看是否读取缓存,Date是发送request的当前时间。所以答案选D

,郭无心

[4]《技术之瞳》,阿里巴巴集团校园招聘笔试项目组