http
2024-04-12 16:56:06 9 举报
AI智能生成
http
作者其他创作
大纲/内容
http协议版本
http 0.9
只支持GET请求
没有请求头概念
服务端响应后,立即关闭TCP连接
http 1.0
新增POST、DELETE、PUT、HEAD等请求方式
增加请求头、响应头的概念,以及协议版本号、状态码、缓存、内容编码等内容
扩充传输内容格式,图片、音视频资源、二进制数据等
缺陷
无连接
每个请求完成后都会断开TCP连接,下一个请求就要重新进行TCP连接
队头阻塞
前一个请求响应到达后才可以发送下一个请求,如果前一个请求阻塞,后面的请求也会跟着阻塞
http 1.1
长连接
新增Connection字段,设置keep-alive保持TCP连接,直至有一方主动断开连接,默认保持长连接
管线化(并行请求)
基于长连接的基础,并行发起请求(响应依旧阻塞),而且浏览器客户端针对于同一时间,同一域名也会有请求数量限制
缓存:新增Cache-Control
断点传输
大文件可以部分传输
遇到网络故障,也不用担心,可以接着之前下载好的部分继续下载剩余部分
http 2
头部压缩
多路复用
允许通过单一的HTTP/2连接发起多重的请求-响应
二进制分帧:HTTP 1.x在应用层以纯文本的形式进行通信,而HTTP 2.0将所有的传输信息分割为更小的消息和帧,并对它们采用二进制格式编码
帧
最小通信单位,以二进制压缩格式存放内容。来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装。
消息
对应 HTTP/1.1 中的请求 request 或者响应 response,包含 1 条或者多条 帧。
流
一个双向通信的数据流,包含 1 条或者多条 Message。每个数据流都有一个唯一的标识符和可选的优先级信息,用于承载双向消息。
服务端推送
请求优先级
请求方式
GET
HTTP GET 方法请求指定的资源。使用 GET 的请求应该只用于获取数据。
HEAD
HEAD方法与GET方法一样,都是向服务器发出指定资源的请求。但是,服务器在响应HEAD请求时不会回传资源的内容部分,即:响应主体。这样,我们可以不传输全部内容的情况下,就可以获取服务器的响应头信息。HEAD方法常被用于客户端查看服务器的性能。
DELETE
DELETE请求用于请求服务器删除请求URI所标识的资源
PUT
更新指定URI标识的资源
POST
向指定资源提交数据
OPTIONS
OPTIONS请求与HEAD类似,一般也是用于客户端查看服务器的性能。 这个方法会请求服务器返回该资源所支持的所有HTTP请求方法,该方法会用'*'来代替资源名称,向服务器发送OPTIONS请求,可以测试服务器功能是否正常。JavaScript的XMLHttpRequest对象进行CORS跨域资源共享时,就是使用OPTIONS方法发送嗅探请求,以判断是否有对指定资源的访问权限。
GET和POST对比
浅比较(W3C)
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET请求会被浏览器主动cache,而POST不会,除非手动设置
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET参数通过URL传递,POST放在Request body中。
深入
GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200
POST请求,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok
在网络环境差的时候,两次包的TCP在验证数据包完整性上,有非常大的优点
https
非对称加密
CSP安全策略
报文
首部
通用首部
Cache-Control
public
客户端和缓存服务器都可以缓存
private
客户端可以缓存,缓存服务器不可以缓存
max-age=xxx
强缓存xx秒
no-cache
协商缓存,需要去服务器验证
no-store
不允许缓存
Transfer-Encoding(逐跳传输消息首部)
chunked
分块编码:主要应用于如下场景,即要传输大量的数据,但是在请求在没有被处理完之前响应的长度是无法获得的。
Date:报文创建时间
Via:代理服务器相关信息
Connection
keep-alive
持久连接(http1.1默认),多个请求复用单个连接
close
表明客户端或服务器想要关闭该网络连接(http1.0默认)
请求首部
Accept:用户代理可处理的媒体类型
*/*
任意类型
image/*
图片文件
image/*;q=0.8
q为权重,该类型优先级
video/mp4
视频文件
application/json
JSON
示例
Accept: application/json, text/plain, */*
...
Accept-Encoding:优先的内容编码
gzip
br
identity
*
示例: Accept-Encoding: gzip, deflate, br
...
Host:服务器地址(ip地址或者域名),端口可选,默认80
示例:Host:127.0.0.1:3000
Range:告知服务器返回文件的哪一部分
示例:Range: bytes=200-1000, 2000-6576, 19000-
If-Range:条件满足时,Range字段才会生效
User-Agent :客户端信息
If-Match:条件请求,当ETag值匹配时返回资源
示例:If-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"
If-Modified-Since:条件请求,返回在这个时间之后修改过的资源
示例:If-Modified-Since: Wed, 21 Oct 2020 07:28:00 GMT
If-None-Match:当且仅当服务器上没有任何资源的 ETag 属性值与这个首部中列出的相匹配的时候,服务器端会才返回所请求的资源
示例:If-None-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"
Referer: 当前请求的来源链接,浏览器环境下不能自定义,因此服务端可以使用 Referer 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化,还有防盗链
来源页面采用的协议为表示本地文件的 "file" 或者 "data" URI,Referer不会被发送
当前请求页面采用的是非安全协议,而来源页面采用的是安全协议(HTTPS),Referer不会被发送
响应首部
Accept-Ranges :告知服务器是否能处理范围请
求
bytes:可处理
none:不能处理
ETag:资源唯一性标识(当资源更新时,ETag 值也需要更新)
强 ETag 值:不论实体发生多么细微的变化都会改变其值。
示例:ETag: "usagi-1234"
弱 ETag 值:只有资源发生了根本改变,产
生差异时才会改变 ETag 值。
示例:ETag: W/"usagi-1234"
Location:重定向url,当响应中包含此字段时,大部分浏览器都会强制性访问重定向url
Server :HTTP 服务器应用程序信息
Strict-Transport-Security
通知浏览器只能通过HTTPS访问当前资源
Accept-Control-Allow-Origin
指定响应的资源是否被允许与给定的origin共享
Content-Security-Policy
CSP安全策略
实体首部
Allow:枚举资源所支持的 HTTP 方法的集合
Content-Encoding:实体内容采用的编码方式
对应Accept-Encoding
Content-Length:实体内容大小(当采用了压缩或者分块传输时就没有这个字段了)
Content-Range:数据片段在整个文件中的位置
对应Range
示例:Content-Range: bytes 5001-10000/10000
Content-Type:实体内容的媒体类型
对应Accept
Content-Disposition:指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地
inline
默认值,表示回复中的消息体会以页面的一部分或者整个页面的形式展示
attachment
消息体应该被下载到本地;大多数浏览器会呈现一个“保存为”的对话框,将filename的值预填为下载后的文件名,假如它存在的话
filename
为 Cookie 服务的首部字段
Cookie:请求首部字段
分支主题
Set-Cookie:响应首部字段
NAME=VALUE
Cookie 的名称和其值(必需项)
expires=DATE
Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止)
Secure
仅在 HTTPS 安全通信时才会发送 Cookie
HttpOnly
加以限制,使 Cookie 不能被 JavaScript 脚本访问
主体
缓存
强缓存
http1.0: Expires(在这个字段时间之前都采用缓存),绝对时间
http1.1:Cache-Control
缓存响应指令
max-age:相对时间的强缓存
示例:max-age=3600,在3600秒內都直接从缓存获取资源
s-maxage:针对于公共缓存服务器的指令(公共服务器:比如cdn),如果存在这个字段,会忽略max-age
缓存请求指令
max-age
在客户端角度,如果缓存资源的缓
存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源,当这个字段为0时,通常缓存服务器会将请求转发给源服务器
协商缓存
Last-Modified和If-Modified-Since
在服务端对比来自客户端的if-Modified-Since时间与文件最后修改时间,如果不相同则文件已修改,返回新的修改时间Last-Modified与文件,否则返回304状态码
缺点
如果服务器上文件被多次修改了但是内容却没有发生改变,服务器需要再次重新返回文件
由于Last-Modified修改时间是GMT时间,只能精确到秒,如果文件在1秒内有多次改动,服务器并不知道文件有改动,浏览器拿不到最新的文件
ETag和If-None-Match
文件内容改变时,文件唯一标识ETag也会改变,每次服务器接收请求时,对比来自客户端的ETag值,如果相同返回304状态码
状态码
1xx:信息,服务器收到请求
2xx:成功
204:响应不包含任何实体信息
206:处理了包含Range请求头时,代表返回部分内容
3xx:重定向
301:永久重定向
302:临时重定向,get请求时跟307相同,post请求一些旧客户端会转成get请求
307:临时重定向,使用原有请求方法和消息主体
304:未改变,可以使用缓存内容
4xx:客户端错误
400:错误请求,客户端请求中包含语法错误
401:未授权,客户端请求没有携带有效身份信息
403:禁止访问,无权限
404:找不到响应资源
405:请求方法错误,例如使用 GET 请求一个 POST 接口
413:请求实体太大
5xx:服务器错误
500:服务器内部错误,服务器可能挂了
503(Service Unavailable):服务器暂时处理超载或正在停机维护,无法处理请求
502(错误网关)
504:网关响应超时
跨域
简单请求: 不会触发CORS 预检请求
请求方法
GET、POST、HEAD
首部字段
Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width
Content-Type: 仅限这几种
text/plain、multipart/form-data、application/x-www-form-urlencoded
请求中的任意XMLHttpRequestUpload 对象均没有注册任何事件监听器;XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问
请求中没有使用 ReadableStream 对象
用户代理自动设置的首部字段
Fetch 规范中定义为 禁用首部名称 的其他首部,允许人为设置的字段为 Fetch 规范定义的 对 CORS 安全的首部字段集合
预检请求: 非简单请求触发,由浏览器通过OPTIONS请求发起,获知服务端是否允许该跨源请求,服务端确认允许后,才会发起实际的HTTP请求
首部
请求头
Access-Control-Request-Method: 实际请求的HTTP方法
Access-Control-Request-Headers: 实际请求携带的首部
响应头
Access-Control-Allow-Methods: 允许的HTTP请求方法
Access-Control-Allow-Headers: 允许携带的首部,*写法不兼容低版本内核浏览器,大概0.66以下,具体版本以具体测试为准
Access-Control-Max-Age: 该响应的缓存时间,在缓存时间内,浏览器不用为同一请求再次发起预检请求
Access-Control-Allow-Origin: 允许的域,*代表不限制任何域
如果服务端指定了具体的域名而非“*”,那么响应首部中的 Vary 字段的值必须包含 Origin。这将告诉客户端:服务器对不同的源站返回不同的内容。
请求头中携带了Cookie,响应为*时,请求会失败
Access-Control-Expose-Headers:: 在跨源访问时,XMLHttpRequest对象的getResponseHeader()方法只能拿到一些最基本的响应头,Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma,如果要访问其他头,则需要服务器设置本响应头
Access-Control-Allow-Credentials
跨域XMLHttpRequest和Fetch默认不会发送Cookie,当标志位withCredentials为true时,才会携带
响应头没有Access-Control-Allow-Credentials: true的话,浏览器不会把响应内容返回给请求的发送者
原因
浏览器的同源策略限制
0 条评论
下一页