当前位置:   article > 正文

超文本传输协议HTTP_具有隐私的超文本传输协议

具有隐私的超文本传输协议

在了解HTTP 协议之前需要先了解一些其他的概念,了解它们之间的关系才能更好的理解HTTP 协议。
内容偏于理论知识,理解起来可能不是很容易,所以在阅读之前希望带着以下几个问题,增加阅读的兴趣。

为什么计算机可以访问其他不同的站点来获得丰富的信息?(万维网)
万维网工作需要解决的问题?(URL、HTTP、HTML)
统一资源定位符URL如何实现对资源的定位?URL 的一般格式?
超文本传输协议HTTP 的操作过程是什么样的?HTTP 的报文是如何构成的?
网站识别用户的方式?(Cookie)

一、万维网简介

万维网WWW (World Wide Web)是一个大规模的联机式的信息储藏所,英文简称为Web。万维网用链接的方法能方便地从互联网上的一个站点访问另一个站点,从而主动地按需获取丰富的信息。下图说明了万维网提供分布式服务的特点。

上图画了5 个万维网的站点,它们可以远隔数千里,但都必需连接在互联网上。每一个万维网站点都保存了许多文档。这些文档之间通过链接(link),有时候也被称为超链接(hyperlink)的方式彼此相连。可以通过这个文档链接到相隔很远的另一个文档,经过一定的时延,我们的屏幕上就可以将远方发送过来的文档显示出来。万维网的出现使得网站数按指数增长,所以万维网的出现可以说是互联网发展中的一个里程碑。

万维网是一个分布式的超媒体(hypermedia)系统,它是超文本(hypertext)系统的扩充。所谓超文本是指包含指向其他文档的链接的文本(text)。也就是说,一个超文本由多个信息资源链接组成,这些信息资源可以分布在世界各地,并且数目不受限制。利用一个链接可以使用户找到远在异地的另一个文档。这些文档可以位于世界上任何一个接在互联网上的超文本系统中。超文本是万维网的基础。

超媒体与超文本的区别是文档内容不同。超文本文档仅包含了文本信息,而超媒体文档还包含了图形、图像、声音、动画以及视频图像等。

万维网以客户服务器方式工作。我们通常所用的浏览器就是用户级上的万维网客户程序。万维网文档所驻留的主机则运行服务器程序,因此这台主机也被称为万维网服务器。客户端向服务器程序发出请求,服务器程序向客户端程序返回客户所需要的万维网文档。万维网想要工作就必须要解决一下几个问题:
        1 ) 怎么样标志分布在整个互联网上的万维网文档?
        2 ) 用什么样的协议来实现万维网上的各种链接?
        3 ) 怎样使不同作者创建的不同风格的万维网文档,都能在互联网上各种主机上显示出来,同时使用户清楚地知道在什么地方存在着链接?
        4 ) 怎么样使用户能够方便的找到所需的信息?
为了解决第一个问题,万维网使用统一资源定位符URL(Uniform Resource Loacator)来标志万维网上的各种文档,使每一个文档在互联网的范围内具有唯一的标识符(URL)。为了解决第二个问题,是需要使万维网客户程序与万维网服务器程序之间的交互遵守严格的协议,这就是超文本传送协议HTTP(HyperText Transfer Protocol)。HTTP 是一个应用层协议,它使用TCP 连接来进行可靠的传输。为了解决第三个问题,万维网使用超文本标记语言HTML(HyperText Markup Language),使得万维网页面的设计者可以很方便地试用链接从本页面的某处链接到互联网上的任意一个万维网页面,并且能够在自己的主机屏幕上将这些页面显示出来。最后,用户可以使用搜索工具在万维网上方便的查找所需的信息。

下面详细介绍统一资源定位符URL、超文本传输协议HTTP以及简单介绍一下超文本标记语言HTML。

二、统一资源定位符URL

统一资源定位符 URL 是用来表示从互联网上得到的资源位置和访问这些资源的方法。URL 给资源的位置提供了一个抽象的识别方法,并用这种方法给资源定位。实现了对资源的定位,系统就可以实现对资源的各种操作,如存取、更新、替换和查找其他属性。因此URL 就是互联网上的资源的地址。显然,互联网上的所有资源,都必须有一个唯一确定的URL。

这里所说的“资源”是指互联网上可以被访问的任何对象,包括文件目录、文件、文档、图像、声音等,以及互联网相连的任何形式的数据。

URL 相当于一个文件名在网络范围内的扩展。因此,URL 是与互联网相连的机器上任何一个可访问的指针。由于访问不同的对象使用的协议不同,所以URL 还指出读取某个对象时所使用的协议。URL 的一般格式如下四部分组成:
            <协议>://<主机>:<端口>/<路径>

URL 的第一部分是最左边的<协议>。这里所说的协议是指用什么协议来获取万维网文档。最常用的协议是HTTP(超文本传输协议),还有FTP(文件传输协议)。在<协议>后的是”://”,这是规定的格式。它的右边是第二部分<主机>,它指出这个万维网文档是在哪一台主机上。这里的<主机>就是指该主机在互联网上的域名。再者就是第三部分<端口>和第四部分<路径>,在有的时候可以省略。

现在很多浏览器为了方便用户,在输入URL 时,可以把最前面的”http://”甚至把主机名最前面的“www”省略,这是因为浏览器会替用户将这些省略的字符添上。比如我们在地址栏输入“baidu.com”,浏览器就会自动帮我们把省略的字符补充完整。

平时我们使用最多的就是基于HTTP协议 的URL。这里主要介绍一下。一般格式如下:
            http://<主机>:<端口>/<路径>

HTTP 默认的端口号是80,通常情况下省略。若是再省略文件的<路径>,则URL 就会指到互联网的某个主页(home page)。主页可以是以下几个概念之一:
        1 ) 一个WWW 服务器的最高级别的页面。
        2 ) 某一个组织或部门的一个定制的页面或目录。从这样的页面可以链接到互联网上的与该组织或部门相关的其他站点。
        3 ) 某一个人自己设计的描述个人情况的WWW 页面。

用户在完成上面的动作只需要一个程序就可以完成——浏览器。这显然是很方便的。

三、超文本传输协议HTTP

这里主要通过三个方面来主要了解HTTP 协议。即HTTP 的操作过程、HTTP 报文结构和Cookie。

3.1HTTP 的操作过程

HTTP 协议定义了浏览器(万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送到浏览器。从层次角度看,HTTP 是面向事务的应用层协议,它是万维网上能够可靠传输文件(文本、图片、图形等)的重要基础。万维网的大致工作流程如下:

每个万维网网点都有一个服务器进程,它不断的监听着TCP 的80 端口,以便发现是否有浏览器向它发出连接建立请求。一旦监听到了连接建立请求并建立了TCP 连接之后,浏览器就向服务器发出浏览某个页面的请求,服务器接着就返回请求的对应的页面作为响应。最后,TCP 连接就被释放了。在浏览器和服务器之间的请求和响应交互,必须按照规定的格式和遵循一定的规则。这些格式和规则就是HTTP 协议。

用户浏览页面的方式有两种:一种方法是在浏览器的地址栏键入要浏览的页面的URL;另一种方法是在某一个页面通过链接的形式访问要浏览的页面。

为了保证传输过程的可靠性,HTTP 使用了面向连接的TCP 作为运输层协议。但是HTTP 本身却是无连接的。也就是说,虽然HTTP 使用了TCP 连接,但通信的双方在交换 HTTP 报文之前不会先建立HTTP 连接。

HTTP 协议也是无状态的(stateless)。也意味着,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时相同,因为服务器并不记得曾经访问过得这个客户,也不记得该客户曾多少次访问过这个服务器。这样做简化了服务器的设计,使服务器更容易支持大量并发的HTTP 请求。

3.2HTTP连接类型

用户在访问某个万维网文档时,HTTP 协议首先要和服务器建立TCP 连接。这需要使用三报文握手。当建立TCP 连接的三报文握手的前两部分完成后,万维网客户就把HTTP 请求报文,作为建立TCP 连接的三报文握手中的第三个报文的数据,发送给服务器。当服务器接收到HTTP 请求报文后,再把请求的资源返回给用户。

上图请求万维网文档所需要的时间图。通过上图我们可以看出,请求所需的时间是该文档的传输时间加上两倍往返时间RTT。

HTTP/1.0 的主要缺点就是每请求一个文档就需要有两倍RTT 的开销。HTTP/1.1 协议很好的解决了这个问题,它使用了持续连接(persistent connection)。所谓的持续连接就是万维网服务器在发送响应后仍然在一段时间内保持这条连接,使同一个客户和该服务器可以持续在这条连接上进行后续的请求与响应。这并不限于同一个页面上链接文档,而是适用于在同一个服务器上。

HTTP/1.1 协议的持续性连接有两种工作方式,即非流水线方式(without pipelining)和流水线方式(with pipelining)。
        非流水线方式的特点,是客户在收到一个响应后才能发送下一个请求。因此,在TCP 连接建立后,客户每访问一次对象都要用去一个往返时间RTT。这比非持续性连接节省了建立TCP 连接所需要的一个RTT 时间。但是有一个很明显的缺点就是,在服务器发送完一个对象后,TCP 连接就处于空闲状态,浪费了服务器的资源。
        流水线方式的特点,是客户在收到HTTP 的响应报文之前就能够接着发送新的请求报文。于是一个接一个的请求报文到达服务器,服务器就可以连续发挥发回响应的报文数据。因此,使用流水线的方式客户访问所有的对象只需要花费一个RTT 时间。这种方式使TCP 连接中的空闲时间减少,提高了文档下载效率。

3.3HTTP 的报文结构

HTTP 报文有两类:
(1)请求报文:从客户端向服务端发送的报文
(2)响应报文:从服务端返回给客户的报文

HTTP 请求报文和响应报文都是由三部分组成。从上图中可以看出,这两种报文的格式只有开始行是不同的。
        1 ) 开始行:用于区分是请求报文还是响应报文。在请求报文的开始行叫做请求行(Requesr-Line),在响应报文中的开始行叫做状态行(Status-Line)。开始行的三个字段之间使用空格分割开,”CR” 和 “LF” 分别表示回车和换行。
        2 ) 首部行:用来说明浏览器、服务器或报文主题的一些信息。首部可以有多行,但也可以不使用。在每一个首部行都有首部字段名和它对应的值,每一行在结束的时候都要有“回车”和“换行。整个首部结束时,还有一行空行将首部行与后面的实体主题分开。
        3 ) 实体主体:在请求报文中一般不使用这个字段,在响应报文中也可能没有这个字段。

请求报文中的请求行的第一个字段时method,这个method 是面向对象技术中的专有名词。所谓“方法”就是指所请求对象进行的操作,这些方法实际上是一些命令。因此,请求报文的类型是由它所采用的方法决定的。常用的方法如下:

方法意义
OPTION 请求一些选项的信息
GET 请求读取由URL 所标志的信息
HEAD 请求读取由URL 所标志的信息的首部
POST 给服务器添加信息
PUT 在指明的URL 下存储一个文档
DELETE 删除指定的URL 所标志的资源
…… ……


3.4举例

下面通过一个例子来体验一下HTTP 的报文结构,为了更好的演示效果,我使用的是系统自带的IE 浏览器,访问的是百度的主页。下面是请求与响应的相关截图(可以对比上面的报文结构图)。

请求报文
这里写图片描述
常见的请求报头字段解释

  • Accept:用于指定客户端接受哪些类型的信息。
  • Accept-Charset:用于指定客户端接受的字符集。
  • Accept-Encoding:类似于Accept,但是它是用于指定可接受的内容编码。
  • Accept-Language:类似于Accept,但是它是用于指定一种自然语言。
  • Authorization:主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
    - Host(发送请求时,该报头域是必需的):用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。
  • User-Agent:我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息了。
  • If-Modified-Since:和 Last-Modified 一样都是用于记录页面最后修改时间的 HTTP 头信息,只是 Last-Modified 是由服务器往客户端发送的 HTTP 头,而 If-Modified-Since 则是由客户端往服务器发送的头,可 以看到,再次请求本地存在的 cache 页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的 Last-Modified 最后修改时间戳发送回去,这是为了让服务器端进行验证,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则 返回 304 告诉客户端其本地 cache 的页面是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。
  • If-None-Match:它和ETags(HTTP协议规格说明定义ETag为“被请求变量的实体值”,或者是一个可以与Web资源关联的记号)常用来判断当前请求资源是否改变。类似于Last-Modified和HTTP-IF-MODIFIED-SINCE。但是有所不同的是Last-Modified和HTTP-IF-MODIFIED-SINCE只判断资源的最后修改时间,而ETags和If-None-Match可以是资源任何的任何属性,不如资源的MD5等。

响应报文
这里写图片描述
常见的响应报头字段解释

  • Location:用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。
  • Server:包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。
  • Content-Encoding:被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding这样用于记录文档的压缩方法。
  • Content-Language:描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读者。
  • Content-Type:指明发送给接收者的实体正文的媒体类型。
  • Last-Modified:用于指示资源的最后修改日期和时间。
  • Etag:Last-Modified和ETags请求的http报头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生Last-Modified/Etag标记,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。
  • Vary指定了一些请求头域,这些请求头域用来决定当缓存中存在一个响应,并且该缓存没有过期失效,是否被允许去利用此响应去回复后续请求而不需要重验证(revalidation)。对于一个不能被缓存或失效的响应缓存,Vary头域值用于告诉用户代理选择表现形式(reprentation)的标准。一个Vary头域值是“*”意味着缓存不能从后续请求的请求头域来决定合适表现形式的响应。

5 类状态码解析

  • 1××:表示通知消息,如请求收到了或正在进行处理。
  • 2××:表示成功,如接受或知道了。
  • 3××:表示重定向,如要完成请求还要进一步的行动。
  • 4××:表示客户端的错误,如请求中有错误的语法或不能完成。
  • 5××:表示服务器的错误,如服务器失效无法完成请求。

3.5Cookie

上面已经讲到了HTTP 在操作的过程中是无状态的。这样做虽然简化了服务器的设计,但是在实际的工作中,一些站点却常常希望能够识别用户。要做到这点,就要使用到HTTP 中的Cookie。Cookie 原意是“小甜饼”,在这里Cookie 表示在HTTP 服务器和客户之间传递的状态信息。很多网站都使用到了Cookie。

Cookie 的工作方式是这样的:当用户A 浏览某个允许使用Cookie 的网站时,该网站的服务器就会为A 产生一个唯一的识别码,并以此作为索引在服务器的后端数据库中产生一个项目。接着再给A 的HTTP 响应报文中添加一个叫做Set-cookie 的首部行。这里的“首部字段名”就是“Set-cookie”,而后面的“值”就是赋予该用户的“识别码”。

当A 收到响应时,其浏览器就在它管理的特定Cookie 文件中添加一行,其中包括这个服务器的主机名和Set-cookie 后面给出的识别码。当A 继续浏览这个网站时,每发送一个HTTP 请求报文,其浏览器就会在Cookie 文件中取出这个网站的识别码,并放到HTTP 请求报文的Cookie 首部行中。

于是网站就可以跟踪用户A 在该网站的活动。要注意的是,服务器并不需要知道这个用户的真实姓名和其他信息。服务器根据Cookie 信息可以知道用户A 在什么时间访问了哪些页面,以及访问这些页面的顺序。假如当一个用户在一些购物网站上浏览信息,如果该用户在该网站登记过和使用过信用卡消费,那么这个网站就记录了该用户的姓名、信用卡号码等。所以下次当用户继续想在该购物网站购物时,因为浏览器产生的HTTP 请求报文中都携带了同样的Cookie 首部行,服务器就可以利用Cookie 信息识别出该用户,所以就不需要再手动键入自己的姓名、信用卡信息等。这样做显然是很方便的。

到这里你可能也想到了,这样做虽然很方便但是却是不安全的。因为Cookie 中保存了用户的很多信息,这对用户的隐私信息不够保密。但是我们在浏览网站时一般不需要考虑这个问题,这些问题开发者在进行网站开发的时候已经帮我们做了保护。

四、超文本标记语言HTML

要使任何一台计算机都能显示任意一个万维网服务器上的页面,就必须要解决页面制作的标准化问题。超文本标记语言HTML(HyperText Markup Language)就是一种制作万维网页面的标准语言,它消除了不同计算机之间信息交流的障碍。但是需要注意的是HTML 并不是应用层的协议,它只是万维网浏览器使用的一种语言。由于HTML 非常易于掌握且实现简单,因此它很快就成为万维网的重要基础。官方的HTML 由万维联盟W3C 负责制定。因为大家对于它都比较熟悉,所以就不再详细作介绍了。有兴趣可以查阅相关资料做后续深入了解。

参考资料:
《计算机网络》 谢希仁 著
HTTP 请求与响应报头内容详解摘自:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/886640
推荐阅读
相关标签
  

闽ICP备14008679号

        
cppcmd=keepalive&