HTTP协议详解

学习来源:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html#httprequestheader


1. HTTP消息的结构

HTTP消息具体可划分为Request消息和Response消息。

1.1 Request消息结构

Request LineMethod,path to resource,Http/Version number
Request HeaderHeader name:value
 分隔Header和Body的空白行
Body 

Request Line:

  1.method:表示请求方法,比如“POST”和“GET”。

  2.path to resource:表示请求的资源。

  3.Http/Version number:表示Http协议的版本号。

  例如:GET http://www.cnblogs.com/ HTTP/1.1

Request Header:

Request Header内容很多,按照Fiddle大致可以分为以下几类:

  1.Cache头域

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

    If-None-Match:和ETag一起工作。在Response中添加Etag信息,当用户再次请求该资源时,就将ETag的值赋给Request中的If-None-Match。如果服务器验证资源的ETag没有改变,就返回304告诉客户端使用本地缓存文件。否则就返回200和新的文件和ETag。这种机制可以提高网站的性能。

    Pragma:通过设置Pragma:no-cache来防止页面被缓存,和Http/1.1版本中新增的Cache-Control:no-cache作用一样。

    Cache-Control:用于指定Response-Request遵循的缓存机制。值为public时表示能被缓存到任何缓存中,值为private时表示内容只缓存到私有缓存中,值为no-cache时表示所有内容都不会被缓存。

  2.Client头域

    Accept:用于表明浏览器端可以接收的媒体类型。如果服务器无法返回Accept指定的文件类型,就会返回一个406错误(non acceptable)。这里一般会设置为接受所有文件类型:Accept:*/*

    Accept-Encoding:用于表明浏览器接受的编码方法,通常用于指定压缩方法、是否支持压缩以及支持什么压缩方法(而不是字符集编码)。例如,Accept-Encoding:gzip,deflate

    Accept-Language:用于表明浏览器接收的语言(而不是字符集编码)。

    User-Agent:用于表明客户端使用的操作系统、浏览器的名称和版本。

    Accept-Charset:用于表明浏览器接收的字符集。

  3.Cookie/Login头域

    Cookie:将Cookie的值发送给HTTP服务器

  4.Entity头域

    Content-Length:用于指明发送给服务器的数据的长度

    Content-Type:

  5.Miscellaneous头域

    Referer:向服务器提供Request的上下文信息,用于告诉服务器客户端是从哪个链接过来的。例如,主页A有服务器S的链接,当在客户端C浏览A并点击S的链接时,该次Request的Refer值即为A

  6.Transport头域

    Connection:值为keep-alive和close

    Host:用于指定被请求资源的Internet主机和端口号,该信息一般是从URL中提取出来的,在发送请求时,该信息是必须的。

Body:请求消息的body一般是存放一些请求的参数

  

1.2 Response消息结构

Response LineHttp/version number,status code,message
Response Headerheader name:value
 分隔Header和Body的空白行
Body 

Response Line:

  1.Http/version number:表示Http协议版本号。

  2.status code:表示Http状态码,用来告诉客户端Http服务器是否产生了预期的Response。

  3.message:表示Http状态消息。

  例如:Http/1.1  200  OK

Response Header:

  1.Cache头域:

    Date:指明生产消息的具体时间和日期。

    Expires:用于指定过期时间,浏览器会在指定过期时间内使用本地缓冲。

    Vary:

  2.Cookie/Login头域:

    P3P:用于跨域设置Cookie,这样做可以解决iframe跨域访问Cookie的问题。例如,P3P:CP=CURa ADMa DEVa PSAo

    Set-Cookie:用于把Cookie发送到客户浏览器,每一个写入Cookie都会生产一个Set-Cookie

  3.Entity头域:

    Etag:和If-None-Match配合使用

    Last-Modified:用于指示资源的最后修改日期和时间

    Content-Type:服务器告诉浏览器自己响应的对象的类型和字符集

    Content-Length:指明实体正文的长度,用字节方式存储的十进制数字表示。

    Content-Encoding:服务器表明自己使用了什么压缩方法来压缩响应中的对象。例如,gzip,deflate

    Content-Language:服务器告诉浏览器自己响应的对象的语言者

  4.Miscellaneous头域:

    Server:用于指明HTTP服务器的软件信息。例如,Server:Microsoft-IIS/7.5

    X-AspNet-Version:如果网站是用ASP.NET开发的,这个属性表示相应ASP.NET的版本

    X-Powered-By:用于指明网站是用什么技术开发的,例如,X-Powered-By:Asp.Net

  5.Transport头域:

    Connection:

      值为keep-alive时,表示当打开一个网页后,客户端可服务端之间用于传输Http数据的TCP连接不会关闭,当再次访问这个服务器上的网页时,使用上次建立的连接。

      值为close时,表示一个Request完成后,客户端和服务端之间用于传输Http数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。

  6.Location头域:

    Location:用于重定向一个新的位置,包含新的URL。

Body:回复消息的body一般存放Html文档


2. HTTP状态码

Response消息的第一行又叫做状态行,由HTTP协议版本号、状态码、状态信息三部分组成。

HTTP/1.1中定义了5类状态码:

1XX:提示信息,表示请求已被成功接收,继续处理

2XX:成功,表示请求已被成功接收,理解,接受

3XX:重定向,表示要完成请求必须做更进一步处理

4XX:客户端错误,表示请求有语法错误或者请求无法实现

5XX:服务端错误,表示服务器未能实现合法的请求

常见的状态码+状态信息有:

  200 OK:成功,请求被成功地完成,所请求的资源已发送回客户端

  302 Found:重定向,新的URL会在Response中的Location中返回,浏览器会自动使用该URL发出新的Request

  304 Not Modified:无变动,文件已缓存,可以继续使用

  400 Bad Request:客户端请求有语法错误,无法被服务器理解

  403 Forbidden:服务器收到请求,但是拒绝提供服务

  404 Not Found:请求资源不存在(可能是输错了URL)

  500 Internal Server Error:服务器发生了不可预期的错误

  503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常


3. HTTP是基于TCP的,但也是无状态的

HTTP是一个无状态的面向连接的协议。

无状态:

  1.表示Http协议对事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,两次打开一个服务器上的网页之间是没有任何联系的。

  2.不表示HTTP协议不能保持TCP连接,更不能因为HTTP是无状态的就说他是基于UDP的。

面向连接:是指在双方进行Http信息传递之前,需要先建立连接

从HTTP/1.1开始,默认设置Connection:Keep-Alive,以保持连接性。

 

转载于:https://www.cnblogs.com/zhengmengen/p/7699775.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值