# 先对HTTP规范入个门。

# 概述

HTTP (Hypertext transfer protocol) 翻译成中文是超文本传输协议,是网络中计算机与计算机之间通过网络进行数据出传输的一种规范。

这里的超文本已经不在局限于文本,还包含图片,音频,视频。

HTTP 最早是在 1991 年发布了 0.9 版,然后又在 1996 年发布 1.0 版,1997 年是 1.1 版,2015 年发布了 2.0 版,2018 年发布了 3.0 版。随着版本的升级,其特性也在不断的增强,但到目前为止 HTTP/1.1 这个版本依旧是应用最广泛版本。

# 请求 URL

URL 是统一资源定位符,是互联网资源位置的标识方式。我们通常会基于 http 规范通过指定的 url 访问网络中的资源,其 url 语法格式如下:

protocol://hostname:port/directory/filename?name=value#anchor

部分 含义
protocol 访问资源使用的协议,如:http,https,ftp,telnet 等。
hostname 服务器的主机名称,IP地址。
port 访问的端口号,默认为80。
directory 访问资源的目录名称。
filename 访问的资源名称。
?name=value 访问资源时的参数和参数值
#anchor 访问当前资源的锚点。

# HTTP 消息

http 消息可以分为请求消息和响应消息,但无论是请求消息还是响应消息,都可以将其分成三部分,分别为消息头、空行、消息体。如图所示:

image-20220422121131998

# HTTP 请求消息

http 请求消息是基于 http 协议发送请求时,携带的请求数据,包括请求行,请求头,空行,请求消息体,如图所示:

image-20220422121317727

# 请求行

请求行是请求消息头中的第一行,其语法结构如下:

request-method-name request-URI HTTP-version

其中:

request-method-name:表示请求方式(如GET,POST)。

request-URI:表示请求统一资源标识(不含主机部分)。

HTTP-version:表示HTTP协议版本(如HTTP/1.1)。

请求行案例分析:

GET /test.html HTTP/1.1
HEAD /query.html HTTP/1.0
POST /index.html HTTP/1.1

常用请求方式分析:

GET 表示请求服务端资源。

HEAD 请求服务端资源,但没有响应体。

POST 在服务端创建资源。

PUT 更新服务端目标资源。

PATCH 用于对资源应用部分修改。

DELETE 删除服务端指定的资源。

CONNECT 建立到由目标资源的隧道。

OPTIONS 描述目标资源的通信选项。

TRACE 消息环回测试。

# 请求头

请求头由一些键值(key/value)对构成,一个key还可以对应多个值,其语法结构如下:

request-header-name: request-header-value1, request-header-value2, ...

例如:

Host: www.xyz.com
Connection: Keep-Alive
Accept: image/gif, image/jpeg, */*
Accept-Language: us-en, fr, cn

常见报头如下表所示:

报头名称 含义
User-Agent(简称:UA) 用户代理。允许将客户端信息告诉服务器。
Host 请求资源的主机和端口号,可从URL中获取。
Accept 允许客户端接受哪些类型的信息。如image/gif, text/html ,/(所有类型)。
Accept-Language 客户端可以接受的语言类型。
Accept-Encoding 指定可接受的内容压缩编码类型。
Accept-Charset 指定客户端接受的字符集。
Cookie 传输到服务器端的COOKIE数据。
Connection 连接类型。
Cache-Control 控制缓存。
Referer 可以记录访问的来源,统计访问量。

# 请求消息体

请求正文信息,比方说发送 post 请求时,可以将客户端要提交的表单部分内容放在这里传递到服务端。

综合案例分析:

POST /user HTTP/1.1
Host: www.xy.com
Accept: image/gif, image/jpeg, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
(blank line)
id=10&name=tony

# HTTP 响应消息

HTTP 响应消息由状态行、响应头、空行、响应消息体构成。如图所示:

image-20220422153023901

# 响应状态行

响应行是响应消息头中的第一行,其语法结构如下:

HTTP-version status-code reason-phrase

HTTP-version 为协议版本。

status-code 为响应状态码。

reason-phrase 为响应描述。

响应状态行案例分析:

HTTP/1.1 200 OK
HTTP/1.0 404 Not Found
HTTP/1.1 403 Forbidden

响应状态码由三位数字组成,第一位数字定义了响应类别,例如:

1xx:表示请求已接收,继续处理。

2xx:表示请求已被服务端成功处理。

3xx:表示请求需更进一步的操作。

4xx:客户端请求不正确。

5xx:服务器处理请求时错误。

常见状态码分析:

200 OK.请求响应成功。

302 临时重定向。

304 服务内容没有变化。

400 当前请求无法被服务器理解。

401 当前请求需要用户验证。

403 客户端无权访问资源。

404 请求资源不存在。

405 请求方式不被允许。

406 无法解析服务端返回的数据。

408 请求超时。

413 请求实体太大。

415 不支持的媒体类型。

500 服务器发生不可预见错误。

503 服务暂时不可用。

504 网关请求超时。

# 响应头

响应头用于告诉浏览器,应当怎样处理响应数据,其语法也是键值对结构。

response-header-name: response-header-value1, response-header-value2, ...

响应头案例分析:

Content-Type: text/html
Content-Length: 35
Connection: Keep-Alive
Keep-Alive: timeout=15, max=100

部分响应头部含义如下:

响应报头 含义
Date 告诉浏览器,请求页面的时间
Server 服务器软件信息
Content-Length 回送数据的字节数
Content-Type 回送内容的类型
Expires 表示存在时间,允许客户端在这个给时间之前不检查(发请求)
Cache-Control 缓存控制
X-Powered-By 版权信息(程序支持)
Keep-Alive 连接类型
Location 响应报头域用于重定向到一个新的位置
Refresh 页面刷新时间
Last-modified 指定服务器上保存内容的最后修订时间

# 响应消息体

响应正文信息,服务端一般会将要响应到客户端的正文信息放在这里,然后传递到客户端。

综合案例分析:

HTTP/1.1 200 OK
Date: Sun, 18 Oct 2009 08:56:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Sat, 20 Nov xxxx
ETag: "a5-2c-3e94b66c2e680"
Accept-Ranges: bytes
Content-Length: 44
Connection: close
Content-Type: text/html
X-Pad: avoid browser bug
(blank line)
<html><body><h1>It works!</h1></body></html>

参考资料:

先对HTTP规范入个门。 (opens new window)