HTTP
HTTP Hyper Text Transfer Protocol 超文本传输协议
HTML Hyper Text Markup Language 超文本标记语言
HTTP
0.9 只支持get请求获取文本
1.0版本支持head,post请求,支持请求头,响应头,支持更多数据类型
请求一次建立一次TCP连接
1.1版本
支持PUT,DELETE请求,多个请求可以共用一个连接
2.0版本
报文格式
image.jpegABNF 核心规则
报文格式-整体
HTTP-message = start-line*(header-field CRLF)
CRLF
[message-body]
报文格式-request-line,status-line
request-line = method SP request-target SP HTTP-version CRLF
HTTP-version = HTTP-name "/" DIGIT "." DIGIT
HTTP-name = %x48.54.54.50 ; HTTP
GET /hello/ HTTP/1.1
status-line = HTTP-version SP status-code SP reason-phrase CRLF
status-code = 3DIGIT
reason-phrase = *( HTAB / SP / VCHAR / obs-text )
HTTP/1.1 200
HTTP/1.1 200 OK
URL的编码
URL中出现了一些特殊字符,需要进行编码
在浏览器中输入URL,采用UTF-8编码
Xshell+telnet
安装一个Xshell,使用telnet
image.jpeg image.jpeg请求方法
◼ GET:常用于读取的操作,请求参数直接拼接在URL的后面(浏览器对URL是有长度限制的)
◼ POST:常用于添加、修改、删除的操作,请求参数可以放到请求体中(没有大小限制)
◼ HEAD:请求得到与GET请求相同的响应,但没有响应体
使用场景举例:在下载一个大文件前,先获取其大小,再决定是否要下载。以此可以节约带宽资源
◼ OPTIONS:用于获取目的资源所支持的通信选项,比如服务器支持的请求方法
OPTIONS * HTTP/1.1
◼ PUT:用于对已存在的资源进行整体覆盖
◼ PATCH:用于对资源进行部分修改(资源不存在,会创建新的资源)
◼ DELETE:用于删除指定的资源
◼ TRACE:请求服务器回显其收到的请求信息,主要用于HTTP请求的测试或诊断
◼ CONNECT:可以开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道(tunnel) 可以用来访问采用了 SSL (HTTPS) 协议的站点
头部字段
◼请求头字段(Request Header Fields) ✓ 有关要获取的资源或客户端本身信息的消息头
◼响应头字段(Response Header Fields) ✓ 有关响应的补充信息,比如服务器本身(名称和版本等)的消息头
◼实体头字段(Entity Header Fields) ✓ 有关实体主体的更多信息,比如主体长度(Content-Length)或其MIME类型
◼通用头字段(General Header Fields) ✓ 同时适用于请求和响应消息,但与消息主体无关的消息头
请求头字段
User-Agent 浏览器身份标示
Host 服务器域名,端口
Date 发送时间
Referer 前一个页面
Content-Type 请求体类型
Content-Length 请求体长度
Accept 能接受的响应内容类型
Accept-Charset 能接受的字符集
Accept-Encoding 能接受的编码方式列表
Accept-Language 能接受的响应内容语言
Range 请求某个实体的一部分
Origin 发起一个针对跨域资源共享的请求
Cookie 服务器发送的
Connection 浏览器想要使用的连接类型
Cache-Control 所有缓存机制都必须遵守的指令
响应头字段
Date
Last-Modified 请求对象最后修改日期
Server 服务器名字
Exoires 指定时间,超过认为响应过期
Content-Type 响应体类型
Content-Length 响应体长度
Content-Encoding 编码类型
Content-Disposition
Accept-Ranges
Content-Range
Access-Control-Allow-Origin
Location
Set-Cookie
Connection
Cache-Control
缓存( )
通常会缓存的情况是:GET请求 + 静态资源(比如HTML、CSS、JS、图片等)
Ctrl + F5:可以强制刷新缓存
缓存 响应头
Pragma:作用类似于Cache-Control,HTTP/1.0的产物
Expires:缓存的过期时间(GMT格式时间),HTTP/1.0的产物
Cache-Control:设置缓存策略
no-storage:不缓存数据到本地
public:允许用户、代理服务器缓存数据到本地
private:只允许用户缓存数据到本地
max-age:缓存的有效时间(多长时间不过期),单位秒
no-cache:每次需要发请求给服务器询问缓存是否有变化,再来决定如何使用缓存
优先级:Pragma > Cache-Control > Expires
缓存 响应头
Last-Modified:资源的最后一次修改时间
ETag:资源的唯一标识(根据文件内容计算出来的摘要值)
优先级:ETag > Last-Modified
缓存 请求头
If-None-Match
如果上一次的响应头中有ETag,就会将ETag的值作为请求头的值
如果服务器发现资源的最新摘要值跟If-None-Match不匹配,就会返回新的资源(200 OK)
否则,就不会返回资源的具体数据(304 Not Modified) ◼ If-Modified-Since
如果上一次的响应头中没有ETag,有Last-Modified,就会将Last-Modified的值作为请求头的值
如果服务器发现资源的最后一次修改时间晚于If-Modified-Since,就会返回新的资源(200 OK)
否则,就不会返回资源的具体数据(304 Not Modified)
缓存
Last-Modified的缺陷
只能精确到秒级别,如果资源在1秒内被修改了,客户端将无法获取最新的资源数据
如果某些资源被修改了(最后一次修改时间发生了变化),但是内容并没有任何变化
会导致相同数据重复传输,没有使用到缓存
ETag可以办到
只要资源的内容没有变化,就不会重复传输资源数据
只要资源的内容发生了变化,就会返回最新的资源数据给客户端
20180207100306608.png
网友评论