HTTP协议
一.HTTP的发展
1.HTTP/0.9
这是 HTTP 协议的初代版本,它是基于 TCP/IP 协议的应用层协议,不涉及数据包的传输,主要定义了客户端与服务器端的通信格式,默认端口是80。
- 客户端只有 GET 命令,是在建立 TCP 协议之后的发送的请求。
- 服务器只能响应 HTML 格式字符串,响应完成就关闭 TCP 连接。
请求协议:
GET /index.html
响应协议:
<html>
<body>Hello World</body>
</html>
2.HTTP/1.0
此版本协议规定,客户端可以发送任意格式的数据。除了之前的 GET 请求,还增加了 POST 和 HEAD请求。并且请求协议和响应协议格式也发生了改变。
- 请求协议包括了状态行、请求头【描述客户端的信息】、消息主体。
- 响应协议包括了状态行、响应头、响应正文。
- 服务器响应时,响应头中
Content-Type
字段表示告诉客户端响应数据的格式类型,这些数据类型的总称为MIME type
。 - 每个 TCP 连接只能发送一个 HTTP 请求,服务器响应完成就关闭连接。客户端与服务器建立连接的三次握手比较慢。一些浏览器在请求头中加上了非标准字段
connection: keep-alive
来解决这个问题,服务器同时返回这个字段。
请求协议:
GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*
响应协议:
HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
<html>
<body>Hello World</body>
</html>
3.HTTP/1.1
相比 1.0
最大的变化是引入了持久连接(默认 TCP
连接不关闭),可以被多个 HTTP
请求复用,不用声明 Connection: keep-alive
。客户端或服务器发现一段时间没有活动就主动关闭连接,客户端也可在发最后一次请求时,在请求头中加上 Connection: close
字段,要求服务器关闭 TCP
连接。
- 引入管道机制。在同一个
TCP
连接中,客户端可以同时发送多个请求。 - 服务器端可以响应多个请求,用
Content-Length
字段区分每次回应的数据长度,用于区分不同的数据包。(服务器按请求顺序响应数据包) - 分块传输编码。相比上面的服务器响应机制,当要处理耗时操作时,因为要知道响应数据的长度,所以效率就会变低,可以使用分块传输,不使用
Content-Length
字段,只需要在请求或回应的头信息中带Tansfer-Encoding
字段即可。每个非空的数据块之前会有一个 16 进制的数值表示这个数据块的长度,最后一个大小为 0,就表示本次数据发送完毕。 - 增加了
PUT
、PATCH
、HEAD
、OPTIONS
、DELETE
方法。并且客户端请求头信息可以增加Host
字段,用于指定服务器的域名,可以将请求发送到同一台服务器的不同网站。
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
25
This is the data in the first chunk
1C
and this is the second one
3
con
8
sequence
0
该协议的缺点时服务器的响应是按顺序进行的,如果前面的特别慢,则会影响后面的响应。解决方案可以为:
一. 减少请求数。
二. 同时多开持久连接。
4.HTTP/2
它是一个二进制协议,头信息和数据体都是二进制,统称为数据帧和头信息帧。它的好处在于可以定义额外的帧。
- 在一个
TCP
连接里,客户端和服务器可以同时发送多个请求或响应,并且不同按照顺序,可以避免队头堵塞。即多工! - 每个请求或响应的数据包称为一个数据流,在同一个连接里面的连续数据包,可能有属于不同的响应数据,所以通过唯一编号来对不同的响应数据做标记,并且客户端发送的数据流 ID 为奇数,服务器发送的数据流 ID 为偶数。
- 客户端和服务器都可以发送
RST_STREAM
帧来取消数据流用于关闭HTTP
请求,而TCP
连接还是打开着,可以被其他请求复用。客户端还可以指定数据流的优先级,来指定服务器响应的顺序。 HTTP
协议是无状态的,相同的头信息每次都要进行携带,所以在该版本引入了头信息压缩机制,gzip 或 compress 压缩后发送,同时客户端和服务器同时维护了头信息表,所有字段都会存入该表,生成索引号,以后就可以发送索引号,提高速度。- 服务器推送:服务器可以主动向客户端发送资源。
二.HTTP协议发展总结
HTTP
协议构建于TCP
协议之上,是无状态的应用层协议,默认端口80。HTTP
请求中GET
和POST
请求的数据格式不同,GET
存在于URL
,长度受限,POST
请求存在请求体中。POST
请求中提交数据的编码类型,常见的两个类型为application/x-www-form-urlencoded
和multipart/form-data
前者为表单提交数据编码类型,后者为表单上传文件编码类型。- 在使用分块传输时,要注意每个块的内容长度是未知的,所以对于下载请求是没有办法实现下载进度的。
- 使用管道技术对于客户端的 POST 请求是有所限制的。
三.HTTP协议引申
1.会话跟踪
- 会话是客户端请求服务器到服务器响应客户端完成的全过程称为会话。
- 会话跟踪指对同一个用户对服务器的连续请求和接收响应的监视。
- 使用会话跟踪的技术是因为HTTP协议是无状态的,所以服务器响应完成客户端的请求后,不能够保存用户的信息,服务器要判断下次请求是否为同一人则需要该技术的支持。
2.实现会话跟踪的方法
- URL重写:在URL结尾增加一个附加数据标识该会话,把会话ID通过URL传递给服务器以标识不同的用户。
- 隐藏表单域:将会话ID增加到HTML表单中提交到服务器,也就是表单元素不显示在客户端。
- Cookie技术:cookie是服务器发送给客户端的一段信息,对于每次客户端的请求,服务器都会将cookie发送到客户端,从而在客户端进行保存。保存方式有在客户端内存中进行保存,即为临时 cookie,客户端关闭后浏览器该都该对象就消失了,二是保存在客户端的机器磁盘上,为永久cookie,只要 cookie在有效期内,就能实现会话跟踪。
- session技术:每个用户都有一个 session,每个用户不能共享,在 session 中可以存放信息,服务器会创建 session 对象,产生一个 sessionID 来标识该对象,然后将 sessionID 放到 cookie 中发送给客户端,下一次客户端访问时,sessionID 会发送到服务器,便能识别不同的用户,session 是依赖于 cookie 的,如果 cookie 被禁用那么 session 也就失效了。