Http简析

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 流

当客户端想要和服务端进行信息交互时(服务端是指最终服务器,或者是一个中间代理),过程表现为下面几步:

  1. 打开一个TCP连接:TCP连接被用来发送一条或多条请求,以及接受响应消息。
  2. 发送一个HTTP报文:HTTP报文(在HTTP/2之前)是语义可读的。
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr
  1. 读取服务端返回的报文信息
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)
  1. 关闭连接或者为后续请求重用连接
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解释示例
methodHTTP请求方式POST /test/tupian/cm HTTP/1.1
Hosthost: 服务器的域名(用于虚拟主机)。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对某网络资源的有效的请求行为,不允许则返回405Allow: 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-TypeContent-Type标头告诉客户端实际返回的内容的内容类型Content-Type: text/html;charset=utf-8
Date通用首部,其中包含了报文创建的日期和时间。Date: Sun, 10 May 2020 10:58:34 GMT
ETagHTTP响应头是资源的特定版本的标识符。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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值