文档章节

HTTP报文

nao
 nao
发布于 2015/03/03 20:18
字数 1853
阅读 634
收藏 14

    第一次看HTTP报文时,理解不是很深刻,只是有了一个基本的概念,当看了cowboy(Web 服务器)中的相关源代码后,觉得对其中的HTTP报文概念理解不是很明了,反过来带着问题再去看HTTP报文的相关概念时,就感觉清楚了很多,但还是有一点问题没有明白,再去看看代码,看看理论,会明白的……

把其中用到的相关知识点整理如下:

  1. 报文的组成部分

    HTTP报文是简单的格式化数据块。

    HTTP报文分为请求报文(request message)和响应报文(response message)。它们都有三个部分组成:对报文进行描述的起始行(start line), 包含属性的首部块(header),以及可选的,包含数据的主体(body)部分。

    起始行和首部是由行分隔符的ASCII文本。每行都以一个有两个字符组成的行终止序列作为结束,其中包括一个回车符(ASCII码13)和一个换行符(ASCII码10),这个行终止序列可以写作CRLF。

    实体的主体或报文的主体(或者成为主体)是一个可选的数据块。与起始行和首部不同的是,主体中可以包含文本或二进制数据,也可以为空。

  2. 报文的语法

    请求报文的格式

<method> <request-URL> <version>
<headers>

<entity-body>

    下面是一个请求报文的样例:

 <<"GET /test.txt HTTP/1.1\r\n
 Host: 172.16.81.107:8080\r\n
 Connection: keep-alive\r\n
 Pragma: no-cache\r\n
 Cache-Control: no-cache\r\n
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n
 User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36\r\n
 Accept-Encoding: gzip,deflate,sdch\r\n
Accept-Language: zh-CN,zh;q=0.8\r\n\r\n">>

 响应报文

<version> <status> <reason-phrase>
<headers>

<entity-body>

    如下,响应报文的样例:

<<"HTTP/1.1 200 OK\r\n">>
[[<<"connection">>,<<": ">>,<<"keep-alive">>,<<"\r\n">>],
[<<"server">>,<<": ">>,<<"Cowboy">>,<<"\r\n">>],
[<<"date">>,<<": ">>,<<"Mon, 02 Mar 2015 10:07:52 GMT">>,<<"\r\n">>],   
[<<"content-length">>,<<": ">>,"18",<<"\r\n">>],
[<<"content-type">>,<<": ">>,
[<<"text">>,<<"/">>,<<"plain">>,<<>>],   <<"\r\n">>],
[<<"etag">>,<<": ">>,[34,<<"2727243677">>,34],<<"\r\n">>],
[<<"last-modified">>,<<": ">>,<<"Sat, 28 Feb 2015 14:46:31 GMT">>,<<"\r\n">>]]
<<>>

首部(header):

     可以是零个或多个首部,每个首部都包含一个名字,后面跟着一个冒号(:);然后是一个可选的空格,接着是一个值,最后是一个CRLF。首部是一个空行(CRLF),表示了首部列表的结束和主体部分的开始。有些HTTP版本,比如HTTP/1.1,要求有效的请求或响应报文中必须包含特定的首部。

3. 起始行

    请求行:请求报文的起始行,或称为请求行,包含了一个方法一个请求URL,这个方法描述了服务器应该执行的操作,请求URL描述了要求对哪个资源执行这个方法。请求行中还包含HTTP的版本,用来告知服务器,客户端使用的是哪种HTTP。

    如:

"GET /test.txt HTTP/1.1\r\n

    方法: 请求的起始行以方法作为开始,方法用来告知服务器要做些什么。

    如下: 常用的HTTP方法

方法 描述 是否包含主体
GET 从服务器获取一份文档
HEAD 只从服务器获取文档的首部
POST 向服务器发送需要处理的数据
PUT 将请求的主体部分存储在服务器上
TRACE 对可能经过代理服务器传送到服务器上去的报文进行追踪
OPTIONS  决定可以在服务器上执行哪些方法
DELETE 从服务器上删除一份文档

    响应行:响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。响应报文的起始行,或称为响应行,包含了响应报文使用的HTTP版本数字状态码,以及描述操作状态的文本形式的原因短语

    如:

"HTTP/1.1 200 OK\r\n"

   状态码:方法是用来告诉服务器做什么事情的,状态码则用来告诉客户端,发生了什么事情。状态码位于响应的起始行中。

状态码分类:

整体范围 已定义范围 分类
100~199 100~101 信息提示
200~299 200~206 成功
300~399 300~305 重定向
400~499 400~415 客户端错误
500~599 500~505 服务器错误

常见状态码:

状态码 原因短语 含义
200 OK 成功。请求的所有数据都在响应主体中
304 Not Modified 资源为被修改。
400 Unathorized(未授权) 需要输入用户名和密码
404 Not Found 服务器无法找到所请求URL对应的资源

304: Not Modified  :客户端可以通过所包含的请求首部,使其请求变成有条件的。如果一个客户端发起了一个条件GET请求,而最近资源未被修改的话,就可以用这个状态码来说明资源未被修改。带有这个状态码的响应不应该包含实体的主体部分。(在有关缓存的内容时会用到,

    对304理解的文章:http://www.cnblogs.com/elaborateday/archive/2011/04/06/2007019.html

4. 首部

    请求首部是只在请求报文中有意义的首部。用于说明是谁或什么在发送请求,请求源自何处,或者客户端的喜好及其能力。服务器可以根据请求首部给出的客户端信息,试着为客户端提供更好的响应。

     下面是一个请求头,其中有些首部代表的意思是什么呢?

    User-Agent将发起请求的应用程序名称告知服务器。

    Connection : 允许客户端和服务器指定与请求/响应连接相关的选项。

     Accept首部

      为客户端提供了一种将其喜好和能力告知服务器的方式,包括它们想要什么,可以使用什么,以及最重要的,它们不想要什么。这样,服务器就可以根据这些额外信息,对要发送的内容做出更明智的决定。Accept首部会使连接的两端都受益。客户端会得到它们想要的内容,服务器则不会浪费其时间和带宽来发送客户端无法使用的东西。

    Accept首部:

       条件请求首部

有时客户端希望为请求加上某些限制。比如,如果客户端已经有了一份文档副本,就希望只在服务器上的文档与客户端拥有的副本有所区别时,才请求服务器传输文档。通过条件请求首部,客户端就可以为请求加上这种限制,要求服务器在对请求进行响应之前,确保某个条件为真。如下:列出了各种条件请求首部。

下面时一个响应头,相关首部对应的内容是什么?

    Connection: 允许客户端和服务器指定与请求/响应连接相关的选项。

    Data : 提供日期和时间标志,说明报文是什么时间创建的。

    Etag : 与此实体相关的实体标记,实体标记本质上来说就是某个特定资源版本的标识符。

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

参考文章:

http://my.oschina.net/u/1403215/blog/549123


© 著作权归作者所有

nao

nao

粉丝 27
博文 155
码字总数 108154
作品 0
成都
后端工程师
私信 提问
加载中

评论(3)

nao
nao 博主

引用来自“棒子面er”的评论

挺好,支持
棒子面er
棒子面er
挺好,支持
子_不语
子_不语
0
HTTP 报文内的 HTTP 信息

HTTP 通信过程包括: 从客户端发往服务器端的请求、 从服务器端返回客户端的响应 HTTP 报文 用于 HTTP 协议交互的信息被称为 HTTP 报文 请求端(客户端)的HTTP 报文叫做请求报文, 响应端(...

Java搬砖工程师
06/21
11
0
Http 基础 之 报文

报文流 http 报文是在 Http 应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文在客...

pan_1308
2016/11/29
27
0
HTTP报文内的HTTP信息之请求报文及响应报文的结构

HTTP报文 用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。HTTP报文本身是由多行(用CR+LF作换行符,就是回车加换行)数...

柳哥
2015/09/28
248
0
HTTP请求行、请求头、请求体详解

HTTP请求报文解剖 HTTP请求报文由3部分组成(请求行+请求头+请求体): 下面是一个实际的请求报文: ①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT...

HeroHY
2017/07/09
87
0
关于HTTP请求报文的分片分析

最近在做抓取Http请求报文分析的工作,先上抓取分析结果:(我是基于libpcap用C语言写的工具) 通过分析以上两个报文可以知道,一个Http请求被拆分为两个报文发送,但是第一个报文的Ip MF字段...

OSC创始人
2013/06/02
8K
13

没有更多内容

加载失败,请刷新页面

加载更多

学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
18分钟前
3
0
支撑微博亿级社交平台,小白也能玩转Redis集群(实战篇)

上篇文章《支撑微博亿级社交平台,小白也能玩转Redis集群(原理篇)》介绍了Redis集群相关原理,这篇文章将介绍Redis Cluster集群的搭建、配置,运维、扩容等具体操作 集群搭建 2018年10月 Re...

分布式系统架构
19分钟前
5
0
JVM -- 垃圾回收算法及分代垃圾收集器

Hello,今天记录下 Java虚拟机中的其中一个重点知识 --> 垃圾回收算法及分代垃圾收集器。 一起学习,一起进步。继续沉淀,慢慢强大。希望这文章对您有帮助。若有写的不好的地方,欢迎评论给建...

猫狗熊
33分钟前
3
0
ERC-777以太坊新代币标准解读

ERC777是一个新的高级代币标准,可以视为ERC20的升级版本,因此它解决了ERC20以及ERC223存在的一些问题,开发者可以根据自己的具体需求进行选型。 1、使用ERC820进行合约注册 有别于ERC20的自...

汇智网教程
今天
7
0
代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部