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 ModifiedIf-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

转载于:https://www.cnblogs.com/xidongyu/p/6130891.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值