zoukankan      html  css  js  c++  java
  • HTTP协议

    一、什么是HTTP协议

    HTTP协议(Hyper Text Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的协议,所有的WWW文件都必须遵循这个标准,工作在应用层。

    HTTP是一个基本TCP/IP通信协议来传递数据(HTML文件、图片、查询结果等)。是WWW(万维码)服务器传输超文本到本地浏览器的传输协议。

    二、HTTP协议的工作原理

    粗:HTTP协议工作于客户端和服务器端架构之上,浏览器作为HTTP客户端通过URLHTTP服务器端即WEB服务器发送所有请求;

    Web服务器有:apache服务器和IIS服务器;

    Web服务器根据接收到的请求后,向客户端发送请求信息;

    HTTP的默认端口号是80,但你也可以改为8080或其它端口。

    细:HTTP工作过程

    一次HTTP操作称为一个事务,其工作整个过程如下:

    1、地址解析

    如用客户端浏览器请求这个页面:http:/localhost.com:8080/index.html

    从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:

    协议名:http

    主机名:localhost.com

    端口:8080

    对象路径:/index.html

    在这步中,需要域名系统DNS解析域名localhosr.com,得主机的IP地址。

    2、封装HTTP请求数据包

    把以上部分结合本机自己的信息,封装成一个HTTP请求数据包

    3、封装成TCP包,建立TCP连接(TCP的三次握手)

    HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的HTTP是比TCP更高层次的应用层协议,根据规则,只有在底层协议建立连接之后才能进行更高协议的连接,所以,首先要建立TCP连接。一般TCP连接的端口号是80。这里是8080端口。

    4、客户机发送请求命令

    5、服务器响应

    6、服务器关闭TCP连接

     

    三、HTTP的三点注意事项

    a) HTTP是无连接的:无连接的含义是限制每个连接只处理一个请求。服务器处理完客户端的请求,并受到客户端的回答后,即断开连接。

    b) HTTP是无状态的:HTTP是无状态协议,无状态是指协议对于事务处理没有记忆能力。缺乏状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次的传输量较大。另一方面,在服务器不需要先前信息是应答也就快了。

    c) HTTP是媒体独立的:这意味着只要客户端和服务器端知道怎么处理数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定合适的MIME-Type内容类型。

     

    四、HTTP消息结构

    a) HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。

    b) 一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的

    c) 一个HTTP"服务器"同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器等),通过接收客户端的请求并向客户端发送HTTP响应数据

    d) HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。

    e) 一旦建立连接后,数据消息就通过类似Internet邮件所使用的格式[RFC5322]和多用途Internet邮件扩展(MIME[RFC2045]来传送。

    五、客户端请求消息

    客户端发送一个请求到服务端的请求消息包括以下内容:请求行(request line)、请求头部(header)、空行和请求数据。下图给出了请求报文的一般格式。

     

    如:

     

    请求行: 

    请求的第一行是“方法  URL  协议/版本”,并以 回车换行作为结尾。请求行以空格分隔。格式如下:POST  /index.php  HTTP/1.1

    URL完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头

    请求行方法:

    HTTP1.0定义了三种方法:getposthead

    HTTP1.1新增了五种方法:optionsputdeletetraceconnect

    重点介绍 GETPOST 和 HEAD 三个方法:

    1get方法

     GET方法是默认的HTTP请求方法,例如当我们通过在浏览器的地址栏中直接输入网址的方式去访问网页的时候,浏览器采用的就是 GET 方法向服务器获取资源。

    我们可以使用GET方法来提交表单数据,用GET方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患上。例如:
             Http://localhost/login.php?username=aa&password=1234

    上面的URL请求中,很容易就可以辩认出表单提交的内容。(?之后的内容)另外由于GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大。这是因为浏览器对url的长度有限制。

    (2)post方法

    POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。 在请求头信息结束之后的两个回车换行之后(实际是空一行),就是表单提交的数据。如上面提到的post表单数据:

            username=aa&password=1234

     POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。

     GETPOST方法有以下区别:

    1、  在客户端,Get方式在通过URL提交数据,数据在URL中可以看到POST方式,数据放在HTTP包的body

    2、GET方式提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST则没有此限制。

    3、安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。

    4、服务器取值方式不一样。GET方式取值,如php可以使用$_GET来取得变量的值,而POST方式通过$_POST来获取变量的值。

    (3)Head

    HEAD 方法与 GET 方法几乎是相同的,它们的区别在于 HEAD 方法只是请求消息报头,而不是完整的内容。对于 HEAD 请求的回应部分来说,它的 HTTP 头部中包含的信息与通过 GET 请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到 Request-URI 所标识的资源的信息。这个方法通常被用于测试超链接的有效性,是否可以访问,以及最近是否更新。

    请求头部:

    每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。

    HTTP最常见的请求头如下:

    Transport 头域

    Connection

    作用:表示是否需要持久连接。

    如果服务器看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,服务器需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小;

    例如: Connection: keep-alive   当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的  网页,会继续使用这一条已经建立的连接

    例如:  Connection: close  代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,  当客户端再次发送Request,需要重新建立TCP连接。

    Host(发送请求时,该报头域是必需的)

    作用:Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。

    eghttp://localhost/index.html
    浏览器发送的请求消息中,就会包含Host请求报头域,如下:
    Hostlocalhost

    此处使用缺省端口号80,若指定了端口号8080,则变成:Hostlocalhost:8080

    Client 头域

    Accept

    作用:浏览器可以接受的媒体类型(MIME类型)

    例如:  Accept: text/html  代表浏览器可以接受服务器回发的类型为 text/html  也就是我们常说的html文档如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)

    通配符 代表任意类型。例如  Accept: */*  代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)

    Accept-Encoding

    作用: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzipdeflate),(注意:这不是只字符编码);

    例如: Accept-Encoding: gzip, deflateServer能够向支持gzip/deflate的浏览器返回经gzip或者deflate编码的HTML页面。 许多情形下这可以减少510倍的下载时间,也节省带宽。

    Accept-Language

    作用: 浏览器申明自己接收的语言。

    语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5gb2312gbk等等;

    例如: Accept-Language:zh-cn 。如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。

    User-Agent

    作用:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本.

    我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上, 服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。

    例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

    Accept-Charset

    作用:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312utf-8(通常我们说Charset包括了相应的字符编码方案);

    例如:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

    Authorization:

    授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中

    Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。

    Cookie/Login 头域

    Cookie:

    作用: 最重要的header, cookie的值发送给HTTP 服务器

    Entity头域

    Content-Length

    作用:发送给HTTP服务器数据的长度。即请求消息正文的长度;

    例如: Content-Length: 38

    Content-Type

    作用:

    例如:Content-Type: application/x-www-form-urlencoded

    Miscellaneous 头域

    Referer:

    作用: 提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里, 他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问    他的网站。

    例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

    Cache 头域

    If-Modified-Since

    作用: 把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。

    例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT

    If-None-Match

    作用: If-None-MatchETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag.  使用这样的机制将提高网站的性能

    例如: If-None-Match: "03f2b33c0bfcc1:0"

    Pragma

    作用: 防止页面被缓存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样

    Pargma只有一个用法, 例如: Pragma: no-cache

    注意HTTP/1.0版本中,只实现了Pragema:no-cache, 没有实现Cache-Control

    Cache-Control

    作用这个是非常重要的规则。 这个用来指定Response-Request遵循的缓存机制。各个指令含义如下

    Cache-Control:Public   可以被任何缓存所缓存()

    Cache-Control:Private     内容只缓存到私有缓存中

    Cache-Control:no-cache  所有内容都不会被缓存

    六、服务器响应信息

    在接收和解释请求消息后,服务器会返回一个 HTTP 响应消息。与 HTTP 请求类似,HTTP 响应也是由四个部分组成,分别是:状态行、消息报头、空行和响应正文。如:

    如:

    HTTP/1.1 200 OK

    Date: Sun, 17 Mar 2013 08:12:54 GMT

    Server: Apache/2.2.8 (Win32) PHP/5.2.5

    X-Powered-By: PHP/5.2.5

    Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/

    Expires: Thu, 19 Nov 1981 08:52:00 GMT

    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

    Pragma: no-cache

    Content-Length: 4393

    Keep-Alive: timeout=5, max=100

    Connection: Keep-Alive

    Content-Type: text/html; charset=utf-8

    <html>

    <head>

    <title>HTTP响应示例<title>

    </head>

    <body>

    Hello HTTP!

    </body>

    </html>

    1、状态行

    态行由协议版本、数字形式的状态代码,及相应的状态描述组成,各元素之间以空格分隔,结尾时回车换行符,格式如下:

    HTTP-Version Status-Code Reason-Phrase CRLF

    TTP-Version 表示服务器 HTTP 协议的版本,Status-Code 表示服务器发回的响应代码,Reason-Phrase 表示状态代码的文本描述,CRLF 表示回车换行。例如:

    HTTP/1.1 200 OK (CRLF)

     状态代码由 位数字组成, 表示请求是否被理解或被满足,状态描述给出了关于状态码的简短的文字描述。状态码的第一个数字定义了响应类别,后面两位数字没有具体分类。第一个数字有 种取值,如下所示。

    1xx:指示信息——表示请求已经接受,继续处理

    2xx:成功——表示请求已经被成功接收、理解、接受。

    3xx:重定向——要完成请求必须进行更进一步的操作

    4xx:客户端错误——请求有语法错误或请求无法实现

    5xx:服务器端错误——服务器未能实现合法的请求。

    常见状态代码、状态描述、说明:
    200 OK      //客户端请求成功
    400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
    401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
    403 Forbidden  //服务器收到请求,但是拒绝提供服务
    404 Not Found  //请求资源不存在,eg:输入了错误的URL
    500 Internal Server Error //服务器发生不可预期的错误
    503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

    2、响应头信息

    HTTP最常见的响应头如下所示:

    Cache头域

    Date

    作用:生成消息的具体时间和日期,即当前的GMT时间。

    例如: Date: Sun, 17 Mar 2013 08:12:54 GMT

    Expires

    作用浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候认为文档已经过期,从而不再缓存它。

    例如: Expires: Thu, 19 Nov 1981 08:52:00 GMT

    Vary:

    例如: Vary: Accept-Encoding

    Cookie/Login 头域

    P3P

    作用用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题

    例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

    Set-Cookie

    作用: 非常重要的header, 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie.

    例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/

    Entity实体头域:

     实体内容的属性,包括实体信息类型,长度,压缩方法,最后一次修改时间,数据有效性等。

    ETag

    作用:  If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)

    例如: ETag: "03f2b33c0bfcc1:0"

    Last-Modified

    作用: 用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例)

    例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT

    Content-Type

    作用:WEB服务器告诉浏览器自己响应的对象的类型和字符集,

    例如:

            Content-Type: text/html; charset=utf-8

      Content-Type:text/html;charset=GB2312

      Content-Type: image/jpeg

    Content-Length

    作用:指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。

    例如: Content-Length: 19847

    Content-Encoding

    作用:文档的编码(Encode)方法。一般是压缩方式。

    WEB服务器表明自己使用了什么压缩方法(gzipdeflate)压缩响应中的对象。利用gzip压缩文档能够显著地减少HTML文档的下载时间。

    例如:Content-Encodinggzip

    Content-Language

    作用: WEB服务器告诉浏览器自己响应的对象的语言者

    例如: Content-Language:da

    Miscellaneous 头域

    Server

    作用:指明HTTP服务器的软件信息

    例如:Apache/2.2.8 (Win32) PHP/5.2.5

    X-Powered-By

    作用:表示网站是用什么技术开发的

    例如: X-Powered-By: PHP/5.2.5

    Transport头域

    Connection

    例如: Connection: keep-alive   当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

    例如:  Connection: close  代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

    Location头域

    Location

    作用: 用于重定向一个新的位置, 包含新的URL地址

    实例请看304状态实例

    HTTP协议是无状态的和Connection: keep-alive的区别

    无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。

    HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。

    HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。

    Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。

    3、响应正文:

    响应正文就是服务器返回的资源的内容,响应头和正文之间也必须用空行分隔。如:

    <html>

    <head>

    <title>HTTP响应示例<title>

    </head>

    <body>

    Hello HTTP!

    </body>

    </html>

  • 相关阅读:
    素数推断算法(高效率)
    Hibernate的fetch
    TRIZ系列-创新原理-22-变害为利原理
    Offer是否具有法律效力?
    浅谈C++多态性
    C语言scanf函数详解
    大话设计模式之原型模式
    Android源码文件夹结构
    简单的REST的框架实现
    android startActivityForResult的用法
  • 原文地址:https://www.cnblogs.com/wbxjiayou/p/5157370.html
Copyright © 2011-2022 走看看