目录
1、简介
HTTP(Hyper Text Transfer Protocol,超文本传输协议)是一种应用层协议,用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP 基于 TCP/IP 通信协议来传递数据(HTML 文件,图片,多媒体等)。HTTP 由两部分组成:请求(Request)和响应(Response)。
HTTP(超文本传输协议)是利用 TCP 在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。客户端使用 Web 浏览器发起 HTTP 请求给 Web 服务器,Web 服务器发送被请求的信息给客户端。
2、HTTP 工作原理
HTTP 协议工作于客户端-服务端架构上。浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端(WEB服务器)发送所有请求。Web 服务器根据接收到的请求后,向客户端发送响应信息。HTTP 有三点注意事项:
(1)HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
(2)HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过 HTTP 发送。客户端以及服务器指定使用适合的 MIME-type 内容类型。
(3)HTTP是无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
3、HTTP 消息结构
3.1、客户端请求消息
客户端发送一个 HTTP 请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成:
实例(1)、在浏览器地址栏种输入 www.baidu.com,则 GET 请求如下:
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0(Windows;U;Windows NT 5.1;zh-CN;rv:1.9.0.8)Gecko/2017093609 Firefox/13.0.8
Connection:Keep-Alive
请求行的第1部分说明了该请求是GET请求。该行的第2部分是一个斜杠(/),用来说明请求的是百度域名的根目录。该行的最后一部分说明使用的是HTTP1.1版本,另一个可选项是HTTP1.0。
第2行是请求的第一个消息报头,HOST头部指出请求的域名。结合HOST头部和上一行中的统一资源标识符(即斜杠),就可以确定请求服务器的具体地址。
第3行包含的是User-Agent头部,服务器端和客户端脚本都能够访问它,该头部包含的信息由浏览器来定义,并且在每个请求中将会自动发送。JavaScript和服务器通过User-Agent头部信息,可以了解客户端的本地情况。
最后一行是Connection 头部,通常将浏览器操作设置为 Keep-Alive,在最后一个头部后有一个空行(即使不存在请求主体)。
实例(2)、如果在 GET 请求种附带参数,则必须将这些参数信息附在 URL 后面,这个信息也被称为查询字符串(Query String),发送时将被附加在请求行中,格式如下:
GET /bbs/?user=css8%20 HTTP/1.1
Host: www.mysite.com
User-Agent: Mozilla/5.0(Windows;U;Windows NT 5.1;zh-CN;rv:1.9.0.8)Gecko/2017093609 Firefox/13.0.8
Connection:Keep-Alive
实例(3)、POST 方法要求被请求服务器接收附在请求后面的数据,常用于提交表单。
POST / form.asp HTTP/ (CRLF)
HOST:www.mysite.cn (CRLE)
Usex-Agent:Mozi1la/5.0(Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.8)Gecko/2017032609 Firefox/13.0.8
Content-Type:application/x-www-form-urlencoded
Content-Length:22 (CRLF)
Connection:Keep-Alive (CRLE)
Cache-Control:no-cache (CRLF)
(CRLF) //该CRLF表示消息报头已经结束,在此之前为消息报头
user=css8&pwd=111111 //此行以下为提交的数据
POST请求与GET请求之间略有区别。首先,请求行开始处的GET变为POST,在后面有两个新行。其中Content-Type 说明了请求主体的内容是如何编码的。测览器始终以application/x-www-form-urifencoded的编码格式来传送数据,这是针对简单URL编码的MIME类型。
Content-Length说明了请求主体的字节数。在Connection后是一个空行,再后面就是请求主体。与大多数浏览器的POST请求一样,都以“名称/值”对的形式表示的。POST方法与GET方法的数据传输形式几乎是一样的。
3.2、服务器响应消息
HTTP 响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文,具体如下图所示:
状态行包括:表示服务器HTTP协议的版本、表示服务器返回的响应状态码、表示状态码的文本描述。其中状态码有三位数字组成,第一个数字定义了响应的类别,且有如下5种可能的取值。
1xx | 指示信息,表示请求已接收,继续处理。 |
2xx | 成功。表示请求已被成功接收、理解或接收。 |
3xx | 重定向。要完成请求必须进行更进一步的操作。 |
4xx | 客户端错误。请求有语法错误,或者请求无法实现。 |
5xx | 服务器端错误。服务器未能实现合法的请求。 |
常见的状态码、状态描述如下:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,例如,输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后,可能恢复正常
实例(1)、下面是一个HTTP响应的示例:
HTTP/1.1 200 OK
Date:Wed, 08 Apr 2017 03:35:50 GMT
Content-Type:text/html; charset=gb2312
Content-Length:1700
<html>
<head>
<title>百度一下,你就知道</title>
</head>
<body>
<!--body-->
</body>
</html>
在状态行之后是消息头。一般服务器会返回一个名为 Data 的信息,用来说明响应生成的日期和时间。接下来就是与POST请求中一样的Content-Type和Content-Length。响应主体所包含的就是所请求资源的HTML源文件。
4、HTTP 请求方法
HTTP 请求方法(所有方法全为大写)有多种,各个方法的解释如下:
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体。 |
HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
以上几种方法的抓包分析可以参考下面这篇文章:传送门