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

学习一个协议感觉最有意思的就是看包结构…在我看来这是唯一不费脑子看上去又很牛逼的东西. wireshark一开,熟练的找到数据包,看这个字段那个字段. 虽然一时半会儿甚至很长之间之类也不知道这玩意儿有啥用,但是,拿来装装X还是不错的.

HTTP报文格式

从结构上来说,HTTP报文分为四个部分:
- 起始行
- 首部
- 一个空行
- (可选)报文主体

首先起始行和首部之间有一个行终止符符,这个行终止符比较特殊,是由回车符(ASCII码12)和换行符(ASCII10)组成的. 就是传说中的CRLF(其实是两个字符CR和LF)(其实就是C语言中传说的\r\n)

为什么C中的换行必须是写\r\n?
这要从很久很久之前的打字机说起了.或许都在电视或者教科书上见过打字机. 打字机的换行其实是分两步进行的. 回车和新行. 回车(\r)是表示,字车回到起始位置.新行(\n)表示纸筒上卷一行. 就像下面这个样子.

不同系统对行终止符的处理不一样,windows所谓换行是\r\n unix类系统的是\n mac的是\r…

HTTP协议规定应该使用CRLF作为行终止序列,但是作为一个稳健的程序,应该可以接受单个换行或者回车作为行终止.

报文的语法

HTTP报文总共就两类,request和response. request就是向服务器发出一个请求动作,然后服务器会以response报文进行回应. (好简单的样子…)从结构上来看,request报文和response报文结构上差不多.

祭出HTTP抓包利器,Fiddler
request报文

response报文

这里是文字版,截图只是为了装一下…

GET http://www.joes-hardware.com/ HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: www.joes-hardware.com
Pragma: no-cache HTTP/1.1 200 OK
Date: Wed, 27 Jul 2016 08:12:00 GMT
Server: Apache/2.2.22 (Unix) DAV/2 FrontPage/5.0.2.2635 mod_ssl/2.2.22 OpenSSL/1.0.1h
Last-Modified: Tue, 20 Mar 2001 02:29:40 GMT
ETag: "146deac-2ba-37fe714024d00"
Accept-Ranges: bytes
Content-Length: 698
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html <HTML>
<HEAD>
<TITLE>Welcome To Joe's Hardware Store</TITLE>
</HEAD> <BODY><FONT FACE=arial SIZE=+2> <TABLE>
<TR>
<TD><IMG ALIGN=middle SRC="specials/locking-pliers.gif"></TD>
<TD ALIGN=CENTER><FONT SIZE=+4>Welcome to Joe's Hardware Store</FONT><BR>
<FONT SIZE=+2>(www.joes-hardware.com)</FONT></TD>
<TD><IMG ALIGN=middle SRC="specials/locking-pliers.gif"></TD>
</TR>
</TABLE> <HR> <CENTER> <P>Joe's Hardware is a hypothetical online hardware store.</P> <P>The website is a live test case for the O'Reilly and Associates
reference book <A href="http://www.http-guide.com">"HTTP: The
Definitive Guide"</A>.</P> </CENTER> </FACE>
</BODY>
</HTML>

总结起来就是:
request的报文结构

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

response的报文结构

<version> <status> <reason-phrase>
<headers>
<entity-body>
  • method:客户端请求的一个动作,这个动作有很多,但是常用的有两种. (POST和GET)
  • request-URL:这个是所请求的URL,这个可以是相对URL也可以是绝对URL. 但是作为一个懒的动脑子的人,在coding的时候使用绝对路径总是没错的. 就好像编码使用UTF-8总不会乱码一样…
  • **version:**HTTP协议版本,这个格式是HTTP/<major>.<minor>目前有两种 HTTP/1.0 和HTTP/1.1
  • status-code: 状态码,3位数字,用于描述请求过程中的状态.
  • reason-phrase: 对于状态码的一个描述,主要是给人看. 程序可以直接看状态码,不屑于看这个.
  • headers: 首部 注意,header不止一个,也可以没有… 每一行可以看作是一个首部. 一个首部由三部分组成, key:value CRLF. 也就是说一个header由header的名字,冒号,header的值还有一个行终止符组成(说行终止符总觉得比说换行符先得要专业)
  • entity-body: 这是主体,没什么好说的,但是!!!BUT!!! 一定要注意,首部和主体之间是通过一个空行隔开的.

起始行

所有HTTP报文都有一个起始行. 请求报文的起始行说明了老子要干什么. 响应报文的起始行说明了都发生了些什么.

请求行
请求报文的起始行,主要包括三部分,方法 请求URL HTTP版本 每个字段之间由空格隔开.

我纠结了很久,为什么HTTP协议不像底层的IP协议之类的协议那样去直接规定哪些位代表什么含义,而是通过文本还使用各种蛋疼的空格换行来分隔字段. 后来我想明白了,也不知道我想的对不对. HTTP作为一个应用层协议,更多的是需要被程序员,也就是人类(暂且将程序员归为人类的范畴…) 所以在这些较高层的协议中,直接处理人类语言或许是一种更直观的方式. 也就是说底层协议的处理过程相对是固定的,可以使用固定的软件甚至是硬件逻辑来处理. 人参与的过程较少,直接使用对机器友好的比特位来标识信息更高效. 而HTTP这种应用层协议,人或者说程序员参与的比重较大,使用对人类(和程序员)友好的这种直观文本更合理一点.

IP包结构

方法
方法主要是告诉服务器要干些什么,HTTP规定了很多方法,但是实际上最常用的就两个GET和POST.

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

响应行
响应行是响应报文的起始行,主要包括三部分内容HTTP版本 状态码 状态码短语

状态码
状态码包括在响应报文的起始行也就是响应行中. 方法是客户端告诉服务要做什么,状态码就是服务器告诉客户端,发生了什么. 状态码主要有那么几类.
- 200-299:成功
- 300-399:重定向
- 400-499:客户端请求错误
- 500-599:服务器内部错误

常见的有那么几种:200:成功;传说中的404:not found(情不自禁的祝病魔早日战胜方校长)

版本号
为什么使用版本号呢,版本号标识应用程序支持的最高的HTTP版本.主要是为了让对方了解自己的报文格式和能力.

首部

一个HTTP报文可以携带多个首部,首部直接跟在起始行的后面,可以有0-N个. 首部就是一些键值对. 可以理解为是一些可以被解析的参数.
首部分类
HTTP是一个相当灵(sui)活(yi)的协议,可以自己定义首部内容…
如果严格来分类的话,可以分那么几种:
- 通用首部:在请求报文和响应报文中都可以出现
- 请求首部:提供更多的请求信息
- 响应首部:提供更多的响应信息
- 实体首部:描述主体的长度,内容或者资源本身
- 扩展首部:协议没有规定,自己瞎逑搞的首部

首部的组成:字段名: 字段值/CRLF/ CRLF表示那啥,前面说过了.

实体部分

主体没什么好说的,就是报文携带的内容.

HTTP学习笔记02-HTTP报文格式之概述的更多相关文章

  1. 软件测试之loadrunner学习笔记-02集合点

    loadrunner学习笔记-02集合点 集合点函数可以帮助我们生成有效可控的并发操作.虽然在Controller中多用户负载的Vuser是一起开始运行脚本的,但是由于计算机的串行处理机制,脚本的运行 ...

  2. 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)

    机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...

  3. OpenCV 学习笔记 02 使用opencv处理图像

    1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...

  4. SaToken学习笔记-02

    SaToken学习笔记-02 如果排版有问题,请点击:传送门 常用的登录有关的方法 - StpUtil.logout() 作用为:当前会话注销登录 调用此方法,其实做了哪些操作呢,我们来一起看一下源码 ...

  5. Fortran学习笔记:01 基本格式与变量声明

    Fortran学习笔记目录 01 基本格式与变量声明 格式 固定格式(Fixed Format):Fortran77 程序需要满足一种特定的格式要求,具体形式参考教材 自由格式(Free Format ...

  6. Redis:学习笔记-02

    Redis:学习笔记-02 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 4. 事物 Redis 事务本 ...

  7. 类型和变量(C#学习笔记02)

    类型和变量 [C#类型和变量(原文参考官方教程)]https://docs.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/types-and-var ...

  8. OGG学习笔记02

    实验环境:源端:192.168.1.30,Oracle 10.2.0.5 单实例目标端:192.168.1.31,Oracle 10.2.0.5 单实例 1.模拟源数据库业务持续运行 2.配置OGG前 ...

  9. 《Master Bitcoin》学习笔记02——比特币的交易模型

    比特币的交易模型 模型基本描述 前面一篇学习笔记01提到了一个交易模型(第三章的内容),在第五章中,除了对这个模型做个详细介绍之外,其实和我上一篇理解的交易模型差不多,一个交易包含输入与输出,比特币是 ...

随机推荐

  1. mysql存储引擎的种类与差别(innodb与myisam)

    查找数据库的存数引擎: show engines show variables like '%storage_engine%' 更改数据库的引擎更改配置文件/etc/my.cnf 改动default- ...

  2. linux USR1亦通常被用来告知应用程序重载配置文件

    linux kill 命令 以及 USR1 信号 解释 原创 2016年03月16日 16:48:27 标签:linux kill -USR1 5325 最近 在做 服务器搭建的一些工作,其中 用到了 ...

  3. Power Network - poj 1459 (最大流 Edmonds-Karp算法)

      Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 24788   Accepted: 12922 Description A ...

  4. 基于springCloud的分布式架构体系

    Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...

  5. CSDN学院 免费技术答疑公开课,本周四场即将开播~~~

    为了酬谢广大学员,CSDN学院特推出免费技术答疑公开课,让您开启一段充实的学习之旅~ 本周四场即将开播! ----------------------------------------------- ...

  6. Servlet线程安全 Filter http://zwchen.iteye.com/blog/91088

    概述 在探讨java线程安全前,让我们先简要介绍一下Java语言. 任何语言,如C++,C#,Java,它们都有相通之处,特别是语法,但如果有人问你,Java语言的核心是什么?类库?关键字?语法?似乎 ...

  7. WPF 后台任务 等待动画 样例 && C# BackgroundWorker 详解

    运行效果: 前台代码: <Window x :Class="Waiting.Window1" xmlns="http://schemas.microsoft.com ...

  8. iOS 集成阿里百川最新版(3.1.1.96) 实现淘宝授权登录以及调用淘宝客户端商品详情页

      公司最近要做第三方登录,由于是做导购项目,必不可少的有淘宝的授权登录.本来就是一个授权登录,没什么大不了的.但淘宝的无线开放业务——阿里百川更新的最新版本3.1.1.96,开发文档不是不详细,是很 ...

  9. windows 下XAMPP 使用Nginx替代apache作为服务器

    说实话, 在windows下使用Nginx 着实有点不太方便, 但因项目需求, 又不想换系统(虽然可以搞个虚拟机玩), 只能用Nginx了 好了, 不多说了. 开始... 首先我用的是xampp包(A ...

  10. idea 全部报错找不到包

    解决报错方法如下: