HTTP

HTTP/1.1 200 OK

HTTP及其工作原理

HTTP头

HTTP头字段是HTTP的请求和响应消息中的消息头部分,它们定义了一个超文本传输协议事务中的操作参数,其头部字段可根据自己的需要定义。

请求头信息

请求头组成
例子:一个GET请求头
1
2
3
4
5
6
7
8
9
10
11
12
GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age=0

响应头信息

响应头组成
响应头 说明
Allow:支持的请求方法 服务器支持哪些请求方法(如GET、POST等)。
Content-Encoding:编码方法 文档的编码方法。只有解码才能正确得到Content-Type头指定的内容类型,一般的编码方式如gzip,通过压缩的方式使HTML文档下载时间显著减少。
Content-Length:内容长度
Content-Type:文档类型 表示后面的文档是什么类型,默认为text/plain,但一般会显式指定为text/html
Date:时间
Last-Modified:最后改动日期
Server:服务器名字
Set-Cookie:设置关联Cookie
例子:一个GET响应头
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
200 OK
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Mon, 18 Jul 2016 16:06:00 GMT
Etag: "c561c68d0ba92bbeb8b0f612a9199f722e3a621a"
Keep-Alive: timeout=5, max=997
Last-Modified: Mon, 18 Jul 2016 02:36:04 GMT
Server: Apache
Set-Cookie: mykey=myvalue; expires=Mon, 17-Jul-2017 16:06:00 GMT; Max-Age=31449600; Path=/; secure
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
X-Backend-Server: developer2.webapp.scl3.mozilla.com
X-Cache-Info: not cacheable; meta data too large
X-kuma-revision: 1085259
x-frame-options: DENY

HTTP请求流程

sequenceDiagram
    participant DNS服务器
    participant 客户
    participant 服务器

    客户->>DNS服务器:DNS域名解析
    DNS服务器->>客户:服务器IP地址

    loop 尝试TCP连接
        客户->>服务器: TCP三次握手
    end
    客户->>服务器: 发起HTTP请求
    服务器->>客户: 响应HTTP请求,发送HTML代码
    服务器->>客户: 四次挥手,断开连接
    客户->>客户: 浏览器解析HTML代码获得资源
    客户->>客户: 浏览器渲染页面并呈现

为什么HTTP使用TCP

由于打开网页需要传输很多数据,而TCP协议提供拥塞控制、数据重排以及错误纠正等机制,所以更适合HTTP使用场景。

HTTP 发展历程

HTTP1.0

最早版本的HTTP协议是HTTP1.0,其有点是浏览器与服务器只保持短暂连接,且连接不进行记录,这是为了提高效率,但是也造成了一些缺陷,主要包括如下缺点:

  1. 访问复杂网页会导致多次请求和响应,每次请求响应都会建立新的连接
  2. 连接无法复用,导致重复经历三次握手和慢启动
  3. 队头阻塞,如果HTTP流水线中有多个请求出现,一个数据包的阻塞会导致后续的数据包都被阻塞

HTTP1.1

为了改进HTTP1.0的缺陷,人们又提出了1.1,相比1.0,1.1的优点如下:

支持持久连接

在1.1版本中,支持了持久连接,一个TCP连接可以传送多个HTTP请求与响应,减少了建立和关闭连接的消耗与延迟。一个复杂网页可以在一个连接中进行传输。此外,一些其他优点如下所示:

更多请求和响应头

例如Host响应头,Host使浏览器能够区分来自同一服务器的不同站点

  • 支持断点续传

HTTP2.0

HTTP2.0相比1.1在性能上有了更大提升,它包含如下特性:

多路复用

二进制分帧

首部压缩

服务端推送

其他

HTTP/HTTPS区别

HTTP运行于TCP上,明文传输,C/S端均无法验证对方身份;HTTPS为身披SSL外壳的HTTP,运行于SSL(安全传输协议)上,而SSL运行于TCP上,架构如下:

graph TD;
    A["HTTP: 80"]
    B["HTTPS: 443"]
    C["SSL"]
    D["TCP"]

    A-->D;

    B-->C;
    C-->D;

区别:

  1. 端口不同
  2. 开销不同,HTTPS由于要加密,需要更大开销
  3. HTTPS需要购买证书

Session是服务器对用户进行辨识的机制,由于HTTP是无状态协议,因此服务端在辨识用户时,需要一些记录,从而催生了Session,Session和Cookie的区别是Cookie一般保存在C端,当用户第二次发起请求时,会自动将上次存储的cookie发送至服务器,实现身份辨识。

而Session保存在服务器端,默认存放在服务器一个文件夹中,更加安全,但是占用服务器资源。

参考文献

0%