HTTP概述
HTTP是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议)。它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说,请求通常是由像浏览器这样的接受方发起的。一个完整的Web文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。
基于HTTP的组件系统
HTTP是一个client-server协议:请求通过一个实体被发出,实体也就是用户代理。
每一个发送到服务器的请求,都会被服务器处理并返回一个消息,也就是response。
实际上,在一个浏览器和处理请求的服务器之间,还有路由器、调制解调器等许多计算机。由于Web的层次设计,那些在网络层和传输层的细节都被隐藏起来了。HTTP位于最上层的应用层。
- 客户端:user-agent
浏览器首先发送一个请求来获取页面的HTML文档,再解析文档中的资源信息发送其他请求,获取可执行脚本或CSS样式来进行页面布局渲染,以及一些其它页面资源(如图片和视频等)。然后,浏览器将这些资源整合到一起,展现出一个完整的文档,也就是网页。浏览器执行的脚本可以在之后的阶段获取更多资源,并相应地更新网页。
- Web服务端
- 代理(Proxies)
HTTP 的基本性质
- HTTP 是简单的
- HTTP 是可扩展的
- HTTP 是无状态,有会话的
- HTTP 和连接
HTTP 能控制什么
- 缓存
- 开放同源限制
- 认证:Authenticate、HTTP Cookies
- 代理和隧道
- **会话 **:使用HTTP Cookies允许你用一个服务端的状态发起请求,这就创建了会话。虽然基本的HTTP是无状态协议。这很有用,不仅是因为这能应用到像购物车这样的电商业务上,更是因为这使得任何网站都能轻松为用户定制展示内容了。
HTTP 流
当客户端想要和服务端进行信息交互时(服务端是指最终服务器,或者是一个中间代理),过程表现为下面几步:
- 打开一个TCP连接:TCP连接被用来发送一条或多条请求,以及接受响应消息。
- 发送一个HTTP报文:HTTP报文(在HTTP/2之前)是语义可读的。
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr
- 读取服务端返回的报文信息:
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html
<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
- 关闭连接或者为后续请求重用连接。
HTTP 报文
HTTP/1.1以及更早的HTTP协议报文都是语义可读的。
在HTTP/2中,这些报文被嵌入到了一个新的二进制结构,帧。帧允许实现很多优化,比如报文头部的压缩和复用。
即使只有原始HTTP报文的一部分以HTTP/2发送出来,每条报文的语义依旧不变,客户端会重组原始HTTP/1.1请求。因此用HTTP/1.1格式来理解HTTP/2报文仍旧有效。
有两种HTTP报文的类型,请求与响应
,每种都有其特定的格式。
请求
- HTTP的method,经常是由一个动词像GET, POST 或者一个名词像OPTIONS,HEAD来定义客户端的动作行为。
- 要获取的资源的路径,通常是上下文中就很明显的元素资源的URL,它没有protocol (http://),domain(developer.mozilla.org),或是TCP的port(HTTP一般在80端口)。
- HTTP协议版本号。
- 为服务端表达其他信息的可选头部headers。
- 对于一些像POST这样的方法,报文的body就包含了发送的资源
响应
响应报文包含了下面的元素:
- HTTP协议版本号。
- 一个状态码(status code),来告知对应请求执行成功或失败,以及失败的原因。
- 一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。
- HTTP headers,与请求头部类似。
基于HTTP的APIs
基于HTTP的最常用API是
XMLHttpRequest API
,可用于在user agent和服务器之间交换数据。 现代Fetch API
提供相同的功能,具有更强大和灵活的功能集。
另一种API,即服务器发送的事件,是一种单向服务,允许服务器使用HTTP作为传输机制向客户端发送事件。
HTTP Headers
根据不同上下文,可将消息头分为:
- General headers: 同时适用于请求和响应消息,但与最终消息主体中传输的数据无关的消息头。
- Request headers: 包含更多有关要获取的资源或客户端本身信息的消息头。
- Response headers: 包含有关响应的补充信息,如其位置或服务器本身(名称和版本等)的消息头。
- Entity headers: 包含有关实体主体的更多信息,比如主体长(Content-Length)度或其MIME类型。
消息头也可以根据代理对其的处理方式分为:
- 端到端消息头
- 逐跳消息头
Request headers
Header | 解释 | 示例 |
---|---|---|
method | HTTP请求方式 | POST /test/tupian/cm HTTP/1.1 |
Host | host: 服务器的域名(用于虚拟主机)。port(可选):服务器监听的 TCP 端口号。 | Host: host :port |
User-Agent | 首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.46 Safari/537.36 |
Accept | 请求头用来告知(服务器)客户端可以处理的内容类型,这种内容类型用MIME类型来表示。内容类型中的先后次序表示客户端接收的先后次序。 | Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3 |
Accept-Language | 请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言。 | Accept-Language: zh-CN,zh;q=0.9 |
Accept-Encoding | 指定客户端浏览器可以支持的web服务器返回内容压缩编码类型。表示允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。而这里设置的就是客户端浏览器所能够支持的返回压缩格式。 | Accept-Encoding: gzip, deflate, br |
Accept-Charset | 请求头用来告知(服务器)客户端可以处理的字符集类型 | Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7 |
Content-Type | 显示此HTTP请求提交的内容类型。一般只有post提交时才需要设置该属性。 | Content-type: application/x-www-form-urlencoded;charset:UTF-8 (https://www.cnblogs.com/fighter007/p/10917026.html) |
Connection | 表示是否需要持久连接。如果web服务器端看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点, web服务器需要在返回给客户端HTTP头信息中发送一个Content-Length(返回信息正文的长度)头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然 后在正式写出内容之前计算它的大小。 | Connection: keep-alive |
Keep-Alive | 显示此HTTP连接的Keep-Alive时间。使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。 | Keep-Alive: 300 |
cookie | 含有先前由服务器通过 Set-Cookie 首部投放并存储到客户端的 HTTP cookies。 | |
Referer | 包含一个URL,用户从该URL代表的页面出发访问当前请求的页面 | referer: https://segmentfault.com/search?q=http+header |
Responses header
Header | 解释 | 示例 |
---|---|---|
accept-ranges | 服务器使用 HTTP 响应头 Accept-Ranges 标识自身支持范围请求(partial requests)。字段的具体值用于定义范围请求的单位。 | accept-ranges: bytes |
Age | 从原始服务器到代理缓存形成的估算时间(以秒计,非负) | Age: 12 |
Allow | 对某网络资源的有效的请求行为,不允许则返回405 | Allow: GET, HEAD |
Cache-Control | 通用消息头字段,被用于在http请求和响应中,通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求中设置的指令,不一定被包含在响应中。 | Cache-Control: private(https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control) |
Content-Encoding | 实体消息首部,web服务器支持的返回内容压缩编码类型。 | Content-Encoding: gzip |
Content-Language | 实体消息首部,web服务器提供语言 | Content-Language: en,zh |
Content-Length | 实体消息首部,用来指明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目。 | content-length: 22309 |
Content-Location | 首部指定的是要返回的数据的地址选项 | |
Content-Range | 响应首部 Content-Range 显示的是一个数据片段在整个文件中的位置 | Content-Range: bytes 21010-47021/47022 |
Content-Type | Content-Type标头告诉客户端实际返回的内容的内容类型 | Content-Type: text/html;charset=utf-8 |
Date | 通用首部,其中包含了报文创建的日期和时间。 | Date: Sun, 10 May 2020 10:58:34 GMT |
ETag | HTTP响应头是资源的特定版本的标识符。 | etag: W/“2ecfa-B088CdOv1p86A7yfRME8E7hsYPA”(https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/ETag) |
Expires | 响应头包含日期/时间, 即在此时候之后,响应过期。 | expires: Mon, 08 Jun 2020 07:41:40 GMT |
Last-Modified | 响应首部,其中包含源头服务器认定的资源做出修改的日期及时间 | last-modified: Fri, 08 May 2020 21:50:00 GMT |
Location | 首部指定的是需要将页面重新定向至的地址。一般在响应码为3xx的响应中才会有意义。 | |
Proxy-Authenticate | 响应首部,指定了获取 proxy server (代理服务器)上的资源访问权限而采用的身份验证方式。 | |
Retry-After | 响应首部 Retry-After 表示用户代理需要等待多长时间之后才能继续发送请求。 | Retry-After: 120 |
Server | 处理请求的源头服务器所用到的软件相关信息。 | Server: BWS/1.1(server: NWS_TCloud_S1) |
Set-Cookie | 响应首部 Set-Cookie 被用来由服务器端向客户端发送 cookie。(可以发送多个然后客户端请求时一起返回) | Set-Cookie: BDSVRTM=275; path=/ |
Trailer | 响应首部,允许发送方在分块发送的消息后面添加额外的元信息,这些元信息可能是随着消息主体的发送动态生成的,比如消息的完整性校验,消息的数字签名,或者消息经过处理之后的最终状态等。 | |
Transfer-Encoding | 传递给用户所采用的编码形式。 | Transfer-Encoding: chunked |
Vary | 响应头部信息,它决定了对于未来的一个请求头,应该用一个缓存的回复(response)还是向源服务器请求一个新的回复 | Vary: * |
via | 通用首部,是由代理服务器添加的,适用于正向和反向代理 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 通用报文首部,包含报文当前状态可能存在的问题。在响应中可以出现多个 Warning 首部。 | Warning: 199 Miscellaneous warning |
WWW-Authenticate | 使用何种验证方式去获取对资源的连接 | WWW-Authenticate: Basic |
Http缓存
http协议请求响应头缓存参数?
彻底弄懂HTTP缓存机制及原理
浏览器缓存机制剖析
HTTP访问控制(CORS)
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS