HTTP

HTTP 发展

http/0.9 1990年
http/1.0 1996.5
http/1.1 1997.1

HTTP 方法

  • GET : 获取资源 : 请求访问已被URI识别的资源
GET /index.html HTTP/1.1
Host: www.okayjam.com 
  • POST : 传输实体
POST / HTTP/1.1
Host: www.okayjam.com
Content-Length: 1560  (1560 字节的数据,1560随便写的)
  • PUT : 传输文件
    和ftp协议文件上传一样,要求在请求的报文主体包含文件内容,然后保存到请求URI指定的位置,但是由于HTTP/1.1 的PUT方法本身不带验证机制,任何人都可以上传文件,存在安全性的问题,所以一般的web网站不用这个方法。若要使用则需要配合Web应用程序的验证机制。
PUT /example.html HTTP/1.1
Host: www.okayjam.com 
Content-Type: text/html
Content-Length: 1560 (1560字节的数据)
  • HEAD : 获取报文首部
    和GET差不多,只是不返回报文的主体,用户确认 URI的有效性及资源更新的日期时间等。
HEAD /index.html HTTP/1.1
Host: www.okayjam.com
  • DELETE : 删除文件
    用来删除文件,和PUT相反的方法
DELETE /example.html HTTP/1.1
Host: www.okayjam.com    
-- 响应返回状态码204 No Content (服务器成功处理了请求,没有返回任何内容)
  • OPTIONS : 询问支持的方法
请求
OPTIONS * HTTP/1.1
Host: www.okayjam.com
响应
HTTP/1.1 200 OK
Allow: GET,POT,HEAD,OPTIONS 
  • TRACE : 追踪的路径
    让Web服务器端将之前的请求通信返回给客户端的方法, 回显服务器接收到的header。支持该方法的服务器可能存在XST安全隐患。(因为代理服务器可能改了请求)
--请求
TRACE /trace HTTP/1.1
Host: www.okayjam.com 
Max-Forwards:2
--响应
HTTP/1.1 200 OK
Content-Type: message/http
Content-Length: 1024 
--空行
TRACE /trace HTTP/1.1
Host: www.okayjam.com 
Max-Forwards:2  (返回响应包含请求的内容)
  • CONNECT : 要求用隧道协议连接代理
    要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和 TLS协议把通信内容加密后经网络隧道传输
    CONNECT 代理服务器名:端口号 HTTP版本 –基本格式
请求
CONNECT proxy.okayjam.com:8080 HTTP/1.1
Host: proxy.okayjam.com
响应
HTTP/1.1 200 OK

持久化连接

  • 持久连接: HTTP/1.1 之前的协议版本,每次http通信都进行 TCP的连接和释放,比较浪费资源,HTTP/1.1和部分的HTTP/1.0,实现了持久连接的特点,只要任意一方没有明确提出断开连接,则保持TCP连接
  • 管线化:从前的请求需要等待并接收响应才能发送下一个请求。管线化能够做到同时并行发送多个请求。

Cookie 状态管理

HTTP是无状态协议,它不对之前发生过的请求和响应的状态进行管理。引入cookie技术保存一些信息,Cookie会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存Cookie,当下次客户端再往该服务器发送请求时,请求会自动在请求报文加入Cookie值后发送。

①请求报文(没有Cookie 信息的状态)

GET /reader/ HTTP/1.1
Host: hackr.jp

*首部字段内没有Cookie的相关信息
②响应报文(服务器端生成Cookie 信息)

HTTP/1.1 200 OK
Date: Thu, 12 Jul 2012 07:12:20 GMT
Server: Apache
<Set-Cookie: sid=1342077140226724; path=/; expires=Wed,10-Oct-12 07:12:20 GMT>
Content-Type: text/plain; charset=UTF-8

③请求报文(自动发送保存着的Cookie 信息)

GET /image/ HTTP/1.1
Host: hackr.jp
Cookie: sid=1342077140226724

Set—Cookie字段的属性

属性 说明
NAME=VALUE 赋予Cookie的名称和其值
expires=DATECookie 的有效期(若不mingque指定则默认为浏览器关闭前为止)
path=PATH 将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的目录)
domain=域名 作为Cookie适用对象的域名(若不指定则默认为创建Cookie的服务器的域名)
Scure 仅在HTTPS安全通信时才会发送Cookie
HttpOnly 加以限制,使Cookie不能被JavaScript脚本访问

HTTP 报文信息


报文语法

这是请求报文的格式:

    <method> <request-URL> <version> (请求行)
    <headers> 
    --空行
    <entity-body>

     这是响应报文的格式(注意,只有起始行的语法有所不同):
    <version> <status> <reason-phrase> (状态行)
    <headers>
    --空行
    <entity-body>

编码提升传输速率

  • 压缩

为了减低传输的数据的大小,通常会采用压缩,常见的压缩有:
gzip(GUN zip),compress(UNIX系统的标准压缩),deflate(ZLIB)和identity(不压缩)

  • 分割发送 : 分块传输编码

当传输的实体比较大的时候,会把数据分割成多块,能都让浏览器逐步显示。boundary等关键字
获取部分内容的范围(在请求头上加上 Range)
Range: bytes=5001-10000 5001~10000 字节
Range: bytes=0-3000, 5001-10000 多重范围
Range: bytes=5001- 从5001之后全部字节

返回状态码

  • 1xx 接收的请求正在处理

100 Continue 服务器已经接收到请求头,并且客户端应继续发送请求主体

  • 2xx 请求正常处理完毕

200 OK 请求已经成功了
204 No Content 服务器成功处理了请求,没有返回任何的内容
206 Partial Content 服务器已经成功处理了部分GET请求(改状态码表示客户端进行了范围请求),下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载

  • 3xx 需要进行附加操作已完成请求(重定向)

301 Moved Permanently 永久性重定向。资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。
302 Found 临时重定向。重定向是临时的,客户端应当继续向原有地址发送以后的请求。
303 See Other 和302差不多,但客户端应该使用单独的GET消息发出重定向(假如之前的POST),303响应禁止被缓存。
304 Not Modified 表示资源未被修改,因为请求头指定的版本If-Modified-Since或If-None-Match。在这种情况下,由于客户端仍然具有以前下载的副本,因此不需要重新传输资源。
307 和302差不多,和303不同,但是当重新发出原始请求时,不允许更改请求方法。例如,应该使用另一个POST请求来重复POST请求。

  • 4xx 服务器无法无法完成请求

400 Bad Request 表示请求的报文中存在明显的错误
401 Unauthorized 未认证,表示发送的请求需要有通过HTTP认证的认证信息。如果当前请求已经包含了Authorization证书,那么401响应代表着服务器验证已经拒绝了那些证书。
403 Forbidden 服务器拒绝请求。
404 Not Found 请求失败,请求多希望得到的资源未被在服务器上发现。也可能是服务器拒绝请求又不想说明情况时返回
405 Method Not Allowed 表示服务器不支持该请求的方法

  • 5xx 服务器处理请求出差错

500 Internal Server Error 通用的错误消息,服务器遇到未曾预料到的状况,导致了无法完成对请求的处理。可能是bug也可能是临时的错误
503 Service Unavailable 服务器处于超负荷或者进行停机维护,现在无法处理请求

状态码和状况不一致: 不少状态码响应是错误的,比如有时WEB应用程序出现错误,还是返回200 OK

Web 服务器

* 代理(proxy):具有转发功能的程序,扮演服务器和客户端的中间人的角色

缓存代理:转发响应时,会把资源缓存在代理服务器上。
透明代理:代理转发时不对报文做任何加工的代理类型称为透明代理,反之,称为不透明代理

* 网关: 转发其他服务器通信数据的服务器,接收从客户端发来的请求时,就像自己拥有资源一样对请求进行处理。有时客户端也无法察觉自己的通信目标是一个网关

与代理相似。网关能使通信线路上的服务器提供非http的协议服务

* 隧道(tunel): 是在客户端和服务器之间进行中转,并保持双方通信连接的应用程序。(应用在使用代理的时候客户端与服务器 直接进行 TLS握手)

隧道本身是透明的,客户端不用在意隧道的存在

HTTP 首部报文

首部字段结构( https://goo.gl/biJaA2 , https://goo.gl/kQbhK5 )
首部字段名: 字段值
端到端首部(End-to-end Header): 会把请求转发到最终对应的服务器和客户端
逐跳首部(Hop-by-hop Header)(需要提供connection字段,只有8个这样的首部字段):只对单次转发有效,会因缓存或代理而不再转发

  • 通用首部字段:请求和响应报文都会使用到 ( https://goo.gl/u68L2c )
首部字段名 说明
Cache-Control 控制缓存的行为
Connection 逐跳首部,连接的管理 HH
Date  创建报文的日期时间
Pragna  报文指令
Trailer  报文末端的首部一览 HH 
Transfer-Encoding 指定报文主体的传输编码方式 HH
Upgrade 升级为其他协议
HHVia 代理服务器的相关信息
Warning 错误通知|

Cahche-Control :通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制
Cache-Control:max-age=0, private, must-revalidate, no-cache 注意no-cache表示不缓存过期的资源,no-store才是真正不缓存

Connection: 具有两个作用

  1. 控制不在转发给代理的首部字段
    GET / HTTP/1.1
    Upgrade: HTTP/1.1
    Connection: Upgrade
    经过代理服务器到达原服务器(首部字段Upgrade被删除在转发)
  2. 管理持久化连接
    HTTP/1.1 版本默认是持久连接的,为此客户端会在持久连接上连续发送请求,当服务器端想明确断开连接时,则指定Connection首部字段的值为Close.如果想在旧版本的HTTP协议上维持持续连接时,则需指定Connection首部字段的值为Keep-Alive

Date:创建报文的时间
Pragma: 遗留字段
Trailer: 该首部字段可应用在HTTP/1.1版本分块传输编码时

  • 请求首部字段:客户端发送到服务器请求报文使用的首部( https://goo.gl/XFgd5S )
首部字段名 说明
 Accept 用户代理可处理的媒体类型
 Accept-Charset  优先的字符集
 Accept-Encoding  优先的内容编码
 Accept-Language  优先的语言(自然语言)
 AuthorizationWeb  认证信息
 Expect  期待服务器的指定行为
 From  用户的电子邮箱地址
 Host  请求资源所在服务器
 if-Match  比较实体标记(ETag)
 if-Modified-Since  比较资源的更新时间
 if-None-Match 比较实体标记(与if-Match相反)
 if-Range  资源为更新时发送实体Byte的范围请求
 if-Unmodified-Since  比较资源的更新时间(与if-Modified-Since相反)
 Max-Forwards  最大传输逐跳数
 Proxy-Authorization  代理服务器要求客户端的认证信息HH
 Range  实体字节范围请求
 Referer  对请求中的URL的原始获取方法
 TE  传输编码的优先级 HH
 User-Agent  HTTP客户端程序的信息
  • 响应首部字段:服务器发送到客户端的响应报文使用的首部( https://goo.gl/NHyLtH )
 首部字段名  说明 
 Accept-Ranges  是否接受字节范围请求
 Age  推算资源创建经过时间
 ETag  资源的匹配信息
 Location  令客户端重定向至指定的URL
 Proxy-Authenticate  代理服务器对客户端的认证信息
 Rety-After  对再次发起请求的时机要求
 Server  HTTP服务器的安装信息
 Vary  代理服务器缓存的管理信息
 WWW-Authenticate  服务器对客户端的认证信息
  • 实体首部字段:针对请求和响应报文的实体部分使用的首部( https://goo.gl/a55d4v )
 首部字段名  说明
 Allow  资源科支持的HTTP方法
 Content-Encoding  实体主体适用的编码方式
 Content-Language  实体主体的自然语言
 Content-Length  实体主体的大小(单位:字节)
 Content-Location  替代对资源的URL
 Content-MD5  实体主体的报文摘要
 Content-Range  实体主体的位置范围
 Content-Type  实体主体的媒体类型
 Expires  实体主体过期的日期时间
 Last-Modified  资源的最后修改日期时间

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据