HTTP协议 | 青训营笔记

60 阅读5分钟

HTTP协议 | 青训营笔记

** 这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天 **

HTTP协议是超文本传输协议,用来规定计算机网络传输文字、图片、音频、视频等超文本数据的约定和规范

一、初步认识HTTP协议

1.协议分析-报文

(1)Method字段

GET
POST
PUT
DELETE
HEAD
CONNECT
OPTIONS
TRACE
PATCH
Safe(安全的):不会修改服务器的数据的方法
  • GET
  • HEAD
  • OPTIONS
Idempotent(幂等):同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的,所有safe的方法都是idempotent的
  • GET
  • HEAD
  • OPTIONS
  • PUT
  • DELETE

(2)常见状态码

  • 1xx 表示请求已经被接收,需要继续处理
  • 2xx 表示成功状态
  • 3xx 重定向状态
  • 4xx 客户端错误
  • 5xx 服务器端错误

(3)RESTful API

是一种API设计风格; REST- Representational State Transfer (表现层状态转化)

  1. 每一个URL代表一种资源
  2. 客户端和服务器之间,传递这种资源的某种表现层
  3. 客户端通过HTTP method,对服务器端资源进行操作,实现“表现层状态转化”

(4)常用请求头

Accept-Ranges:表明服务器是否支持指定范围请求及哪种类型的分段请求。

Age:从原始服务器到代理缓存形成的估算时间(以秒计,非负)。

Allow:对某网络资源的有效的请求行为,不允许则返回405。

Cache-Control:告诉所有的缓存机制是否可以缓存及哪种类型。

Content-Encodingweb:服务器支持的返回内容压缩编码类型。。

Content-Language:响应体的语言。

Content-Length:响应体的长度。

Content-Location:请求资源可替代的备用的另一地址。

Content-MD5:返回资源的MD5校验值。

Content-Range:在整个返回体中本部分的字节位置。

Content-Type:返回内容的MIME类型。

Date:原始服务器消息发出的时间。

ETag:请求变量的实体标签的当前值。

Expires:响应过期的日期和时间。

Last-Modified:请求资源的最后修改时间。

Location:用来重定向接收方到非请求URL的位置来完成请求或标识新的资源。

Pragma:包括实现特定的指令,它可应用到响应链上的任何接收方。

Proxy-Authenticate:它指出认证方案和可应用到代理的该URL上的参数。

refresh:应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)

Retry-After:如果实体暂时不可取,通知客户端在指定时间之后再次尝试。

Serverweb:服务器软件名称。

Set-Cookie:设置Http Cookie。

Trailer:指出头域在分块传输编码的尾部存在。

Transfer-Encoding:文件传输编码。

Vary:告诉下游代理是使用缓存响应还是从原始服务器请求。

Via:告知代理客户端响应是通过哪里发送的。

Warning:警告实体可能存在的问题。

(5)常用响应头

1.Cache-Control(对应请求中的Cache-Control) Cache-Control:private 默认为private 响应只能够作为私有的缓存,不能再用户间共享 Cache-Control:public 浏览器和缓存服务器都可以缓存页面信息。 Cache-Control:must-revalidate 对于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时。 Cache-Control:no-cache 浏览器和缓存服务器都不应该缓存页面信息。 Cache-Control:max-age=10 是通知浏览器10秒之内不要烦我,自己从缓冲区中刷新。 Cache-Control:no-store 请求和响应的信息都不应该被存储在对方的磁盘系统中。

2.Content-Type Content-Type:text/html;charset=UTF-8 告诉客户端,资源文件的类型,还有字符编码,客户端通过utf-8对资源进行解码,然后对资源进行html解析。通常我们会看到有些网站是乱码的,往往就是服务器端没有返回正确的编码。

3.Content-Encoding Content-Encoding:gzip 告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。

4.Date Date: Tue, 03 Apr 2018 03:52:28 GMT 这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题。

5.Server Server:Tengine/1.4.6 这个是服务器和相对应的版本,只是告诉客户端服务器信息。

6.Transfer-Encoding Transfer-Encoding:chunked 这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。一般分块发送的资源都是服务器动态生成的,在发送时还不知道发送资源的大小,所以采用分块发送,每一块都是独立的,独立的块都能标示自己的长度,最后一块是0长度的,当客户端读到这个0长度的块时,就可以确定资源已经传输完了。

7.Expires Expires:Sun, 1 Jan 2000 01:00:00 GMT 这个响应头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本,很显然这个值会存在问题,因为客户端和服务器的时间不一定会都是相同的,如果时间不同就会导致问题。所以这个响应头是没有Cache-Control:max-age=*这个响应头准确的,因为max-age=date中的date是个相对时间,不仅更好理解,也更准确。

8.Last-Modified Last-Modified: Dec, 26 Dec 2015 17:30:00 GMT 所请求的对象的最后修改日期(按照 RFC 7231 中定义的“超文本传输协议日期”格式来表示)

9.Connection Connection:keep-alive 这个字段作为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个tcp连接发送http请求。