应用层通信协议整理

引子

今天在查询一个流媒体CDN下载异常(Access Denied. 拒绝访问)的时候,发现是由于做了防盗链,会检查请求header中的refer字段,所以直接使用链接下载是会有问题。然后我发现我其实对http协议其实并不了解,所以用这篇文章整理一下HTTP header相关的约定。

背景
  1. HTTP wikipedia

  2. 百科:超文本传送协议 (HTTP-Hypertext transfer protocol) 定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。

  3. 万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作发布了一系列的RFC,RFC 1945 定义了HTTP/1.0版本。其中最著名的就是RFC 2616 。RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。
    2014年6月,HTTPbis Working Group更新了http1.1中的部分内容

    • RFC 7231 - HTTP/1.1: Semantics and Content
    • RFC 7232 - HTTP/1.1: Conditional Requests
    • RFC 7233 - HTTP/1.1: Range Requests
    • RFC 7234 - HTTP/1.1: Caching
    • RFC 7235 - HTTP/1.1: Authentication
关于HTTP
  1. HTTP协议主要包括以下的methods(区分大小写):

    • GET - 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中
    • HEAD- 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
    • POST - 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
    • 其他的我平时关注比较少:PUT、DELETE、TRACE、OPTIONS、CONNECT、PATCH
  2. 响应头--状态行
    第一行一定是状态行:HTTP-Version 空格 Status-Code 空格 Reason-Phrase CRLF,例如:HTTP-1.1 200 OK ,状态码可以点这里, 常见的: ``` 200:成功请求的标准响应 301:本网页被永久性转移到另一个URL 302:请求的网页被转移到一个新的地址,但客户访问仍继续通过原始URL地址 304:自从上次请求后,请求的网页未修改过,服务器返回此响应时,不会返回网页内容 404:一个404错误表明可连接服务器,但服务器无法取得所请求的网页 500:服务器遇到错误,无法完成请求 503:由于超载或停机维护,服务器目前无法使用

    我之前觉得迷惑的: status code: 200 ok ( from cache ) status code: 304 Not Modified 两者的区别在于前一个是直接不向服务器请求了,而后一个是不确定,向服务器问了一下,发现不用更新,然后再用缓存。 ```

  3. 响应头--响应头域
    服务器需要传递许多附加信息,这些信息不能全放在状态行里。因此,需要另行定义响应头域,用来描述这些附加信息。响应头域主要描述服务器的信息和Request-URI的信息。
    • Cache-Control(通用头域):指定请求和响应遵循的缓存机制,每一个请求是独立的,互不影响。指令包括:no-cache、no -store、max-age、max-stale、min-fresh、only-if-cached,而对于返回的响应消息,也有一堆的指令:public(可被任何缓存区缓存)、 private(对于单个用户的整个或部分响应消息,不能被共享缓存处理)、no-cache(不能缓存)、no-store(用于防止重要的信息被无意的发布,缓存将不存储response)、no-transform(不进行转码)、must-revalidate(响应在特定条件下会被重用,以满足接下来的请求,但是它必须到服务器端去验证它是不是仍然是最新的。)、proxy-revalidate、 max-age(指示客户机可以接收生存期不大于指定时间以秒为单位的响应)。
    • Date(通用头域):Date头域表示消息发送的时间,时间的描述格式由rfc822定义,例如:Thu, 08 Jan 2015 03:56:18 GMT
    • Pragma(通用头域):Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。 * Connection(通用头域):当client和server通信时对于长链接如何进行处理。
    • ETag:HTTP/1.1 引入了 Etag(Entity Tags).Etag仅仅是一个和文件相关的标记,可以是一个版本标记,比如说v1.0.0或者说"2e681a-6-5d044840"这么一串看起来很神秘的编码,这个与If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改,这样可以解决频繁修改或者是否有修改的问题。总之是为了更好的利用缓存。
    • Accept(请求报头域):用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。
    • Accept-Charset(请求报头域):用于指定客户端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
    • Accept-Encoding(请求报头域):类似于Accept,但是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
    • Accept-Language(请求报头域):类似于Accept,但是它是用于指定一种自然语言。eg:Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
    • Authorization(请求报头域):主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
    • Host(请求报头域):主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。例如:Host:shared.ydstatic.com
    • User-Agent(请求报头域):我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息了
    • Referer(请求报头域):来源站点
    • Cookie:这个不用说了
    • Location(响应报头域):用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。
    • Server(响应报头域):包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。
    • Vary
    • Content-Encoding(实体报头域):被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding这样用于记录文档的压缩方法,eg:Content-Encoding:gzip
    • Content-Language(实体报头域):描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言读者。
    • Content-Length(实体报头域):用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
    • Content-Type(实体报头域):用语指明发送给接收者的实体正文的媒体类型。例如:ContentType:text/html;charset=GB2312或者Content-Type:text/html; charset=utf-8
    • Last-Modified(实体报头域):用于指示资源的最后修改日期和时间。
    • Expires(实体报头域):给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。eg:Expires:Thu,15 Sep 2006 16:23:12 GMT
关于HTTPS
  • 网景在1994年创建了HTTPS,并应用在网景导航者浏览器中。 最初,HTTPS是与SSL一起使用的;在SSL逐渐演变到TLS时,最新的HTTPS也由在2000年五月公布的RFC 2818正式确定下来。HTTPS实际上应用了Netscape的安全套接层(SSL)作为HTTP应用层的子层,使用端口443,而不是像HTTP那样使用端口80来和TCP/IP进行通信。
  • 主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性,凡是使用了 https 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过 CA 机构颁发的安全签章来查询
  • https协议需要到Certificate Authority申请证书,一般免费证书很少,需要交费.
  • 少许对客户端有要求的情况下,会要求客户端也必须有一个证书。这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码,还有一个CA 认证过的身份。因为个人证书一般来说是别人无法模拟的,所有这样能够更深的确认自己的身份。目前大多数个人银行的专业版是这种做法,具体证书可能是拿U盘(即U盾)作为一个备份的载体。
  • 具体开发https还有很多细节,这里就先不提了,如果有机会用到了,再写出来吧。
关于SPDY

Google开发的基于TCP的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。新协议的功能包括数据流的多路复用、请求优先级以及HTTP报头压缩。谷歌表示,引入SPDY协议后,在实验室测试中页面加载速度比原先快64%。

  • 将页面加载时间减少50%。
  • 最大限度地减少部署的复杂性。SPDY使用TCP作为传输层,因此无需改变现有的网络设施。
  • 避免网站开发者改动内容。 支持SPDY唯一需要变化的是客户端代理和Web服务器应用程序。 具体:
  • 单个TCP连接支持并发的HTTP请求。
  • 缩报头和去掉不必要的头部来减少当前HTTP使用的带宽。
  • 定义一个容易实现,在服务器端高效率的协议。通过减少边缘情况、定义易解析的消息格式来减少HTTP的复杂性。
  • 强制使用SSL,让SSL协议在现存的网络设施下有更好的安全性和兼容性。
  • 允许服务器在需要时发起对客户端的连接并推送数据。
  • 具体开发https还有很多细节,这里就先不提了,如果有机会用到了,再写出来吧。

    博客参考: SPDY 是什么?如何部署 SPDY?


comments powered by Disqus