在了解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

超文本传输协议HTTP相关推荐

  1. Servlet - HTTP超文本传输协议

    HTTP (超文本传输协议) 超文本传输协议(HTTP)是用于协作.分布式.超媒体信息系统的应用级协议.它是用于建立客户端和服务器之间通信的数据通信协议.   HTTP协议是基于TCP/IP的通信协议 ...

  2. HTTP协议(HyperText Transfer Protocol,超文本传输协议)

    HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准. HTTP是一个基于TCP/IP通信 ...

  3. 吾解——HTTP(超文本传输协议)

    今天拜读了一本<图解HTTP>,将HTTP总结一下. HTTP(超文本传输协议):一种规则 1.定义:一个简单的请求-响应协议,它通常运行在TCP之上.它指定了客户端可能发送给服务器什么样 ...

  4. 计算机网络技术超文本,网络协议确定了计算机网络传递和管理信息的规范,其中HTTP属于()A、超文本传输协议B、传输控制协...

    网络协议确定了计算机网络传递和管理信息的规范,其中HTTP属于()A.超文本传输协议B.传输控制协 更多相关问题 尿血证常见的病因病机有______.脾不统血.______.脾肾两虚.______. ...

  5. http超文本传输协议

    http简介 超文本传输协议(HyperText Transfer Protocol),详细规定浏览器和万维网之间互相通信的规则,是万维网交换信息的基础,允许将HTML文档从Web服务器传送到Web服 ...

  6. 超文本传输协议及HTTP包

    HTTP协议用于在Internet上发送和接收消息.HTTP协议是一种请求-应答式的协议 --客户端发送一个请求,服务器返回该请求的应答,所有的请求与应答都是HTTP包.HTTP协议使用可靠的TCP连 ...

  7. 王道考研 计算机网络20 应用层 客户端/服务器C/S模型 P2P模型 DHCP协议 域名解析系统DNS 文件传送协议FTP 万维网 超文本传输协议HTTP

    应用层概述 FTP:文件传输协议(File Transfer Protocol)是用于在网络上进行文件传输的一套标准协议. SMTP:是一种提供可靠且有效的电子邮件传输的协议. POP3 ,全名为&q ...

  8. 网络(7)-HTTP(HyperText Transfer Protocol,超文本传输协议)

    http是一个简单的请求-响应协议,它通常运行在TCP之上.它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应.请求和响应消息的头以ASCII码形式给出:而消息内容则具有一个类似MIME的 ...

  9. Hyper Text Transfer Protocol(超文本传输协议)

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  10. HTTP(超文本传输协议)

    HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,HTTP协议定义了浏览器(即万维网客户进程)怎样向万维网(WWW:World Wide Web )服务器 ...

最新文章

  1. hdu3006 状态压缩+位运算+hash(小想法题)
  2. mysql istransient_由于 MySQL 版本问题导入报错
  3. 对URLEncode的解码
  4. arm Linux 中断管理机制
  5. Sublime介绍安装和使用(转载)
  6. 后面的 飞鸽传书 l代表lock
  7. Qt文档阅读笔记-Broadcast Sender Example解析
  8. argument list too long 错误的处理
  9. checkValidity()验证输入信息合法性,自定义错误提示信息方法及误区
  10. paip.提升用户体验---c++ 右键菜单以及socket接口
  11. 深入学习MyBatis中的参数
  12. python迷宫地图代码_用Python代码来解图片迷宫的方法整理
  13. 颜色的RGB数字表示方法
  14. 数位动态规划:Windy数
  15. ImageView 加载本地(手机)图片
  16. 学生选课系统E-R图以及登录,选课流程图
  17. 消息队列消息丢失和消息重复发送的处理策略
  18. 马云内部邮件:新入职员工勿批判公司
  19. excel中设置每行等高
  20. 如何让Chrome在隐身(无痕)模式下使用扩展程序

热门文章

  1. 1946年第一台计算机在哪个国家面试,面试问题 计算机
  2. vue导出js中的函数_js中的函数
  3. mysql mod如何使用_MySQL MOD()用法及代码示例
  4. Python爬虫案例:爬取必应壁纸
  5. java设计模式--装饰器设计模式(javaIO设计使用)
  6. 微信公众号迁移,认证; 名称触发商标怎么办
  7. 黑客电影预言或成真,英国核潜艇安全问题堪忧
  8. 今年的第几天?(p16)模拟
  9. 搭建jpress个人博客
  10. 笛卡尔坐标为什么叫Cartesian coordinate而不是Descartes coordinate?