HTTP协议

HTTP协议是Web浏览器和Web服务器之间通信的标准协议。对于从客户端到服务器的每个请求,需要进行以下几步:

  • 默认情况下,客户端会建立一个TCP套接字连接到服务器的80端口,在URL中也可以指定其他端口
  • 客户端像服务器发送消息,请求指定路径上的资源
  • 服务器向客户端发送响应。响应以响应码开头,后面是包含元数据的首部,一个空行以及所请求的文档或错误消息
  • 服务器关闭连接

    上面是HTTP1.0的过程。在HTTP1.1及以后版本中,可以通过一个TCP连接连续发送多个请求和响应。同时在HTTP1.1中,请求和相应可以分为多个块发送。

    HTTP请求


    每个请求和响应都应有相同的基本形式:一个请求行,一个包含元数据的HTTP首部,一个空行,最后一个消息体。下面是一个基本的GET请求,每行必须以\r\n结尾

    GET /Index.html HTTP/1.1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)

    Host: www.baidu.com

    Connection: keep-alive

    Accept-Language: en-US,en;1=0.5

    Accept-Encoding: gzip, deflate

    Accept: text/html, application/xhtml+xml, application/xml;q=0.9,*/*;q=0.8

    (空行\r\n)

     

    请求行

    第一行称为请求行,包括一个方法,资源的路径以及HTTP的版本。HTTP有4个主要的方法GET,POST,PUT,DELETE。紧跟着就是请求资源的路径,最后一个客户端支持的HTTP版本

    HTTP首部

    HTTP首部包含了与HTTP协议相关的元数据。格式采用键值对的形式:

    keyword: Value

    关键字不区分大小写。值有时区分大小写,有时也不区分。关键字和值只能是ASCII码

    对于上面的示例,主要解释一下Accept关键字。该关键字用来告诉客户端可以处理哪些数据类型(但是服务器常常忽略这一点)。Accept中的数据类型被称为MIME。MIME分为两级:类型(type)和子类型(subtype)。类型笼统的说明了可以处理哪些数据:图片,文本还是影片。子类型表示数据的特定类型,如GIF图像,JPEG图像,TIFF图像。例如,HTML的内容类型是text/html,那么类型是text,子类型是html。JEPG图像的内容类型是image/jpeg,类型是image,子类型是jpeg。下面是已经定义的几个顶级类型:

  • text/* 表示人可读的文字
  • image/* 表示图片
  • audio/*  表示声音
  • video/*   表示视频
  • applicaton/* 表示二进制数据

    multipart/*   表示多个文档和资源的容器

    可以在http://www.iana.org/assignments/media-types/media-types.xhtml看到已经注册的最新的MIME类型。另外,也可以自由定义非标准的定制类型和子类型,只要它们以x-开头即可。例如,flash文件通常会指定为application/x-shockwave-flash类型

    结束行

    为了向服务器传达请求头部已经结束这样一个信号,必须设置一个标志。这个标志就是最后的空行。

     

    HTTP响应

    http响应的格式和http请求的格式是一致的。下面是一个简单的响应头:

    HTTP/1.1 200 OK

    Date: Sun, 21 Apr 2016 12:12:12 GMT

    Server: Apache

    Connection: close

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

    Content-length: 53

     

    <html>

    <head></head>

    <body>Hello Http!</body>

    </html>

     

    响应行

    首先指定服务器使用的HTTP协议版本。后面是一个响应码,200 OK表示响应成功。

    HTTP首部

    Date:表示请求的日期(采用服务器的时间戳)

    Server:表示服务器软件

    Connection:表示服务器是否会关闭这个连接。如果是close的话,表示服务器会关闭该连接。如果是keep-alive的话,表示服务器会继续维持这个连接,以便其他的http请求也能使用到这个连接进行数据传输。

    Content-Type:表示服务器返回的消息体的数据类型。如果数据类型为text类型,还需指定其编码方式。这里需要注意一点,指明数据编码方式必须要与数据真实的编码方式一致。详情请看链接 http://www.cnblogs.com/xidongyu/p/5305177.html

    Contento-length:表示消息体的长度,单位为字节。对Content-Length的研究请看http://www.cnblogs.com/xidongyu/p/5938888.html

    消息体

    在元数据之后会有一个空行,然后就是服务器返回给客户端的消息体了。消息体通常是html文本,当然还有其他格式。

    响应码

    html中响应码有很多,下面介绍几种常见的响应码。

    响应码和消息 含义
    2XX 请求成功
    200 OK 表示请求成功,请求所希望的响应头或数据体将随此响应返回
    201 Created 服务器已经在响应主体中指定的URL处创建了资源。客户端应当尝试加载该URL。该码只响应POST请求
    202 Accepted 表示请求(一般是POST)已经被接受,但尚未处理或处理尚未结束。多用于服务器端的异步操作
    204 No Content 服务器成功处理的请求,但没有信息发回给客户端
    205 Reset Content 服务器成功处理请求,但没有信息发回给客户端。此外,客户端应当清除发送请求的表单
    206 Partial Content 服务器返回给客户端请求资源的一部分,而不是整个文档。这种情况一般发生在加载大图片的情况下。
    3XX Redirection 重定位及重定向
    301 Move
    Permanently
    资源已经被移动到一个新的URL。客户端应当自动加载这个URL的资源,更新所指向原URL的书签
    302 Move
    Temporarily
    资源临时移动到一个新的URL,但在不久的将来其位置会再次改变。客户端应请求这个新的URL,但不需要更新书签。
    304 Not Modified If-Modified-Since首部要求服务器提供最新的文档。如果文档没有被更新过,服务器会返回该码。这时浏览器会从自己的缓存中加载资源
    4XX Unauthorized 访问这个页面需要身份认证,一般是用户名和密码
    403 Forbidden 服务器能理解的请求,但是有意拒绝进行处理。
    404 Not Found 服务器找不到指定的资源
    405 Method Not
    Allow
    请求的方法不支持指定的资源。例如,向不支持PUT的服务器发送PUT请求
    406 Not Acceptable 所请求的资源不能以客户端希望的格式提供。
    408 Request Timeout 客户端用了太长时间发送请求,可能是因为网络拥塞的原因
    411 Length Required 客户端必须在请求HTTP首部中发送一个Content-Length字段,但是没有做到
    5XX 服务器错误 服务器错误
    500 Internal Server Error 发生了意外情况,服务器不知道如何处理
    502 Bad Gateway 这个响应码只用于作为代理或网关的服务器。它指示该代理在试图完成请求时,从它连接的服务器接受到一个无效的响应。
    503 Service Unavailable 服务器暂时无法处理请求,可能是超负荷或维护原因
    504 Gateway Timeout 代理服务器在合理的时间内未能接收到上游服务器的响应,所以无法向客户端发送所需的相应

    无论哪个版本,响应码100到199总表示一个提供信息的相应,200到299总指示成功,300到399表示重定向,400到499总是指示一个客户端错误,500到599总表示一个服务器错误。

    Cookie

    因为HTTP是无状态的协议,但是为了记录客户端的一些状态,就是用了Cookie。cookie位于请求和响应的首部,先从服务器传递到客户端,再从客户端传递到服务器。cookie可以用来指示会话ID,购物车内容,登陆凭据和用户首选项。

    要在浏览器中设置一个cookie,服务器必须在HTTP首部包含一个Set-Cookie首部行来告知浏览器。例如:下面HTTP首部将cookie“cart”的值设置为"ATVPKIKI0RED”

    HTTP/1.1 200 OK

    Content-Type: text/html

    Set-Cookie: cart=ATVPKIKI0RED

    Accept: text/html

    如果这时浏览器向服务器发起请求的话,它会在HTTP请求行中的Cookie行中发回这个cookie

    GET /index.html HTTP/1.1

    Host: www.example.org

    Cookie: cart=ATVPKIKI0RED

    Accept: text/html

    服务器可以设置多个cookie,即在响应首部可以出现多个Set-Cookie字段

    Cookie的作用域

    Cookie最简单的方式就是只采用一个键值对来标记。当然它也可以加入其他的一些属性来控制它们的作用域,包括cookie的时效性,路径,域,端口,版本和安全选项。

    例如,默认情况下,cookie来自哪个服务器就应用于哪个服务器。如一个cookie由www.xdysite.cn设置,浏览器就应把这个cookie发回给www.xdysite.cn。不过可以设置将cookie作用于整个域。下面这个为整个xdysite.cn域设置一个用户cookie。

    Set-Cookie: user=dy;Domain=.xdysite.cn

    这样设置后浏览器不只是把这个cookie回送给www.xdysite.cn,同时它也会把这个cookie发送到该域的其他服务器上。

    路径

    指定cookie在某些路径上有效,如果切换到其他路径上则cookie就无效了。默认的作用域是最初的URL和其所有子目录。例如:如果为URL http://www.xdysite.cn/XOM设置了一个cookie,那么这个cookie还可以应用于htt://www.xdysite.cn/XOM/apidocs/,但不能应用于httP://www.xdysite.cn/slides。不过可以使用Path属性来改变默认的作用域。例如,下面的响应中的cookie只能应用于服务器的/test目录及其子目录,而不能应用去网站的其他部分。

    Set-Cookie: user=xdy; Path=/test

    过期时间

    通过expires属性可以设置cookie的过期时间,时间格式为“Wdy, DD-Mon-YYYY, HH:MM:SS GMT”。还有一种格式为Max-Age,后面跟的秒数,表示多少秒之后cookie过期。

    Set-Cookie: user=xdy;expires=Wed, 21-Dec-2015 15:23:00 GMT

    Set-Cookie: user=xdy;Max-age=3600

    安全

    当cookie中包含敏感信息时,应该在cookie中添加secure属性,来告诉浏览器只有使用HTTPS时才回传cookie。

    Set-Cookie: key=passwd;Domain=.xdysite.cn;secure

  • posted @ 2016-12-04 15:22  被罚站的树  阅读(492)  评论(0编辑  收藏  举报