Http协议介绍

来源:互联网 发布:mac os升级不支持银联 编辑:程序博客网 时间:2024/06/15 18:23

    最近在对应用的网络框架进行重构,那么就需要对http有一个深刻详细的了解,现在对http协议进行一个简单的总结。

Http的特点


  • 支持客户/服务器模式。

  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

  • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

  • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

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

    Http主要有两部分组成:请求响应。客户端往服务端发送一个请求,将所有的信息包含在一个请求报文里。而服务端应答客户端的时候,通过一个响应包来进行应答。下面对请求报文与响应报文进行分析。


下面抓取手机上的一个请求报文与响应报文来进行分析。

请求报文


    整个请求报文如下

POST /mic/relocation/v3/user/1285701722/record HTTP/1.1Content-Type: application/x-www-form-urlencodedCookie: serviceToken=2.0&V1_micloud&1:NMIdyt5kgHcy2CpX3wWJFg:zGa0bX04zBH1CaG5WqiTFvgopP4thLXENLH+dl1zW78Xgyhoyepyn5ynLMmSFHciERfn9ROwyDhj2RdOvDjQF4s57jSPo7+25d4QZPz1eUi2UOojObI2DQyX604YVk4jQzYT+ykvilYVHRXFkckmqJ6+8XLj0PUAsHwwrTMKAXj0wAutUPAtDtZQk/sLE7AdB29jvtchwUrdEZ9dD4R4ww==&ey7RrpgxnZfO7KxdnbwMbw==; userId=1285701722Accept-Encoding: gzipX-XIAOMI-SUPPORT-REDIRECT: trueAccept-Language: zh_CNContent-Length: 40Host: relocationapi.micloud.xiaomi.netConnection: Keep-AliveUser-Agent: DUOKANREADER; Android/4.5.7signature=w7R3ll0oGghF4ZFUljqJkIjsH5Y%3D

    请求报文可分为三部分组成:请求行、请求头和请求正文三部分组成,下面针对上面的包进行分析。

请求行

POST /mic/relocation/v3/user/1285701722/record HTTP/1.1

请求行分为三部分组成,请求方法、请求路径和请求http版本信息

请求方法包括GET、PUT、DELETE、POST等方法,上面请求行的表示此次请求的方法为POST

请求路径,上面请求行表示的路径为/mic/relocation/v3/user/1285701722/record,它与请求头中的域名组合完整的路径(如我们在浏览器的地址栏中看到的就是完整的路径)

http版本信息,上面表示的是HTTP/1.1


请求头

Content-Type: application/x-www-form-urlencodedCookie: serviceToken=2.0&V1_micloud&1:NMIdyt5kgHcy2CpX3wWJFg:zGa0bX04zBH1CaG5WqiTFvgopP4thLXENLH+dl1zW78Xgyhoyepyn5ynLMmSFHciERfn9ROwyDhj2RdOvDjQF4s57jSPo7+25d4QZPz1eUi2UOojObI2DQyX604YVk4jQzYT+ykvilYVHRXFkckmqJ6+8XLj0PUAsHwwrTMKAXj0wAutUPAtDtZQk/sLE7AdB29jvtchwUrdEZ9dD4R4ww==&ey7RrpgxnZfO7KxdnbwMbw==; userId=1285701722Accept-Encoding: gzipX-XIAOMI-SUPPORT-REDIRECT: trueAccept-Language: zh_CNContent-Length: 40Host: relocationapi.micloud.xiaomi.netConnection: Keep-AliveUser-Agent: DUOKANREADER; Android/4.5.7

    Content-Type:表示客户端上传内容类型,用于告诉服务端如何去解析数据,例如上面的application/x-www-form-urlencoded表示客户端上传的是键值对的数据格式。常用的格式如下

    text/html: HTML格式    text/plain :纯文本格式          text/xml:  XML格式    image/gif:gif图片格式        image/jpeg:jpg图片格式     image/png:png图片格式    application/xml: XML数据格式    application/atom+xml:Atom XML聚合格式        application/json: JSON数据格式

    Cookie:一般可用来进行身份验证,如上面的cookie信息包含userId=1285701722应该就是用来进行身份验证的

    Accept-Encoding:可接受的数据编码格式,gzip表示客户端支持服务端返回gzip格式的数据编码,通过压缩可以节省带宽和时间。

    X-XIAOMI-SUPPORT-REDIRECT:自定义的header字段;

    Accept-Language:表示客户端支持的语言,或者说是希望服务端返回的语种。例如上面表示的是希望服务端返回简体中文;

    Content-Length:表示请求正文的长度

    Host:http1.1新增,必须存在,否则返回404;主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。

    Connection:在http1.1中,client和server都是默认对方支持长链接的。Keep-Alive指客户端与服务端建立连接发完数据之后不断开,下次访问同一个地址时,复用之前建立的链接;close表示每次发完数据都断开链接,每次都需要重新建立链接再进行发送数据。

    User-Agent:告诉服务器客户端版本以及系统版本。

    Last-Modified/If-Modified-Since:表示数据发生变化的最后日期,若多次请求统一数据,服务器上的数据与客户端上一次请求的数据并没有发生改变,则服务器返回304,而不重新再次发送数据,客户端读取本地缓存。服务端假定了客户端有缓存,所以必须在客户端有缓存的情况下才包含此字段。

    ETag/If-None-Match:ETag 是实现与Last-Modified/If-Modified-Since同样的功能的另一种方法,在第二次请求相同的数据时,你需要在 If-None-Match: 头信息中包含 ETag hash,如果数据没有改变,服务器将返回 304 状态代码。与最近修改数据检查相同,服务器仅仅 发送 304 状态代码;第二次将不为你发送相同的数据。在第二次请求时,通过包含 ETag hash,你告诉服务器:如果 hash 仍旧匹配就没有必要重新发送相同的数据,因为你还有上一次访问过的数据。

请求正文


signature=w7R3ll0oGghF4ZFUljqJkIjsH5Y%3D

    POST方法请求时,服务端会解析请求内容的数据。GET方法请求正文一般为空。


响应报文


整个响应报文如下,

HTTP/1.1 200 OKServer: TengineDate: Tue, 11 Jul 2017 08:27:49 GMTContent-Type: application/json; charset=utf-8Transfer-Encoding: chunkedConnection: keep-aliveX-XIAOMI-STATUS-CODE: 200Content-Encoding: gzipVwK9hR8d6/rrS/ECBpsRCsvbQnoVTtwe/NUcAn6Cid9+JvHAss3xbFMjUNUCjfpBIoV62AYP7F6oxXxzOQyrZwMmfFBsFbKN/KIWMiT41U6div8QzpI6nbzrO71czJ8YCq8bi4o1HY7dfJUk80N7ys/VDZ6IxaVBCISWVVFBQMqHMk9M+VtRv2C07dAHobcRD+Lv/gdHz88sXiCYCSsB1rJcS5LdGrX

    响应报文由状态行、响应头和响应正文组成;

状态行

HTTP/1.1 200 OK

状态行由http版本、状态码和状态码描述组成
HTTP/1.1 表示当前http版本
200 状态码,表示请求成功,
OK 对请求成功状态码200的描述

其中最重要的是状态码,一般请求都是通过判断状态码来判断请求的状态,状态码分为以下几类,

1XX 提示信息 - 表示请求已被成功接收,继续处理
2XX 成功 - 表示请求已被成功接收,理解,接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求无法实现
5XX 服务器端错误 - 服务器未能实现合法的请求

常见的状态码:
200 表示请求成功
403 表示服务器接收到请求,但是拒绝提供服务(认证失败)
404 表示请求资源不存在
500 表示服务器内部错误

响应头

Server: TengineDate: Tue, 11 Jul 2017 08:27:49 GMTContent-Type: application/json; charset=utf-8Transfer-Encoding: chunkedConnection: keep-aliveX-XIAOMI-STATUS-CODE: 200Content-Encoding: gzip

    Server:表示服务器应用程序软件的名称和版本

    Date:表示生成消息的具体时间和日期

    Content-Type:表示返回的数据类型,如上面表示的是返回的数据格式是json,字符集是utf-8,因为服务端对数据进行了二次编码,导致响应正文中无法直观地看出是json格式

    Transfer-Encoding:传输编码,chunked表示分块编码,了解详情点击

    Connection:在http1.1中,client和server都是默认对方支持长链接的。Keep-Alive指客户端与服务端建立连接发完数据之后不断开,下次访问同一个地址时,复用之前建立的链接;close表示每次发完数据都断开链接,每次都需要重新建立链接再进行发送数据。

    X-XIAOMI-STATUS-CODE:自定义的字段

    Content-Encoding:表示响应正文使用的数据压缩格式

    Content-Length:表示响应正文的长度

还有其他一些Header信息也是我们需要关心的,

    Cache-Control:指定Response-Request遵循的缓存机制

max-age=[秒] — 执行缓存被认为是最新的最长时间。类似于过期时间,这个参数是基于请求时间的相对时间间隔,而不是绝对过期时间,[秒]是一个数字,单位是秒:从请求时间 开始到过期时间之间的秒数。
s-maxage=[秒] — 类似于max-age属性,除了他应用于共享(如:代理服务器)缓存
public — 标记认证内容也可以被缓存,一般来说: 经过HTTP认证才能访问的内容,输出是自动不可以缓存的;
no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据 的应用(不惜牺牲使用缓存的所有好处);
no-store — 强制缓存在任何情况下都不要保留任何副本
must-revalidate — 告诉缓存必须遵循所有你给予副本的新鲜度的,HTTP允许缓存在某些特定情况下返回过期数据,指定了这个属性,你高速缓存,你希望严格的遵循你的规则。
proxy-revalidate — 和 must-revalidate类似,除了他只对缓存代理服务器起作用
举例:
Cache-Control: max-age=3600, must-revalidate

    Expires:表示过期时间,HTTP头信息Expires属性是HTTP控制缓存的基本手段,这个属性告诉缓存器,相关副本在多长时间内是新鲜的。

原创粉丝点击