网络协议学习

十.网络协议学习笔记 HTTP

2021-07-25  本文已影响0人  crazyfox

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.jpeg

ABNF 核心规则

报文格式-整体


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
上一篇下一篇

猜你喜欢

热点阅读