HTTP 协议要点
HTTP 报文
- HTTP 请求
HTTP 请求报文的基本格式是
<method> <request-URL> <version>
<headers>
<entity-body>
例如,在我的机器上,向 github 主页发出一个 HTTP 请求
GET / HTTP/1.1
Host: github.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36
Accept-Encoding: gzip,deflate
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
这是一个 GET
请求,所以没有 entity-body
字段。
- HTTP 应答
HTTP 应答报文的基本格式
<version> <status> <reason-phrase>
<headers>
<entity-body>
向 github 请求后的应答
HTTP/1.1 200 OK
Server: GitHub.com
Date: Mon, 22 Sep 2014 09:24:31 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Status: 200 OK
X-XSS-Protection: 1; mode=block
X-Frame-Options: deny
Vary: X-PJAX
ETag: "xx"
Cache-Control: max-age=0, private, must-revalidate
X-UA-Compatible: IE=Edge,chrome=1
Set-Cookie: user_session=xx; path=/; expires=Mon, 06-Oct-2014 09:24:31 GMT; secure; HttpOnly
Set-Cookie: _gh_sess=xx; path=/; secure; HttpOnly
X-Runtime: 0.026967
X-GitHub-Request-Id: 7C10890C:13AF:13784547:541FEACF
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
X-Content-Type-Options: nosniff
Vary: Accept-Encoding
X-Served-By: xx
Content-Encoding: gzip
<html>
...
</html>
其中的一些数据,我用 xx
替换了。
HTTP 方法
- GET
GET 请求从服务器获取资源,GET请求不应该有副作用,我的理解是,不应该用 GET 请求改变服务器中的数据。当表单采用 GET 方法传送数据时,数据会放在 URL 中。
- POST
POST 请求向服务器提交数据,当表单采用 POST 方法传送数据时,数据放在 entity-body
中。
常见 HTTP 状态码
| 状态码 | 原因短语 | 含义 | |--------|----------|-------| | 200 | OK | 请求没问题,实体的主体部分包含了所请求的资源 | | 301 | Move Permanently | 请求的 URL 已经被移除,在响应的 Location 处有资源现在的 URL | | 304 | Not Modified | 客户端发起一个条件 GET 时,最近资源未修改,可以用这个状态码来说明 | | 400 | Base Request | 告诉客户端它发送了一个错误的请求 | | 403 | Forbidden | 请求被拒绝 | | 404 | Not Found | 服务器无法找到所请求的 URL | | 500 | Internel Server Error | 服务器遇到一个妨碍它为请求提供服务的错误 | | 502 | Bad Gateway | 作为代理或者网关的服务器从请求响应链的下一条链路上收到一条伪响应,例如无法连接到父网关 | | 504 | Gateway Timeout | 网关或者代理在等待另一服务器对其请求进行响应时超时了 |
HTTPS
HTTPS 协议是 HTTP 协议的安全版本。
- 协议栈
从协议栈的角度,HTTP 协议在应用层(HTTP) 与传输层(TCP) 之间添加了安全层 (SSL 或者 TLS)
- 事务
从整个请求响应过程来看,HTTP 协议是
建立到服务器80端口的TCP连接 -> 在 TCP 上发送 HTTP 请求 -> 在 TCP 上发送 HTTP 响应 -> TCP 连接关闭
而 HTTPS 协议添加了与 SSL 相关的过程
建立到服务器443端口的TCP连接-> SSL 安全参数握手 -> 在 SSL 上发送 HTTP 请求/ 在 TCP 上发送加密后的请求
-> 在 SSL 上发送 HTTP 响应/ 在 TCP 上发送加密后的响应 -> SSL 关闭 -> TCP连接关闭
- SSL 握手
SSL 握手的基本过程是
- 客户端发送可供选择的密码并请求证书
- 服务器发送选中的密码和证书
- 客户端发送保密信息,客户端和服务器生成密钥
- 客户端面 和服务器互相告知,开始加密过程