HTTP
HyperText Transfer Protocol
前记:
- 本文可以作为知识点树查询,可能有些地方没有太详细写出来,要深入的自行查询。
- 共花了4天时间(两天过书两天写文章),把HTTP体系粗略过了一遍,列出了最基本的知识点
- 也算是自己的第一篇读书笔记吧~~只能感叹要学的东西真的很多😭
- 一万多字基本纯手打,要转载或搬运请注明文章地址哦~
(文章目录在文章最后)
一、Web网络基础
-
客户端定义:能够通过发送请求获取服务器资源的Web浏览器等。
服务器端的定义:提供资源响应的一端
-
TCP可靠传输的三次握手:用户端改善SYN标志,服务器返回SYN/ACK标志,用户端再次发送ACK标志
-
URI与URL
-
URI:Uniform Resource Identifier统一资源标识符,URL:Uniform Resource Locator统一资源定位符
-
URI是一个抽象概念,而URL(针对http协议)是URI的一种实现,所以URL是URI的子集
-
绝对URI的格式:
http://user:pass@www.example.jp:80/dir/index.htm?uid=1#ch1 即协议方案名+登录认证信息+服务器地址+端口号+带层次的文件路径名称+查询字符串+片段标识符 其中片段标识符可标记出已获取资源中的子资源(文档内的某个位置),比如可以跳转到<a name=xxx>xxx<a>的位置
-
-
RFC: Request for Comments征求修正意见书,用来制定协议标准的文档
二、Http协议
1、请求报文的构成
请求行:方法名 + URL + 协议版本号
post /form/entry HTTP/1.1
字段(注意,请求首部是请求行+字段)
Host:hackr.jp
Connection:keep-alive
Content-length:16
请求实体
name=1231235
2、响应报文的构成
状态行:协议版本号 + 状态码 + 原因短语
HTTP/1.1 200 OK
字段(注意,响应首部是状态行+字段)
Date:Tue, 10 Jul 2012 06:50:15 GMT
Content-length:234
响应实体
<html>
</htm>
3、无状态性
- HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。
- 可以更快地处理事务,确保协议的可伸缩性,特意把HTTP协议设计成如此简单。
- 由于不用保存与管理状态,可以减少服务器的CPU及内存资源的消耗
- 缺点是无法适应当代网络业务的需要求,如登录状态的保存等,故要配合其它技术如Cookie等实现
4、7大服务方法
先明确一个问题:所有的服务方法都是针对资源而说的。(错,也不能说错,半对错吧,应该是)
GET:获取资源
GET方法用来请求访问已被URI识别的资源。指定的资源经过服务器端解析后返回响应内容
POST:传输实体主体
- Post方法用来传输实体的主体。
- 虽然用GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法。虽说POST的功能与GET很相似,但POST的主要目的并不是获取响应的主体内容。
HEAD:获得报文的首部
- HEAD方法和GET方法一样,只是不返回报文主体部分。
- 可以用于确认URI的有效性及资源更新的日期时间等。
PUT:传输文件
- PUT方法用来传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。
- 但是PUT方法自身不带有安全验证机制,任何人都可以传输文件,一般web网站禁止该方法。但用REST的网站可能开放
DELETE:删除文件
- Delete方法用来删除文件,是与PUT相反的方法
- 和PUT一样,有安全问题
OPTIONS:询问支持的方法
OPTIONS方法用来查询针对请求URI指定的资源支持的方法。
请求:
OPTIONS * HTTP/1.1 (注意,如果不是访问特定资源,而是对服务器本身发起请求,可以用一个*号代替请求的URI)
Host:www.hackr.jp
响应:
HTTP/1.1 200 OK
Allow:GET,POST,HEAD,OPTIONS
TRACE:追踪路径
- 是让web服务器端将之前的请求通信原样返回给客户端的方法
- 发送请求时,在Max-Forwards首部字段填入数值,每经过一个服务器端该数字减1,直到0的时候,停止传输,最后接收到请求的服务器则返回状态码200OK的响应
- TRACE可以用来调试,查询发送出去的请求是怎样加工修改的,但容易受XST攻击
CONNECT:要求用隧道协议连接代理
可以在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经过网络隧道传输。
方法语法:
CONNECT 代理服务器名:端口号 HTTP版本
LINK与UNLINK被1.1版本遗弃
5、GET与POST详细区别
- 安全性
- 数据量大小
- 概念的不同,见名知意,Get最主要用来进行对服务器发送查询请求,目的是要得到数据;而Post是向服务器发送数据(虽然Get也能携带少量数据),目的是要改变服务器中的资源。
- 幂等性,Get是幂等的,Post不是
- Get可以建立书签,Post不可以,原因是Post本身的请求中带有类似于表单的数据,防止用户反复提交
6、持久性
- 起始时,HTTP每进行一次请求都要断开一次TCP连接,浪费大量时间。而后,HTTP建立的连接都是默认持久化连接(HTTP Persistent Connections)
- 特点:只要任意一端没有明确提出断开连接,则保持TCP连接状态
- 可以让请求更快结束(因为节约了每次断开建立连接的时间)
7、管线化
- 管线化技术:可以同时并行发送多个请求,而不需要一个接着一个地等待响应
- 建立在持久化的基础上,比持久化带来的效率更快
三、报文细节
1、定义
- HTTP报文:用于HTTP协议交互的信息被称为HTTP报文
- 请求报文:请求端(客户端)的HTTP报文叫做请求报文
- 响应报文:响应端(服务器端)的HTTP报文叫做响应报文
2、报文结构
总报文结构
报文 = 报文首部 + 空行(CR + LF)+ 报文主体
报文首部结构
请求报文:请求行 + 字段(请求首部字段 + 通用首部字段 + 实体首部字段+ 其它(RFC标准末定义的,如Cookie))
响应报文:状态行 + 字段(响应首部字段 + 通用首部字段 + 实体首部字段 + 其它 )
3、报文与实体
定义
-
报文(message):是HTTP通信中的基本单位。
实体(entity):作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
即 实体 = 实体首部 + 实体主体
报文与实体
- 报文主体用于传输请求或响应的实体主体
- 通常报文主体(最原始数据)等于实体主体(可能被压缩或其它编码处理,处理后不相等)
- 简记:主体一致(通常),总体不一致。
4、编码与传输
-
通过对HTTP传输的数据进行编码可以提升传输效率,但会消耗额外的CPU和内存资源
-
常用的内容编码:gzip, compress, deflate, identity(不进行编码)(英文原意:同一性)
-
在传输大容量数据的时候,可以把数据分割成多块,可以让浏览器逐步显示页面。这种把实体主体分块的功能称为分块传输编码(Chunked Transfer Coding)
-
MIME机制:发送多种数据的多部分对象集合
==multipart/form-data:==在web表单上传时使用
在写数据结构作业增加商品功能图片时有用到!!!!(激动,终于看到熟悉的了)
HTML形式:
<form action="${pageContext.request.contextPath}/manage/add" enctype="multipart/form-data" method="post"> <!--enctype即encoding type--> <div class="name"> 添加图片(只接受png、jpg): <input type="file" name="file" accept="image/jpeg,image/png" required> </div> <div class="introduction"> <div style="background-color: #d69090"><label>简介</label></div> <input type="text" name="introduction" class="specificInput" placeholder="输入简介" required /> </div> </form>
HTTP报文形式如下:
Content-Type:multipart/form-data; boundary=AaB03x//指定边界标志 --AaB03x//边界标志 Content-Disposition:form-data;name="field1" Joe Blow --AaB03x Content-Disposition:form-data;name="pics";filename="file1.txt" Content-Type:text/plain 。。。file1.txt的数据。。。 --AaB03x--//--边界名--表示边界结束位置
multipart/byteranges 状态码:206(Partial Content,部分内容),在响应报文包含了多个范围的内容时使用。也就是说上面那个只能在请求中使用,这个只能在响应中使用。
HTTP响应报文如下:
HTTP/1.1 206 Partial Content Date:Fri, 13 Jul 2012 02:45:33 GMT Content-Type:multipart/byteranges;boundary=AA_BB//同样要在内容类型中定义边界 --AA_BB//边界 Content-Type:application/pdf Coontent-Range:bytes 500-900/8000 ...(范围指定的数据在这里)... --AA_BB Content-Type:application/pdf Coontent-Range:bytes 600-1234/8000 ...(范围指定的数据在这里)... --AA_BB--//边界结束标志
**总的来说,**不论是multipart/form-data还是multipart/byteranges,都在一个报文主体中,含有多个实体(实体等于实体首部字段加实体主体)(但总的来看,“多个实体”其实还是只是一个报文主体,在整个报文看来,这“多个实体”只是报文中的实体的实体主体)
简记:一个请求中含有多个子请求数据(乱记的)。
-
范围请求:指定范围发送的请求叫做范围请求(Range Request)
请求字段: Range:bytes=5001-10000//5001到10000字节 Range:bytes=5001-//5001之后的全部字节 Range:bytes=0-3000, 5000-7000//多重范围的字节,对应的响应中会用multipart/byteranges,即有“多个实体”,参考上面第4点。
6、内容协商
-
访问相同的URI的web页面会根据环境返回英文版的或中文版的,这样的机制称为内容协商。
-
内容协商机制是指客户端和服务器就响应的资源内容进行交涉,然后提供给客户端最为适合的资源
-
内容协商范围:包括但不限于自然语言、字符集、编码方式等
-
请求中的字段关键字:Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language(响应的)
3种技术类型
-
服务器驱动协商(Server-driven Negotiation)
由服务器进行内容协商。以请求的首部字段作为参考,在服务器端自动处理。但对用户来说,以浏览器发送的信息作为判定的依据,并不一定能筛出最优的内容。比如一个外国人用了中文的浏览器,那么浏览器默认选择中文字符字段,服务器返回中文资源,但对外国人来说这不是最优的。
-
客户端驱动协商(Agent-driven Negotiation)
由客户端进行内容协商的方式。用户从浏览器显示的可选项列表中手动选择。还可以利用JavaScript脚本在Web页面上自动进行上述选择。比如按OS的类型或浏览器的类型,自行切换成PC版或手机版页面。
-
透明协商(Transparent Negotiation)
是服务器协商和客户端驱动的结合体,是由服务器和客户端各自进行内容协商的一种方法。
四、状态码
1、总述
-
状态码的职责是当客户端向服务器端发着请求时,描述返回的请求结果。**即告知请求结果状态。**所以叫状态码。
-
状态码由3位数字和原因短语组成(别理解为只由3位数字组成)
-
数字中的第一位指定了响应类别,后两位无分类。响应类型有5种:
类别 原因短语 1xx Informational(信息性状态码) 接收的请求正在处理 2xx Success(成功状态码) 请求正常处理完毕 3xx Redirection(重定向状态码) 需要进行附加操作以完成请求 4xx Client Error(客户端错误状态码) 服务器无法处理请求 5xx Server Error(服务器错误状态码) 服务器处理请求出错 注意4xx,如404资源找不到,不是服务器端的问题,而客户端的问题,因为它的URl打错了!
-
只要遵守状态码类别的定义,可以改变RFC标准中的状态码或者自己乱建状态码。
2、1XX
-
101 Switching Protocols
在使用字段Upgrade时转换协议时使用。
3、2XX
- 200 OK
- 表示从客户端发来的请求在服务器端被正常处理了。
- 204 No Content
- 该状态码代表服务器接收的请求已成功处理,但返回的响应报文中不含实体的主体部分
- 也不会允许返回任何实体的主体
- 如果返回204响应,浏览器的页面不会发生更新
- 一般在只需要从客户端往服务器端发着信息,而对客户端不需要发着新信息内容的情况下使用
- 206 Partial Content
- 该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求
- 响应报文中包含由Content-Range指定范围的实体内容
4、3XX
- 301 Moved Permanently
- 永久性重定向
- 该状态码表示请求的资源已被分配了新的URI以后就使用资源现在所指的URI
- 如果已经把旧的URI存为书签了,那么应该按Location首部字段(看下面字段讲解部分)提示的URI重新保存
- 比如忘记在资源路径最后加斜杠会产生301状态码,http://example.com/sample (实际测试不会。。。可能浏览器自动加斜杠了,或说浏览器瞬间重定向????)
- 302 Found
- 临时性重定向
- 该状态码表示请求的资源已被分配了新的URI,希望用户**(本次)**能使用新的URI访问
- 又表示该资源在未来可能还会改变它的URI
- 如果用户把该URI保存为书签,不会更新用户的书签
- 303 See Other
- 临时性重定向,与302有相同含义。
- 表示由于请求对应的资源存在着别一个URI,应使用GET方法定向获取请求的资源
- 303与302有相同的功能,但303明确表示客户端应当采用GET方法获取资源
301与302标准是禁止将POST方法改成GET方法的。
但但但,几乎所有的浏览器,当返回301、302、303状态码时,都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。
- 304 Not Modified
- 表示客户端发着附带条件的请求时(带有If的字段),服务器端允许请求访问资源,但因发生请求未满足条件的情况,直接返回304状态码。
- 304返回时,不包含任何响应的主体部分
- 服务器资源未改变,可直接使用客户端未过期的缓存
- 304虽然被划分在3XX中,但和重定向没有任何关系(有毒,划分在2XX不好吗,反正服务器正确处理了)
- 307 Temporary Redirect
- 临时重定向,与302有相同含义。
- 因为大家不遵守标准,所以出现这么个东西
- 307会遵照浏览器标准,不会从POST变成GET。
- 但是,对于处理响应时的行为,每种浏览器有可能出现不同的情况**???这一行看不懂。。。**
5、4XX
-
400 Bad Request
- 表示请求报文中存在语法错误
- 浏览器会像对待200OK一样对待400
-
401 Unauthorized
- 表示发送的请求需要有通过HTTP认证的认证信息
- 第1次请求返回401,浏览器初次接收401响应时,会弹出认证的对话窗口。第n次请求返回401,则表示认证失败
- 响应中含有WWW-Authenticate首部用以质询(challenge)用户信息
-
403 Forbidden
- 表示对请求资源的访问被服务器拒绝了(未授权的ip访问也可以出现403)
- 服务器可以不用给出详细理由,如果想说明可以在实体主体中对原因进行描述。
-
404 Not Found
- 表示服务器上无法找到请求的资源
- 还可以用作服务器拒绝请求且不想说明理由时使用
-
405 Method Not Allowed
- 当使用不支持的方法访问资源时
-
412 Precondition Falied
- 当请求字段If-xxx失败时返回。
6、5XX
- 500 Internal Server Error
- 表示服务器端在执行请求时发生了错误
- 可能是Web应用存在BUG或者临时性的故障
- 503 Service unavailable
- 表示服务器暂时处于超负载或正在进行停机维护,现在无法处理请求
- 如果事先知道以上状况恢复所要的时间,最好定稿Retry-After首部字段再返回给客户端,用于友好提示。
- 504 Gateway Timeout
五、与HTTP协作的Web服务器
1、多域名与单IP
- HTTP/1.1允许一台HTTP服务器搭建多个Web站点
- 物理层面只有一台服务器,但使用了虚拟主机(Virtual Host),则可以假想有多台服务器
- 因为域名会通过DNS解析成IP,所以不同域名解析的结果IP很有可能相同,因此在改善HTTP请求时,必须加入Host首部字段,指定主机名。并且因此所以,Host字段是唯一一个不可省略的字段!
2、代理
- 定义:代理是一种有转发功能的应用程序,它扮演了位于服务器与客户端“中间人”的角色。
- 代理不改变请求URI,会直接发送给前方持有资源的目标服务器。而持有资源实体的服务器被称为源服务器。
- 转发时,需要附加Via首部字段以标记出经过的主机信息
- 代理的作用:
- 可以利用缓存技术
- 访问控制
- 获取日志
- 等等
- 代理分类:
- 缓存代理(Caching Proxy):代理转发响应时,缓存代理会预先将资源的副本(缓存)保存在代理服务器上。当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。
- 透明代理(Transparent Proxy):转发请求或响应时,不对报文做任何处理。反之,对报文内容进行加工处理 被称为非透明代理。
3、网关
注意与TCP/IP中的网关区分。
- 定义:网关是转发其他服务器通信数据的服务器。接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端不会察觉,自己的通信目标是一个网关。
- 网关作用:
- 利用网关可以提高通信的安全性。相当于加了一道屏障。
- 网关能使通信线路上的服务器提供非HTTP协议的服务!!!。网关的工作机制与代理十分相似,在用户与网关之间可以用HTTP协议,但网关与服务器之间可以自定义使用任何协议!
4、隧道
- 定义:隧道是在相隔甚远的客户端和服务器两者之间进行跳转,并保持双方通信连接的应用程序。
- 隧道的目的是确保客户端与服务器进行安全的通信,如使用SSL等加密手段
- 隧道本身不会解析HTTP请求,故客户端不用在意隧道的存在
5、缓存
- 定义:缓存是指代理服务器或客户端本地磁盘内保存的资源副本。
- 作用:减少对源服务器的访问,节省通信时间和通信流量
- 缓存具有有效期。因为客户端的要求、有效期等因素,有时要向源服务器确认缓存有效性
- 客户端也可以进行缓存。如果缓存有效,就可以直接在本地读取,不必再请求相同资源了。
六、HTTP首部
1、总述
- 报文结构参看第二大点,尤其是字段结构
- 作用:起到传递额外信息的作用
- 首部字段结构:首部字段名 : 属性1=字段值1,属性2=字段值2
- 如果首部字段重复了,要根据不同浏览器处理规则来。有些把先出现的作为主要,有的则把后出现的作为主要。
- 端对端首部和逐跳首部没看懂!!!
- 首部字段根据实际用途被分为4种类型(其它类型不算)
2、通用首部
General Header Fields请求报文和响应报文都会使用的首部。
Cache-Control
通过指令就能操作缓存的工作机制。
注意,指令可以为请求时指令和响应时指令,还有一些指令是共有的!
下面带有○记号的代表两者都有的。
缓存请求指令
指令 | 参数 | 说明 |
---|---|---|
no-cache○ | 无 | 强制向源服务器再次验证。目的是为了防止从缓存中返回过期的资源。如果请求中含有no-cache指令,则客户端不会接收过期的资源,“中间“缓存服务器必须把客户端请求转发给源服务器。换句话说,就是客户端只要源服务器上的资源,不要缓存的。 |
no-store○ | 无 | 不缓存请求或响应的任何内容 |
max-age=[秒]○ | 必需 | 响应的最大Age值。如果缓存资源的时间小于这个间,则使用缓存;否则,缓存服务器向源服务器转发。当这个值为0时,表示不使用缓存,直接转发。优先性:s-maxage>max-age>Expires |
max-stale(=[秒]) | 可省略 | 接收已过期的响应。如果没有指定数值,则无论过了多长时间,客户端都会接受缓存。 |
min-fresh=[秒] | 必需 | 期望在指定时间内的响应仍有效。比如设置为60,如果这个资源在60s内没有过期(没有超过资源的有效期),则返回。注意与max-age区分,这里有一个有效性的判断,而max-age只是用于比较给定时间和缓存存在时间。 |
no-tranform○ | 无 | 代理不可更改媒体类型 |
only-if-cached | 无 | 从缓存获取资源。如果缓存服务器上无此缓存资源,则返回状态码504 Gateway Timeout。如果有缓存,则直接返回缓存资源,并且不会确认资源的有效性。 |
cache-extension | - | 新指令标记(token) |
缓存响应指令
指令 | 参数 | 说明 |
---|---|---|
public | 无 | 可向任意方提供响应的缓存 |
private | 可省略 | 仅向特定用户返回响应 |
no-cache○ | 可省略 | 缓存前必须先确认其有效性。目的是为了防止从缓存中返回过期的资源。如果响应中含有no-cache指令,那么缓存服务器不能对资源进行缓存,且禁止对响应资源进行缓存操作。如果no-cache=Location,表示客户端不能使用缓存。 |
no-store○ | 无 | 不缓存请求或响应的任何内容 |
no-transform○ | 无 | 代理不可更改媒体类型。可以防止缓存服务器或代理压缩图片等操作。 |
must-revalidate | 无 | 可缓存但必须再向源服务器进行确认。如果代理无法再次获得有效资源的话,那么会返回504状态码。而且使用这条指令会直接忽略max-stale。 |
proxy-revalidate | 无 | 要求中间缓存服务器对缓存的响应有效性再进行确认 |
max-age=[秒]○ | 必需 | 响应的最大Age值。在这个时间内缓存服务器可以不用向源服务器确认资源有效性。优先性:s-maxage>max-age>Expires |
s-maxage=[秒] | 必需 | 公共缓存服务器响应的最大Age值。优先性:s-maxage>max-age>Expires看不懂。。。 |
cache-extension | - | 新指令标记(token) |
Connection
两个作用:
-
控制转发时要删除的首部字段
- 属于hop-by-hop逐跳首部的范畴。
- 如Connection:Cache-Controll ,那么该字段(Cache-Controll)在代理收到后,会被删除后转发给源服务器。
-
管理持久连接
Connection:close //关闭连接 Connection:Keep-Alive //保持连接,适用于旧版本,因为HTTP/1.1已经默认为持久连接了。
Date
指示创建报文的时间和日期
Pragma
是HTTP/1.1版本之前的历史遗留字段,仅作为与HTTP/1.0向后兼容而定义的。
只有一种形式,只用于客户端(虽然属于通用字段)。客户端会要求所有中间服务器不返回缓存的资源。
Pragma:no-cache
其实相当于Cache-Controll:no-cache
因为不能保证所有通信间的协议版本一致,故可以两个字段同时使用,如:
Pragma:no-cache
Cache-Controll:no-cache
Trailer(看不懂)
英文本意:拖车,预言家。
首部字段Trailer会事先说明在报文主体后记录了哪些首部字段。该首部字段可应用在HTTP/1.1版本分块传输编码中。
Transfer-Encodeing
规定了传输报文主体时采用的编码方式。仅能用于分块传输编码的时候。
Upgrade(看不怎么懂)
用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
Via
使用Via是为了追踪客户端与服务器之间的请求和响应报文的传输路径。报文经过网关或代理时,会在首部字段中加入服务器的信息,然后再进行转发。通常可以配合TRACE方法使用。
Warning
通常用于告知用户一些与缓存相关的问题的警告。警告有自己的格式,具体要用的时候再查。而且警告码是一种状态码,属于1XX的分类。
3、请求首部字段
请求首部字段是从客户端往服务器端发送请求报文中所使用的字段。用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。
Accept
用于通知服务器,用户代理(可以是浏览器)能够处理的媒体类型,以及处理媒体类型的优先级。
q代表权重,用";"分隔开,q的大小在0到1之间。不指定q时,默认为1。
当服务器可以提供多种媒体类型时,会返回优先级最高的类型。
Accept:text/html, application/xhtml;q=0.9,*/*;q=0.8
常用的格式如下:
*.3gpp audio/3gpp, video/3gpp 3GPP Audio/Video
*.ac3 audio/ac3 AC3 Audio
*.asf allpication/vnd.ms-asf Advanced Streaming Format
*.au audio/basic AU Audio
*.css text/css Cascading Style Sheets
*.csv text/csv Comma Separated Values
*.doc application/msword MS Word Document
*.dot application/msword MS Word Template
*.dtd application/xml-dtd Document Type Definition
*.dwg image/vnd.dwg AutoCAD Drawing Database
*.dxf image/vnd.dxf AutoCAD Drawing Interchange Format
*.gif image/gif Graphic Interchange Format
*.htm text/html HyperText Markup Language
*.html text/html HyperText Markup Language
*.jp2 image/jp2 JPEG-2000
*.jpe image/jpeg JPEG
*.jpeg image/jpeg JPEG
*.jpg image/jpeg JPEG
*.js text/javascript, application/javascript JavaScript
*.json application/json JavaScript Object Notation
*.mp2 audio/mpeg, video/mpeg MPEG Audio/Video Stream, Layer II
*.mp3 audio/mpeg MPEG Audio Stream, Layer III
*.mp4 audio/mp4, video/mp4 MPEG-4 Audio/Video
*.mpeg video/mpeg MPEG Video Stream, Layer II
*.mpg video/mpeg MPEG Video Stream, Layer II
*.mpp application/vnd.ms-project MS Project Project
*.ogg application/ogg, audio/ogg Ogg Vorbis
*.pdf application/pdf Portable Document Format
*.png image/png Portable Network Graphics
*.pot application/vnd.ms-powerpoint MS PowerPoint Template
*.pps application/vnd.ms-powerpoint MS PowerPoint Slideshow
*.ppt application/vnd.ms-powerpoint MS PowerPoint Presentation
*.rtf application/rtf, text/rtf Rich Text Format
*.svf image/vnd.svf Simple Vector Format
*.tif image/tiff Tagged Image Format File
*.tiff image/tiff Tagged Image Format File
*.txt text/plain Plain Text
*.wdb application/vnd.ms-works MS Works Database
*.wps application/vnd.ms-works Works Text Document
*.xhtml application/xhtml+xml Extensible HyperText Markup Language
*.xlc application/vnd.ms-excel MS Excel Chart
*.xlm application/vnd.ms-excel MS Excel Macro
*.xls application/vnd.ms-excel MS Excel Spreadsheet
*.xlt application/vnd.ms-excel MS Excel Template
*.xlw application/vnd.ms-excel MS Excel Workspace
*.xml text/xml, application/xml Extensible Markup Language
*.zip aplication/zip Compressed Archive
Accept-Charset
通知服务器用户代理支持的字符集及字符集的相对优先顺序。属于内容协商机制的服务器驱动协商。
Accept-Encoding
告知服务器用户代理支持的内容编码及内容编码的优先级顺序。如指定支持哪种报文主体压缩类型。
Accept-Language
告知服务器用户代理支持的自然语言及语言的优先级顺序。
Authorization
放入服务器需要的认证信息。发生在客户端与服务器端之间。质询后才加的。具体看下面认证的解释。
Proxy-Authorization
放入代理需要的认证信息。发生在客户端与代理服务器之间。质询后才加的。具体看下面认证大点的解释。
Expect
写明客户端期待服务器的行为。
如:
Expect:304-continue
是希望服务器端返回304状态码,如果服务器处理的结果不是304则会最终返回417Expetation Failed状态码
Form(看不怎么懂)
告知服务器使用用户代理的用户的电子邮件地址。通常使用的目的是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式。(但也有可能写入User-Agent请求首部字段)
Host
用于区分同一个IP上的不同虚拟主机。Host:主机名。是标准中必须规定要存在,且唯一必须要存在的字段。如果主机没有主机名,则直接发送一个空值即可。
形如If-xxx这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,都会执行请求。
If-Match
告知服务器匹配资源所用的实体标记(ETag)的值。
If-Match:“123456” 如果是不管ETag值可以 If-Match: *,只要资源存在应付处理请求。
If-None-Match
与If-Match功能相反。可以获得最新的资源,这一点和If-Modified-Since相似。
If-Modified-Since
If-Modified-Since:Date格式时间
如果在这个时间之后更新过资源,那么服务器正确处理请求。否则返回304 Not Modified
If-None-Modified-Since
和If-Modified-Since功能相反,在指定时间之后没有更新资源则服务器正确处理;否则返回412 Precondition Failed
If-Range
If-Range:ETage值或Date时间格式时间
Range: bytes=200-300,500-600
如果If-Range字段值与资源ETage值一致或与资源更新时间一致,则服务器以范围处理的方式处理请求;否则返回全体资源。
Range
Range:bytes=200-300
请求只需要某个范围内的资源。如果服务器正确处理,则返回206 Partial Content状态码;如果服务器不支持范围响应,则返回200OK状态码以全体资源。
Max-Forward
Max-Forward:n(n为十进制整数)
- 该字段以十进制整数形式指定可经过的服务器最大数目。每次转发减1,到0时立即返回响应。
- 配合TRACE可以追踪到在第n+1个服务器之前,请求是怎样被其它代理服务器修改的
- 配合OPTIONS可以得知第n+1个服务器所支持的HTTP方法
- 如果代理服务器由于某些原因导致请求转发失败,客户端也就等不到服务器返回的响应了。对此,我们无从得知
Referer
告知服务器请求URI的Web页面是哪个。
客户端一般会发送该字段给服务器。
Referer正确的拼写应该是Referrer。。。但就这样错了下去了。
TE
Transfer-Encoding在通用首部中,注意区分。前者是指定编码传输方式,后者是告知服务器用户代理能够支持的传输编码格式。
告知服务器客户端能够处理响应的传输编码的方式及相对优先级 。
指定伴随trailer字段进行分块传输编码???(不懂)
User-Agent
会写入创建请求的浏览器和用户代理等信息传达给浏览器。
如果请求经过代理,那么中间也很有可能加上代理服务器的名称。
4、响应首部字段
响应首部字段是由服务器端向客户端返回响应报文中所使用的字段。用于补充响应的附加信息、服务器信息等,以及对客户端附加要求等信息。
Accpet-Ranges
用来告知客户端服务器是否能够处理范围请求。
可指定的字段值有两种,如果允许范围请求时指定为bytes,否则为none
Accept-Ranges:bytes
Accept-Ranges:none
Age
Age有两种含义:
-
如果是响应由源服务器创建:告知客户端,源服务器在多久前创建了响应,单位为秒。
-
如果创建响应的是缓存服务器:则Age值指缓存后的响应再次发起认证完成的时间值。代理创建响应时,必须加上首部字段Age。(如果用Cache-Controller:max-age呢?。。。不会矛盾?。。。不懂)
网上的值含义解释:代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。怎么不一样。(不懂)
ETag
-
告知客户端实体标识。
-
ETag标志是一种可将资源以字符串做唯一标识的方式。服务器会为每一分资源分配对应的ETag值。资源 更新时ETag会改变,算法内容由服务器自行决定。
-
仅由URI确定资源是困难的如www.baidu.com,英文版返回英文,中文版返回中文。所以可以加入ETage值辅助确定。下载过程中中断等情况,也是通过ETage值来确定一个资源。
-
ETage分类
- 强ETag:不论实体发生多么细微的变化都会改变其值。形式:ETag:“字符串”
- 弱ETag:只用于提示资源是否相同。只有资源发生根本性改变,产生差异时才会改变ETag值。形式:ETag:W/ “字符串”(多了一个W,即weak)
Location
将响应接收方引导至某个与请求URI位置不同的资源。
基本上该字段会配合3XX,来提供重定向的URI。
Proxy-Authenticate
-
注意和请求首部字段中的Proxy-Authenrization区别,前者是动词,表示要求你去认证。后者是名词,表示有认证信息。
-
把代理服务器所要求的认证信息发送给客户。
-
发生在客户端与代理服务器之间。
-
如果返回401 Unauthorized状态码,那么一定有该字段(如果响应是由代理服务器创建)
WWW-Authenticate
-
注意和请求首部字段中的Authenrization区别,,前者是动词,表示要求你去认证。后者是名词,表示有认证信息。
-
把服务器所要求的认证信息发送给客户。
-
发生在客户端与源服务器之间。
-
如果返回401 Unauthorized状态码,那么一定有该字段(如果响应是由源服务器创建)
Retry-After
- 告知客户端应该在多久之后再次发送请求
- 配合503 Service Unavailable或3XX Redirect响应码一起使用。
- 字段值可以是秒,也可以指定具体的Date格式日期时间
Server
告知客户端当前服务器安装HTTP服务器应用程序的信息。
Vary
英文原意:变化,改变,变异。
Vary:Accept-Language
- Vary可对缓存资源进行控制
- 第一次请求经过缓存服务器和源服务器正常传达,如果源服务器返回Vary:Accept-Language,那么下一次请求中,如果含有Accept-Language字段,如果与缓存中的Accept-Language内容相同,则直接从缓存返回响应;否则,需要从源服务器中重新获取资源。
5、实体首部字段
包含在请求报文和响应报文中的实体部分所使用的首部。用于补充与实体相关的信息。
Allow
用于通知客户端资源能够支持的所有HTTP方法。如果用非法方法访问资源,则会返回405Method Not Allow状态码,并且写入所有该资源支持的HTTP方法。
Content-Encoding
告知客户端服务器对实体主体选用的内容编码方式。(貌似请求不能用,因为请求怎么会传输实体呢)
Content-Language
告知客户端实体主体使用的自然语言。(如何知道字符编码?默认ISO 8859 1,可以由Content-Type指定字符集)
Content-Length
- 单位字节,表明实体主体大小
- 如果进行了内容编码传输,则不能使用该字段。
Content-Location
注意与Location字段区分,Location是引导用。
给出与报文主体部分相对应的URI。
如对于使用Accept-Language服务器驱动型的请求,当返回的页面内容与实际请求的对象不同时,首部字段会写明URI(如访问www.aaa.com,返回的是www.aaa.com/index-en.html)
Content-MD5
服务器对内容主体进行MD5编码计算,把算出来的值放入Content-MD5字段中。客户端接收到响应后,用同样的MD5算法计算内容主体的MD5码,与Content-MD5字段值进行比较。这样可以检查报文主体在传输过程中是否保持完整。但不能保证内容一定相同,因报文主体和Content-MD5的值在传输过程中可能被修改,客户端无法判断这个报文主体和Content-MD5的值是否被修改过。
Content-Range
Content-Range:bytes 5001-10000/10000
针对范围请求,能告知客户端响应返回的实体的哪个部分符合范围请求。单位是字节。
Content-Type
Content-Type:text/html; charset=UTF-8
同时说明了内容主体的媒体类型与字符编码。
Expires
- 代表资源失效的时间
- 在Expires指定的时间来之前,响应的副本会一直被保存在缓存服务器。当到达时间后,缓存服务器会转向源服务器请求资源。
- 如果源服务器不希望缓存服务器进行缓存,可以把Expires字段写成与Date字段相同的值。
- 优先性:s-maxage>max-age>Expires
Last-Modified
指明资源最后修改的时间
6、Cookie
Cookie的工作机制是用户识别与状态管理。
Set-Cookie
-
属于响应首部字段。
-
字段属性:字段值:
属性 说明 status 说明Cookie状态,enable代表可用 NAME=VALUE 赋予Cookie名称与其值(必需项) expires=Date Cookie的有效期(若不指定,是默认为浏览器关闭前为止) path=PATH 将服务器上的文件目录作为Cookie的适用对象(若不指定,则默认为文档所在的文件目录) domain=域名 作为Cookie适用对象的域名(若不指定则默认为创建Cookie的服务器的域名) Secure 仅在HTTPS安全通信时才会发送Cookie HttpOnly 加以限制,使Cookie不能被JS脚本访问 -
一旦Cookie发送到客户端,则服务器没有可以显式删除Cookie的方法。但可以通过覆盖的方法,达到对已过期的Cookie的“删除”。
Cookie
- 属于请求首部字段
7、其它
X-Frame-Options
控制网站内Frame标签显示问题,防止点击劫持(click jacking)攻击。
X-XSS-Protection
针对XSS攻击的一种对策,控制浏览器XSS防护机制的开关。
DNT
Do Not Trace拒绝个人信息被追踪,表示拒绝被精准广告追踪的一种方法。
P3P
保护隐私。
七、HTTPS
1、http缺点
- 通信使用明文,不加密,内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以可能已遭篡改
2、HTTPS总述
-
SSL:Secure Socket Layer安全套接层
TLS:Transport Layer Security安全传输协议
这两者都是通过建立安全通信线路保证安全的(将整个通信线路加密处理),而不是内容的加密。(不懂什么叫建立安全通信线路?)
-
HTTP与SSL的组合使用就称为HTTPS。HTTPS并不是一个新的协议。
HTTPS = HTTP + 加密 + 认证 + 完整性保护
-
正常情况下,HTTP直接与TCP通信;而加入SSL后,HTTP先与SSL通信,然后SSL再与TCP通信
3、共享密钥
- 加密和解密同用一个密钥的方式称为共享密钥加密(Common Key Crypto System),也称为对称密钥加密
- 只要拿到密钥,任何人都可以破解密码
- 困镜:无法安全把密钥移交给对方,如果能安全移交,那么数据也能了,就不用费功夫搞密钥。
4、公开密钥
- 公开密钥加密使用一对非对称的密钥。一把叫私有密钥(private key),另一把叫公开密钥(public key)。
- 加密方案:加密方向外界发布公开密钥,任何人都可以用公开密钥加密。但只有发布人有私有密钥,只有私有密钥才能解密。
- 根据数学原理,要通过密文和公开密钥反向解出内容是非常困难的,目前技术无法做到。
- 困镜:无法保证客户端拿到的公开密钥就是目标服务器的公开密钥。比如A服务器向B客户端公开密钥过程中,被攻击者替换了公开密钥,然后客户端用伪造的公开密钥加密,然后攻击者再用自己的私有密钥同样可以达到获取信息的目的。
5、混合加密机制
- 公开密钥加密方法比共享加密方法处理速度慢
- HTTPS采用混合加密机制,即先用公开密钥加密共享密钥,双方有了共享密钥后,之后的通信都用共享密钥进行。
6、公开密钥认书
- 由于无法保证公共密钥的正确性,故需要第三方机构介入判断,称为数字证书认证机构(CA,Certificate Authority)
- 数字认证机构的业务流程:
- 网站向机构提出公开密钥申请
- 机构在确认网站身份等信息后,会对这个公开密钥做数字签名
- 客户端向机构索要数字签名,这个过程用机构的公开密钥进行
- 客户端根据索要的数字签名与已经得到的网站的公开密钥做对比验证,通过后就能确定服务器的公开密钥是值得信赖的。
- 因为机构向客户端发送数字签名过程中,同样存在公开密钥认证性问题,这样就陷入了循环。所以通常做法是,浏览事先在本地植入常用认证机构的公开密钥,在本地做安全可比在网络做安全容易多了。
7、客户端证书
- 公开密钥证书是为了保证服务器的“正确性”,那么客户端在一定情况下也要保证“正确性”
- 问题点:证书的获取与发布,及不同知识层次的人自行安装是有难度的(说白点就是有些人不会安装),而证书是付费的
- 因此,客户端证书使用场景一般是公司内部或者比如银行的网上银行,在登录网银时,要确认客户端证书,保证用户从特定的终端访问网银。
八、认证
详细好文:https://www.cnblogs.com/xiaoxiaotank/p/11078571.html
1、总述
- 核对只有用户才知道的信息(比如账号密码)就叫做认证。
- 核对的信息可以有以下类型:
- 密码:只有本人才知道的字符串信息
- 动态令牌:仅限本人持有的设备内显示的一次性密码
- 数字证书:仅限本人(终端)持有的信息(这一点和证书相似)
- 生物认证:指纹和虹膜等本人的生理信息
- IC卡等:仅限本人持有的信息(实体承载)
- 注意和证书区别,证书是为了确认端的正确性,而认证是为了确认使用者的正确性
2、BASIC认证(基本认证)
-
采用的是质询/响应的方式进行(challenge/response)
-
认证步骤:
- 客户端发送请求
- 服务器返回401Unauthorized状态码要求认证。WWW-Authenticate或Proxy-Authenticate字段中会包含认证方式(BASIC)及安全域字符串(realm)。
Realm
表示Web服务器中受保护文档的安全域(比如公司财务信息域和公司员工信息域),用来指示需要哪个域的用户名和密码 - 客户端写入需要的认证信息再次发送请求。用户输入账号和密码,中间用“;”分隔,然后通过Base64编码处理,写入Authorization字段。
- 认证成功返回资源;否则返回步骤2。(如果执行了2次及以上的步骤2,说明认证失败过)
-
Base64不是加密处理方式,很容易对其进行解码,安全性不高。所以通常要配合HTTPS。
-
一般浏览器无法实现认证注销操作
-
假冒服务器很容易骗过认证,诱导用户输入用户名和密码
3、DIGEST认证
- 同样采用的是质询/响应的方式进行(challenge/response)
- 认证步骤:
- 客户端发送请求。
- 服务器返回401Unauthorized状态码要求认证。响应中包含质询码
- 客户端根据质询码对密码加密,生成响应码,再次发送请求
- 认证成功返回资源;否则返回步骤2。(如果执行了2次及以上的步骤2,说明认证失败过)
4、SSL客户端认证
- 借由HTTPS的客户端证书完成认证的方式。
- 认证步骤:
- 客户端发送请求
- 服务器发送Certificate Request报文,要求客户端提供客户端证书
- 用户把客户端证书信息以Client Certificate报文方式发送给服务器
- 服务器验证客户端证书通过后方可领取证书内容客户端的公开密钥,然后开始HTTPS加密通信。
- 要大量钱,尚没普及
- 不会仅靠客户端证书完成认证(保证客户端正确性),还会组合基于表彰认证(保证用户本人正确性)
5、基于表单认证
- 基于表单认证的方式不是在HTTP协议中定义的
- 认证方式由Web应用程序自行决定,如界面,要求手机验证码等。
- 是最通用的认证方式