HTTP 协议的初印象:
是基于 TCP/IP 协议的应用层协议,不涉及数据包的传输,主要规定了客户端和服务器之间的通信格式,默认使用 80 端口。
1 HTTP 协议 0.9 版(1991 年)是个弱智协议,客户端发起请求以后,服务器只能返回 HTML 格式的字符串,不能回应别的格式。
只有一个 GET 命令:
GET /index.html上面命令表示,TCP 连接(connection)建立后,客户端向服务器请求(request)网页 index.html。
服务器发送完毕,就关闭 TCP 连接。
2 HTTP 协议 1.0 版(1996 年)与 0.9 版本相比,有以下几点变化:
这个版本允许发送的内容变多了,不仅可以传输文字,还能传输图像、视频、二进制文件。
除了 GET,POST、HEAD 这两个命令都可以用,浏览器和服务器的互动手段增加了。
HTTP 请求和回应的格式也变了。每次通信都必须包括头信息,用来描述一些元数据。
新增的功能还有:
状态码
多字符集支持
多部分发送
权限
缓存
内容编码
2.1 请求形式: <!-- 请求命令, 必须在尾部添加协议版本(HTTP/1.0)--> GET /HTTP/1.0 <!-- 多行头信息,描述了客户端的情况 --> User-Agent: Mozilla/5.0(Macintosh: Intel Mac PS X 10_10_5) <!-- 客户端表示自己可以接受任何格式的数据 --> Accept:*/* 2.2 回应格式 <!-- 头信息 --> HTTP/1.0 200 OK Content-Type: text/plain Content-Length: 137582 Expires:Thu, 05 Dec 1997 16:00:00 GMT Server: Apache 0.84 <!-- 数据 --> <html> <body>Hello World</body> </html>其中,头信息的第一行是 “协议的版本 + 状态码(status code) + 状态描述”
2.3 Content-Type 字段Content-Type 字段的作用是告诉客户端从服务端返回的数据是什么格式。
常见的 ContentType:
text/plain
text/html
text/css
image/jpeg
image/png
image/svg+xml
audio/mp4
video/mp4
application/javascript
application/pdf
application/zip
application/atom+xml
数据类型的构成包括一级类型和二级类型,中间用斜杠隔开。这些类型都被称为 MIME type。
MIME type 不仅用于 HTTP 请求,也可以用于别的地方,比如 HTML 网页。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <!-- 等同于 --> <meta charset="utf-8" /> 2.4 数据压缩客户端在请求的时候,用 Accept - Encoding 字段说明自己可以接受哪些压缩方法。
Accept-Encoding: gzip, deflate而服务器使用 Content-Encoding 字段说明数据的压缩方法。
Content-Encoding: gzip Content-Encoding: compress Content-Encoding: deflate 2.5 HTTP/1.0 协议的缺点每个 TCP 连接只能发送一个请求,数据发送完毕连接就关闭了,如果要请求别的资源,必须再新建一个连接。
但是 TCP 连接的成本很高,因为客户端和服务器的三次握手,并且启动发送的速率较慢。
有一些浏览器为了解决 TCP 会关闭的问题,采用了非标准的 Connection 字段。
浏览器请求和服务器回应都带有这个字段:
Connection: keep-alive这样的话,一个可以复用的连接建立了,直到客户端或者服务器主动关闭连接。但是不同的浏览器实现不同,这不是一个好的解决办法。
3 HTTP 协议 1.1 版(1997 年) 3.1 持久连接相比 1.0 版,1.1 版最大的变化是保持连接,即默认 TCP 连接不关闭,可以被多个请求复用,不用再声明 Connection: keep-alive。
那怎么关闭呢?如果客户端或者服务器发现对方一段时间内没有活动,就可以主动关闭连接。不过最好还是客户端在发送最后一个请求的时候,发送一个 Connection:close,明确要求服务器关闭 TCP 连接。
另外,对于同一个域名,大多数浏览器允许同时建立 6 个持久连接。
3.2 管道机制管道机制: 在同一个 TCP 连接里,客户端可以同时发送多个请求。
以前的做法是客户端先发送 A 请求,然后再发送 B 请求。管道机制是允许浏览器同时发送 A 请求和 B 请求,但是服务器还是按照顺序进行的,先回应 A 请求再回应 B 请求。
3.3 区分数据包一个 TCP 连接现在可以传送多个回应,势必就要有一种机制,区分数据包是属于哪一个回应的。
Content-length 字段的作用,声明本次回应的数据长度。
Content-Length: 3495上面的字段告诉客户端,本次回应的长度是 3495 个字节,后面的字节就属于下一个回应了。
所以,使用 Content-Length 字段的前提条件是,服务器发送回应之前,必须知道回应的数据长度。
而在 1.0 版本中,这个字段可以存在,也可以不存在,因为服务端关闭了 TCP 连接说明数据包已经全了。
3.4 其他功能1.1 版新增了很多动词方法:PUT、PATCH、HEAD、OPTIONS、DELETE。
客户端的请求头信息增加了 Host 字段,用来指定服务器的域名。
这个字段可以将请求发往同一台服务器的不同网站。
如:
Host: 3.5 缺点