浅显易懂的前端知识点(二)——HTTP协议基础

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 缺点

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zysxfw.html