Web基础知识——HTTP协议那点事
Posted 就是三七
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web基础知识——HTTP协议那点事相关的知识,希望对你有一定的参考价值。
01
—
HTTP协议特点
02
—
URL和URI
ftp://ftp.is.co.za/rfc/rfc1808.txt(URL)
http://www.ietf.org/rfc/rfc2396.txt(URL)
Idap://[2001:db8::7]/c=GB?objectClass?one(URL)
mailto:John.Doe@example.com(URL)
news:comp.infosystems.www.servers.unix(URL)
tel:+1-816-555-1212(URI)
telnet://192.0.2.16:80/(URL)
urn:oasis:names:specification:docbook:dtd:xml:4.1.2(URI)
03
—
HTTP报文结构分析
通用报文头
Cache-Control 控制缓存行为
-
常见值(Cache-Control:) -
no-store 所有内容都不缓存 -
no-cache 缓存,但是浏览器使用缓存前,都会请求服务器判断缓存资源是否是最新 -
max-age=x(单位秒) 请求缓存后的x秒不再发起请求 -
s-maxage=x(单位秒) 代理服务器请求源站缓存后的x秒不再发起请求,只对代理服务器(CDN)缓存有效 -
public 客户端和代理服务器(CDN)都可缓存 -
private 只有客户端可以缓存。
Connection 逐跳首部、连接的管理
Connection:keep-alive 当一个网页打开完成后,客户端和服务器端之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器端上的网页,会继续使用这一条已经建立的连接。
Connection:close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。
Date 创建报文的日期时间
Pragma 报文指令
Trailer 表文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知
请求报文头
Accept 用户代理可处理的媒体类型
作用:浏览器端可以接受的媒体类型
Accept:text/html 代表浏览器可以接受服务器发挥的类型为text/html,也就是我们常说的HTML文档,如果服务器端无法返回text/html类型的数据,服务器应该返回一个406错误(Non Acceptable)。
Accept:*/* 代表浏览器可以处理所有类型
如果想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值);权重值q的范围是0-1 (可精确到小数点后3位) ,且1为最大值。不指定权重值q时,默认权重为q=1.0,当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
作用:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip, deflate)
Accept-Language 优先的语言(自然语言)
作用:浏览器申明自己接收的语言
例如:Accept-Language:zh-cn,zh;q=0.7,en-us,en;q=0.3 即客户端在服务器有中文版资源的情况下,会请求其返回中文版对应的响应,没有中文版,则请求返回英文版响应。
Authorization Web认证信息
Expect 期待服务器的特定行为
Host 请求资源所在服务器
作用:请求报头域主要用于指定被请求资源的Internet主机和端口号,通常从HUUP URL中提取
If-Match 比较实体标记(ETag)
If-Modified-Since 比较资源的更新时间
请求头,资源最新修改时间,由浏览器告知服务器,会与Last-Modified进行对比。
If-None-Match 比较实体标记(与If-Match相反)
请求头,缓存资源标识,由浏览器告知服务器(其实就是上次服务器发送的Etag),与Etag进行对比。
If-Range 资源未更新时发送实体Byte的范围请求
If-Unmodified-Since 比较资源的更新时间(与If-Modified-Since相反)
Max-Forwards 最大传输逐跳数
Proxy-Authorization 代理服务器要求客户端的认证信息
Range 实体的字节范围请求
一般形式:Range:(unit = first byte pos) - [last byte pos]
Range: bytes=0-499 0-499字节内容
Range: bytes=500-999 500-999字节内容
Range: bytes=-500 最后500字节内容
Range: bytes=500- 从第500字节开始到结尾
Range: bytes=500-600,601-999 两个范围字节内容
Referer 对请求中URI的原始获取方
当浏览器向web服务器发送请求时们一般会带上Referer,告知服务器我是从哪个页面跳转而来,服务器借此可以获得一些用于处理的信息。
TE 传输编码的优先级
User-Agent HTTP客户端程序的信息
作用:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本
很多情况下通过User-Agent来判断浏览器类型,从而进行不同的兼容设计
响应报文头
Accept-Ranges 是否接受字节范围请求
Age 推算资源创建经过时间
ETag 资源的匹配信息
响应头,资源标识,由服务器告知浏览器。
Location 令客户端重定向至指定URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Retry-After 对再次发起请求的时机要求
Server HTTP服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息
实体报文头
Allow 资源可支持的HTTP方法
Content-Encoding 实体主体适用的编码方式
Content-Language 实体主体的自然语言
Content-Length 实体主体的大小(单位:字节)
Content-Location 替代对应资源的URI
Content-MDS 实体主体的报文摘要
Content-Range 实体主体的位置范围
用于响应头,在发出带有Range的请求后,服务器总会在Content-Range头部返回当前接收的范围和文件总大小。
一般格式:Content-Range:bytes (unit first byte pos) - [last byte pos]/[entry length]
在响应完成后,返回的响应头内容不同:
HTTP/1.1 202 OK (不使用断点续传)
HTTP/1.1 206 Partial Content (使用断点续传)
Content-Type 实体主体的媒体类型
作用:说明报文体内对象的媒体类型
text/html HTML格式
text/plain 纯文本格式
text/xml XML格式
image/gif gif图片格式
image/jpeg jpg图片格式
image/png png图片格式
application/xhtml+xml : XHTML格式
application/xml : XML数据格式
application/atom+xml : Atom XML聚合格式
application/json : JSON数据格式
application/pdf pdf格式
application/msword : Word文档格式
application/octet-stream :二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded :表单提交
Expires 实体主体过期的日期时间
响应头,代表资源过期时间,由服务器返回提供,是HTTP/1.0的属性,在于max-age共存的情况下,优先级低于max-age。
Last-Modified 资源的最后修改日期时间
响应头,资源最新修改时间,由服务器告知浏览器,会与If-Modified-Since进行对比。
04
—
HTTP协议的请求方法
05
—
HTTP状态码
1XX 表示消息。这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。
2XX 表示成功。这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
200(OK) 表示请求已经成功,请求所希望的响应头或数据体将随次响应返回。
202(Accepted) 已接受,已经接受请求,但未处理完成。
206(Partial Content) 部分内容,服务器成功处理了部分GET请求。
301(Moved Permanently) 永久移动,请求的资源已经被永久移动到新的URI,返回信息会包括新的URI,浏览器会自动定向新的URI,今后任何新的请求都应使用新的URI代替。
302(Found) 临时移动,与301类似。但资源只是被临时移动。客户端应继续使用原有URI。
4XX 表示请求错误。这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个HEAD请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。
400(Bad Request) 客户端请求的语法错误,服务器无法理解
401(Unauthorized) 请求要求用户的身份认证
403(Forbidden) 服务器理解请求客户端的请求,但是拒绝执行此请求
404(Not Found) 服务器无法根据客户端的请求找到资源(网页)
5XX 表示服务器错误。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。除非这是一个HEAD请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。
500(Internal Server Error) 服务器内部错误,无法完成请求
502(Bad Gateway) 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
06
—
HTTP状态管理
Cookie
本质上是一小段文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就向客户端颁发一个Cookie。
客户端浏览器会把Cookie保存起来,当浏览器再次请求该网站时,浏览器把请求的网址连同Cookie一同提交给服务器。服务器通过检查该Cookie,以辨认用户状态。
Session
另一种记录用户状态的机制,保存在服务器上。客户端浏览器访问服务器时,服务器把客户端信息以某种形式记录在服务器上。
客户端浏览器再次访问时只需从该Session中查找该用户的状态。
保存Session ID的方式
Cookie
URL重写(将Session添加到URL中)
隐藏表单
Session的有效期
Session超时失效
程序调用HttpSession.invalidate()
服务器进程被停止
二者的区别
存放位置不同,Cookie存储在浏览器端,Session存储在服务器端
安全性(隐私策略)不同
有效期不同
对服务器造成压力不同,Session对于服务器的压力较大
07
—
HTTP协议的身份认证
BASIC认证(基本认证)
客户端向服务器端发送请求
服务器返回状态401,告知需要验证
用户名和密码以base64加密形式传输到服务器端
认证成功返回200,反之返回401
(安全性不足)
DIGEST认证(摘要认证)
客户端向服务器端发送请求
返回401和临时质询码
发送摘要和质询码计算而来的响应码
认证成功返回200,反之返回401
(无法验证用户伪装)
SSL客户端认证
借由HTTPS的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问是否来自自己的客户端。
(使用需要一定的成本)
FormBase认证(基于表单认证)
该方法使用有Web应用程序各自实现基于表单的认证方式,通过Cookie和Session保持用户状态。
08
—
HTTP长连接与短连接
解释
HTTP协议是基于请求/响应模式的,因此只要服务端给了响应,本次HTTP请求结束。
HTTP长连接和短连接本质上是TCP长连接和短连接。
HTTP/1.0中,默认使用短连接。也就是说,浏览器和服务器每进行一次HTTP操作就建立一次连接,结束即中断。
HTTP/1.1起,默认使用长连接,用以保持连接特性。
短连接过程
建立连接——数据传输——关闭连接……建立连接——数据传输——关闭连接
长连接过程
建立连接——数据传输…(保持连接)…数据传输——关闭连接
09
—
HTTP的中介
代理
对于Web客户端来说,代理扮演服务器角色,接受Request,返回Response
对于Web服务器来说,代理扮演客户端角色,发送Request,接收Response
代理作用:抓包、梯子、匿名访问、过滤器
网关
网关可以作为某种翻译器使用,它抽象出了一种能够达到资源的方法。网关是资源和应用程序之间的粘合剂。
网关扮演一种“协议转换器”角色。
Web网关在一侧使用HTTP协议,另一侧使用另一种协议,Web网关分类如下:
(HTTP/)服务器端网关:通过HTTP协议与客户端对话,通过其他协议与服务器通信。
(/HTTP)客户端网关:通过其他协议与客户端对话,通过HTTP协议与服务器端通信。
常见网关类型
(HTTP/*)服务器端Web网关
(HTTP/HTTPS)服务器端安全网关
(HTTPS/HTTP)客户端安全加速器网关
资源网关
10
—
HTTP缓存
工作方式
Expires
约定文件过期时间
Last-Modified与If-Modified-Since
在约定文件过期时间基础上新增校验文件最新修改时间,文件过期后如果文件未被修改无需再次请求,直接使用本地缓存。
时间以秒计算,部分用户容易接收不到新增变化
Expires+Last-Modified基础上增加Etag和If-None-Match;Expires不稳定,再加入max-age加以代替
仍然不能主动感知服务器文件变化
缓存改进方案
md5/hash缓存
通过不缓存html,为静态文件添加md5或者hash标识,解决浏览器无法跳过缓存过期时间主动感知文件变化的问题。
CDN缓存
CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使内容就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
工作方式
第一次请求 服务器将资源传送给CDN和浏览器,两处均有缓存。
后续请求 浏览器向CDN对比文件是否变化。
用户操作对缓存影响如下:(有效指校验方式有效,无效指忽略校验强行向服务器重新请求资源文件)
11
—
HTTP的内容协商机制
协商方式:
客户端驱动
客户端发起请求,服务器发送可选项列表,客户端做出选择后再发送第二次请求。
服务器驱动
服务器检查客户端的请求头部集并决定提供哪个版本的页面。
请求头部集及对应决定的响应头:
Accept 告知服务器发送何种媒体类型 ==> Content-Type
Accept-Language 告知服务器发送何种语言 ==> Content-Language
Accept-Charset 告知服务器发送何种字符集 ==> Content-Type
Accept-Encoding 告知服务器采用何种编码 ==> Content-Encoding
透明协商
某个中间设备(通常是缓存代理)代表客户端进行协商。
12
—
HTTP协议的断点续传
通过Header里的两个参数实现:请求头Range,响应头Content-Range
过程:
客户端下载一个1024K的文件,521K已下载
网络中断,客户端请求续传,因此需要在HTTP头中声明本次需要续传的片段:Range:bytes=512000-
服务器端接收断点续传请求,从文件512K位置开始传输,并在HTTP请求中增加:Content-Range:bytes 512000-/1024000;此时服务器端返回的HTTP状态码应该是206而不是200
以上是关于Web基础知识——HTTP协议那点事的主要内容,如果未能解决你的问题,请参考以下文章