写在前面的话:喜欢这个比喻:如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹。

HTTP是一个应用层协议,研究它的内容的确很枯燥,没啥意思,都是规定好的,我们只需要知道是什么就好了,在此基础上如果能从协议的设计中得到一些实际开发中的启发,那就更好了。

这篇算是我的读书笔记吧,看过权威指南的同学都知道,基本上是照抄过来的(不过绝对没有 ctrl-c 哦),

这里顺带捎带一句,读书笔记只是一个引子,详细内容还得从书中找,或者通过引子能回忆起详细内容,我这种读书笔记就有点粗放型了,谁让咱智商捉急呢。

我建议读书笔记使用某种思维导图工具比较好,逻辑性也清晰。

带着问题在书中找答案:



没有目录的博文(读书笔记)都是耍流氓:

报文是如何流动的?

HTTP报文的三个组成部分

请求和响应报文之间的区别

请求报文支持的各种功能

和响应报文一起返回的各种状态码都什么意思?

各种各样的HTTP首部都是用来做什么的?



报文是如何流动的?

HTTP报文是在HTTP应用程序之间发送的数据块。这些数据块以文本形式的元信息开头,描述了报文的内容和含义,后面跟着的是可选的数据部分。报文在客户端、服务器和代理之间流动。术语“流入”、“流出”、“上游”和“下游”都是用来描述报文方向的。

流入和流出描述事务处理的方向,报文流入服务器,处理完成之后,会流出服务器,流入客户端。

上游和下游,所有报文的发送者都在接收者的上游(upstream)。不管发送者和接收者是服务器还是客户端或者是代理。

报文的组成部分?

HTTP报文是简单的格式化数据块。每条报文都包含来自客户端的请求,或者一条来自服务器的响应。

它们由三个部分组成:对报文进行描述的起始行(start line)、包含属性的首部块(header)以及可选的、包含数据的主体(body)部分。

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

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

报文的语法

所有的HTTP报文都可以分为两类:请求报文和响应报文。

请求报文会向Web服务器请求一个动作,响应报文会将请求的结果返回给客户端。两种报文的结构相同。

请求报文的格式

<method>  <request-url>  <version>
<headers> <entity-body>

响应报文的格式

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

对各个部分的简要描述

方法(method)

客户端希望服务器对资源执行的动作。比如GET、HEAD或POST等

请求URL(request-url)

命名了所请求的资源,或者URL路径组件的完整URL。如果直接与服务器进行对话,只要URL的路径组件是资源的绝对路径,通常就不会有什么问题。

版本(version)

报文所使用的HTTP版本,其格式看起来是这样:HTTP/<major>.<minor>主次版本号都要是整数。

状态码(status-code)

这三位数字描述了请求过程中所发生的情况。每个状态码的第一位数字用来描述状态的一般类别(成功、出错)。

原因短语(reason-phrase)

数字状态码的可读版本,包含行终止序列之前的所有文本。

首部(header)

可以有零个或者多个首部,每个首部都包含一个名字,后面跟着一个冒号,然后是一个可选空格,接着是一个值,最后是一个CRLF(行终止序列)。

首部是由一个空行(CRLF)结束的,表示了首部列表的结束和实体主体部分的开始。

主体部分(entity-body)

实体的主体部分包含一个由任意数据组成的数据块。并不是所有的报文都包含实体的主体部分。

请求报文支持的各种方法

请求报文支持的方法有很多,但并不是每台服务器都实现了所有的方法,下面介绍一些常用的方法。

GET ,通常用于请求服务器发送某个资源。HTTP/1.1 要求服务器实现此方法。

HEAD,该方法和GET方法的行为类似,但服务器在响应中只返回首部。不会返回实体的主体部分。那么问题来了,没有主体部分的响应报文我们有什么用呢?

  1. 在不获取资源的情况下了解资源的情况(判断资源类型)
  2. 通过查看响应中的状态码,看看某个对象是否存在
  3. 通过查看首部,测试资源是否被修改了。

服务器开发者必须确保返回的首部和GET请求返回报文的首部完全相同。HTTP/1.1要求服务器必须实现此方法。

PUT,与GET从服务器读取文档相反,PUT方法会向服务器写入文档。PUT方法的语义是让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档,或者,如果那个URL已经存在的话,就用这个主体来替代它。

POST,此方法起初是用来向服务器输入数据的。实际上,通常会用它来支持HTML的表单。表单中填好的数据通常会被送给服务器,然后由服务器将其发送到它要去的地方

TRACE,客户端发起一个请求时,这个请求可能要穿过防火墙、代理、网关或者其他一些应用程序。每个中间节点都可能会修改原始的HTTP请求。TRACE方法允许客户端在最终将请求发送给服务器时,看看请求变成了什么样子。

TRACE请求会在目的服务器端发起一个“环回”诊断。行程最后一站的服务器会弹回一条TRACE响应,并在响应主体中携带它收到的原始请求报文。这样客户端可以查看在所有中间HTTP应用程序组成的请求/响应链上,原始报文如何被修改过或者毁坏过。

该方法主要用于验证请求是否如愿的穿过了请求/响应链。它假定中间应用程序对不同类型的请求的处理是相同的,TRACE方法并不提供区别这些方法的机制,通常,中间应用程序会自行决定对TRACE请求的处理方式。

TRACE请求中不能带有实体的主体部分。TRACE响应的实体主体部分包含了响应服务器收到的请求的精确副本。

DELETE方法,请服务器删除URL指定的资源。但是,客户端应用无法保证删除操作一定会执行。HTTP规范允许服务器在不通知客户端的情况下撤销请求。

和响应报文一起返回的各种状态码都什么意思?

HTTP状态码被分为5大类,其中100~199是信息性状态码,200~299是成功状态码,300~399是重定向状态码,400~499是客户端错误状态码,500~599是服务器错误状态码。

每个状态码的意思我觉得没有必要一一列举出来,也没必要全记住,记住几个常见的就好了,其他的用的时候再查。书就是用来查的么 : )

各种各样的HTTP首部都是用来做什么的?

首部和方法配合工作,共同决定了客户端和服务器能做什么事情。

在请求和响应报文中都可以用首部来提供信息,有些首部是某种报文专用的,有些是通用的。首部可以分为五个主要类型。

通用首部:客户端和服务器都可以使用的通用首部。可以在客户端、服务器和其他应用程序之间提供一些非常有用的通用功能。比如:Date 首部,说明构建报文的时间和日期。

请求首部:请求报文特有的,它们为服务器提供了一些额外信息,比如客户端希望接收什么类型的数据。

响应首部:响应报文特有的,为客户端提供信息,比如客户端在与哪种类型的服务器进行交互。

实体首部:用于应对主体部分的首部。比如,用实体首部来说明主体部分的数据类型。Content-type

扩展首部:非标准的首部,有应用程序开发者创建。



写在后面的话,协议是枯燥的,只是一种规定,我分享这篇博文主要是我的读书笔记,当然可能作为笔记内容多了点,其实书中说的已经很言简意赅了,有兴趣的同学可以针对章节选择性的阅读。

HTTP权威指南中英文版下载链接:HTTP权威指南中英文版

HTTP 报文总结、外送两本电子书的更多相关文章

  1. 欢迎来到Googny的博客

    本博客主要分享笔者的学习知识,以及工程中遇到的技术问题. 由于笔者技术水平有限,博客不足之处在所难免,还请各位网友不吝交流,共同进步. 一起体会分享的乐趣. JavaScript 部分 该部分深入浅出 ...

  2. [转]关于AS3 Socket和TCP不得不说的三两事

    磨刀不误砍柴工,让我们从概念入手,逐步深入. 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络 ...

  3. 网际报文控制协议ICMP

    为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP.ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告.ICMP是因特网的标准协议.但ICMP不是高层协议 ...

  4. kali linux 2.0 web 渗透测试 电子书

    原创 2017-05-31 玄魂工作室 玄魂工作室 打起精神,重新开启订阅号的原创文章写作工作,但是需要点时间,请耐心等待. 求资料的同学,没有及时回复的,请再次留言,我会尽快处理.今天分享两本电子书 ...

  5. tcp、udp、ip、icmp报文格式分析

    TCP .UDP .IP. ICMP协议报文格式分析 Tcp报文格式: Wireshark抓包如图: 源端口/目的端口(16bit): 在TCP报文中包涵了源端口/目的端口,源端口标识了发送进程,目的 ...

  6. TCP/IP 笔记 - ICMPv4和ICMPv6 : Internet控制报文协议

    ICMP是一种面向无连接的协议,负责传递可能需要注意的差错和控制报文,差错指示通信网络是否存在错误(如目的主机无法到达.IP路由器无法正常传输数据包等.注意,路由器缓冲区溢出导致的丢包不包括在ICMP ...

  7. HTTP学习笔记02-HTTP报文格式之概述

    HTTP学习笔记02-HTTP报文格式之概述 HTTP学习笔记02-HTTP报文格式之概述 HTTP报文格式 报文的语法 起始行 首部 实体部分 学习一个协议感觉最有意思的就是看包结构…在我看来这是唯 ...

  8. 第八章 Internet控制报文协议

    Internet控制报文协议 首先,我们必须先清楚,IP协议本身没有为终端系统提供直接的方法来发现那些发往目的地址失败的IP数据包,并且IP没有提供直接的方式来获取诊断信息,那么我们的故事来了. In ...

  9. TCP 为什么是三次握手,而不是两次或四次?

    记得第一次看TCP握手连接的时候,有同样的疑问,我的疑问是,为何不是两次呢?后来随着对网络的理解深入,明白TCP报文是交由IP网络来负责运输,IP网络并不能保证TCP报文到达目的地,既然IP网络是指望 ...

随机推荐

  1. JavaBean 和 Map 之间互相转换

    JavaBean 和 Map 之间互相转换 import java.beans.BeanInfo; import java.beans.IntrospectionException; import j ...

  2. [转载]介绍一个JSONP 跨域访问代理API-yahooapis

    你是否遇到了想利用AJAX访问一些公网API,但是你又不想建立自己的代理服务,因为有时我根本就没打算涉及服务端任何代码,但是讨厌的浏览器的同源策略,阻止了我们的ajax调用. 比如我想访问一个天气的r ...

  3. 自助Linux之问题诊断工具strace

    转  http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 引言 “Oops,系统挂死了..." “Oops,程序 ...

  4. GameAdmin

    username:root e-mail :123@qq.com password:123

  5. <context:component-scan>配置解析(转)

    在xml配置了这个标签后,spring可以自动去扫描base-pack下和其子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注 ...

  6. HeadFirst设计模式之装饰者模式

    一. 1.The Decorator Pattern attaches additional responsibilities to an object dynamically.Decorators ...

  7. Linux信号列表

    我们运行如下命令,可看到Linux支持的信号列表: ~$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) ...

  8. 去掉php框架CI默认url中的index.php

    CI默认的rewrite url中是类似这样的 例如你的CI根目录是在/CodeIgniter/下,你的下面的二级url就类似这样 http://localhost/CodeIgniter/index ...

  9. MAC 上搭建lua环境

    一.下载并安装 (1)最新release版下载地址 http://www.lua.org/ftp/lua-5.3.1.tar.gz (2)编译 Building Lua is implemented ...

  10. RazorEngine(未解决,留底)

    TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration { BaseTemplateType = ...