深入HTTP请求流程之GGBond版
深入HTTP请求流程
文章目录
- 深入HTTP请求流程
- 1. HTTP的协议解析
- 1.1 HTTP的请求
- 1.2 HTTP请求方法
- 1.3 HTTP的响应
- 1.4 HTTP状态码
- 1.5 HTTP消息
- 2. HTTP协议与HTTPS协议的区别
1. HTTP的协议解析
HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则,它是万维网交换信息的基础,它允许将HTML(超文本标记语言)文档从Web服务器传送到Web浏览器。
HTTP是一种无状态的协议。无状态是指Web浏览器与Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(Response),连接就被关闭了,在服务器端不保留连接的有关信息。
HTTP请求只能由客户端发起,而服务器不能主动向客户端发送数据。
1.1 HTTP的请求
HTTP请求包括三部分,分别是请求行(请求方法)、请求头(请求报文)和请求正文。下面是HTTP请求的一个例子:
POST /login.oho HTTP/1.1 //请求行
HOST: www.xxser.com //请求头
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0//空白行,代表请求头结束
Username=admin&password=admin //请求正文
- 第一行为HTTP请求行,由3部分组成,第一部分说明该请求是POST请求;第二部分 /login.php 用来说明请求的是该域名根目录下的 login.php; 最后一部分说明使用的是HTTP 1.1版本。
- 第二行至空白行为HTTP中的请求头(也被称为消息头),常见的请求头如下:
请求头 | 解释 |
---|---|
Host | 请求报文域主要用于指定被请求资源的Internet主机和端口号,例如:Host:www.xxser.com:801 |
User-Agent | 请求报文域允许客户端将它的操作系统、浏览器和其他属性告诉服务器。登陆一些网站时,很多时候都可以见到显示我们的浏览器、系统信息,这些都是此头的作用,如:User-Agent:My privacy |
Referer | Referer包含一个URL,代表当前访问URL的上一个URL,也就是说,用户是从什么地方来到本页面。如:Referer: www.xxser.com/login.php, 代表用户是从login.php 来到当前页面。 |
Cookie | Cookie是非常重要的请求头。它是一段文本,常用来表示请求者身份等。在后面将会详细讲述Cookie |
Range |
Range 可以请求实体的部分内容,多线程下载一定会用到此请求头。例如: 表示头500字节:bytes=0 ~ 499 表示第二个500字节:bytes=500 ~ 999 表示最后500字节:bytes=-500 表示500字节以后的范围:bytes=500- |
x-forward-for | x-forward-for 即XXF头,它代表请求端的IP,可以有多个,中间以逗号隔开 |
Accept | Accept请求报头域用于指定客户端接受哪些MIME类型的信息,如:Accept: text/html,表明客户端希望接收HTML文本。 |
Accept-Charset | Accept-Charset 请求报头域用于指定客户端接收的字符集。例如:Accept-Charset:iso-8859-1,gb2312 。如果在请求消息中没有设置这个域,默认是任何字符集都可以接收。 |
- HTTP请求的最后一行为请求正文,请求正文是可选的,它最常出现在POST请求方法中。
1.2 HTTP请求方法
HTTP请求的方法非常多,其中GET、POST最常见。下面是HTTP请求方法的详细介绍。
请求方法 | 介绍 |
---|---|
GET | GET 方法用于获取请求页面的指定信息(以实体的格式)。如果请求资源为动态脚本(非HTML),那么返回文本是Web容器解析后的HTML源代码,而不是源文件。只会接收开发者内定好的参数项目,若加入了其他参数项,服务器端脚本不会理会你加入的内容。 |
HEAD | HEAD方法除了服务器不能在响应里返回消息主体外,其他都与GET方法相同 |
POST | POST方法也与GET方法相似,但最大的区别在于,GET方法没有请求内容,而POST是有请求内容的。POST请求最多用于向服务器发送大量的数据。GET虽然也能发送数据,但是有大小的限制,并且GET请求会将发送的数据显示在浏览器端,而POST不会,所以安全性更高一些。 |
PUT |
PUT方法用于请求服务器把请求中的实体存储在请求资源下,如果请求资源已经在服务器中存在,那么将会用此请求中的数据替换原先的数据,作为指定资源的最新修改版。如果请求指定的资源不存在,将会创建这个资源,且数据位于请求正文。 通常情况下,服务器都会关闭PUT方法,因为它会为服务器建立文件,属于危险的方法之一。 |
DELETE | DELETE方法用于请求源服务器删除请求的指定资源。服务器一般都会关闭此方法,因为客户端可以进行删除文件操作,属于危险方法之一。 |
TRACE | TRACE方法被用于激发一个远程的应用层的请求消息回路,也就是说,回显服务器收到的请求。TRACE方法允许客户端去了解数据被请求链的另一端接收的情况,并且利用那些数据信息去测试或诊断。但此方法非常少见。 |
CONNECT | 此方法是为了用于能动态切换到隧道的代理。 |
OPTIONS | OPTIONS方法是用于请求获得由URI标识的资源在请求/响应的通信过程中可以使用的功能选项。通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。 |
以上为HTTP/1.1 标准方法,但HTTP中的请求方法还不止这些,例如WebDAV。WebDAV(Web-based Distributed Authoring and Versioning)是一种基于HTTP/1.1协议的通信协议,它扩展了HTTP 1.1,在GET、POST、HEAD等标准方法以外添加了一些新的方法,使应用程序可直接对Web Server 进行读写,并支持写文件锁定(Locking)和解锁(Unlock)、文件复制(Copy)文件移动(Move)。另外,还可以支持文件的版本控制。
1.3 HTTP的响应
与HTTP请求对应的是HTTP响应,HTTP响应也由三部分内容组成,分别是响应行、响应头(消息报头)和响应正文(消息主题)。下面是一个经典的HTTP响应。
HTTP/1.1 200 OK //响应行
Date: Thu, 28 Feb 2013 07:36:47 GMT //响应头
Server: BWS/1.0
Content-Length: 4199
Content-Type: text/html;charset=utf-8
Cache-Control: private
Expires:Thu, 28 Feb 2013 07:36:47 GMT
Content-Encoding: gzip
Set-Cookie: H_PS_PSSID=2022_1438_1944_1788; path=/; domain=.xxser.com
Connection: Keep-Alive//空白行,代表响应头结束
<html> //响应正文或者叫消息主题<head><title> Index.html </title></head>
·······
- HTTP响应的第一行为响应行,其中有HTTP版本(HTTP/1.1)、状态码(200)以及消息“OK”。
- 第二行至末尾的空白行为响应头由服务器向客户端发送。常见的响应头如下:
响应头 | 解释 |
---|---|
Server | 服务器所使用的Web服务器名称,如:Server:Apache/1.36(Unix),攻击者通过查看此头,可以探测Web服务器名称。所以,建议在服务器端进行修改此头的信息。 |
Set-Cookie | 向客户端设置Cookie,通过查看此头,可以清楚地看到服务器向客户端发送的Cookie信息。 |
Last-Modified | 服务器通过这个头告诉浏览器,资源的最后修改时间。 |
Location | 服务器通过这个头告诉浏览器去访问哪个页面,浏览器接收到这个请求之后,通常会立刻访问Location头所指向的页面。这个头通常配合302状态码使用。 |
Refresh | 服务器通过Refresh头告诉浏览器定时刷新浏览器。 |
- 响应头之后是响应正文,是服务器向客户端发送的HTML数据。
1.4 HTTP状态码
当客户端发出HTTP请求,服务器端接收后,会向客户端发送响应信息,其中,HTTP响应中的第一行中,最重要的一点就是HTTP的状态码,内容如下:
HTTP/1.1 200 OK
此的状态码为200,在HTTP协议中表示请求成功。HTP协议中的状态码由三位数字组成,第一位数字定义了响应的类别,且只有以下5种。
- 1xx:信息提示,表示请求已被成功接收,继续处理。其范围为100 ~ 101 。
- 2xx:成功,服务器成功地处理了请求。其范围为200 ~ 206 。
- 3xx:重定向,重定向状态码用于告诉浏览器客户端,它们访问的资源已被移动,并告诉客户端新的资源地址位置,浏览器将重新对新资源发起请求。其范围为300 ~ 305 。
- 4xx:客户端错误状态吗,有时客户端会发送一些服务器无法处理的东西,比如格式错误的请求,或者最常见的是,请求一个不存在的URL。其范围为400 ~ 415 。
- 5xx:有时候客户端发送了一条有效请求,但Web服务器自身却出错了,可能是Web服务器运行出错了,或者网站都挂了。5XX就是用来描述服务器内部错误的,其范围为500 ~ 505 。
常见的状态码描述如下:
状态码 | 内容 |
---|---|
200 | 客户端请求成功,是最常见的状态。 |
302 | 重定向 |
404 | 请求资源不存在,是最常见的状态 |
400 | 客户端请求有语法错误,不能被服务器所理解 |
401 | 请求未经授权 |
403 | 服务器收到请求,但是拒绝提供服务 |
500 | 服务器内部错误,是最常见的状态 |
503 | 服务器当前不能处理客户端的请求,一段时间后可能恢复正常 |
注意:状态码需牢记!
1.5 HTTP消息
HTTP消息又称为HTTP头(HTTP header),由四部分组成,分别是请求头、响应头、普通头和实体头。从名称上看,我们就可以知道它们所处的位置。
- 1. 请求头
请求头只出现在HTTP请求中,请求报文允许客户端向服务器端传递请求的附加信息和客户端的信息。常用的HTTP请求头上面已经介绍过了。 - 2. 响应头
响应头是服务器根据请求向客户端发送的HTTP头。常见的HTTP响应头上面已经介绍过了。 - 3. 普通头
在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。常见的普通头如下:
普通头 | 解释 |
---|---|
Date | 表示消息产生的日期和时间 |
Connection | 允许发送指定连接的选项。例如,指定连接是连续的,或者指定“close”选项,通知服务器,在响应完成后,关闭连接 |
Cache-Control | 用于指定缓存指令,缓存指令是单向的,且是独立的。 |
注意:普通头作为了解即可。
- 4. 实体头
请求和响应消息都可以传达一个实体头。实体头定义了关于实体正文和请求所标识的资源的元信息。元信息也就是实体内容的属性,包括实体信息类型、长度、压缩方法、最后一次修改时间等。常见的实体头如下:
实体头 | 解释 |
---|---|
Content-Type | Content-Type实体头用于向接收方指示实体的介质类型 |
Content-Encoding | Content-Encoding头被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报文域中所引用的媒体类型,必须采用相应的解码机制。 |
Content-Length | Content-Length实体报文用于指明实体正文的长度,以字节方式存储的十进制数字来表示。 |
Last-Modified | Last-Modified实体报文用于指示资源的最后修改日期和时间。 |
2. HTTP协议与HTTPS协议的区别
- HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。
- HTTP与HTTPS协议使用的是完全不同的连接方式,HTTP采用80端口连接,而HTTPS则是443端口。
- HTTPS协议需要到ca申请证书,一般免费证书很少,需要交费,也有些Web容器提供,如TOMCAT。而HTTP协议却不需要。
- HTTP连接相对简单,是无状态的,而HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,相对来说,它要比HTTP协议更安全。
深入HTTP请求流程之GGBond版相关推荐
- [原创]FOCUS处理系统流程之:流程批量生成(个人专用懒人版)
根据标准流程生成整个工区流程文件 (1)可按按目录生成 (2)可替换其中的关键字 标准流程准确,则生成的流程将一点到底,所剩的操作变成鼠标的操作,懒之产物. 界面如下: ☆其它物探处理原创软件相关☆ ...
- (连载)Android系统源码分析--Android系统启动流程之Linux内核
> **这是一个连载的博文系列,我将持续为大家提供尽可能透彻的Android源码分析 [github连载地址](https://github.com/foxleezh/AOSP/issues/3 ...
- (连载)Android 8.0 : 系统启动流程之Linux内核
这是一个连载的博文系列,我将持续为大家提供尽可能透彻的Android源码分析 github连载地址 前言 Android本质上就是一个基于Linux内核的操作系统,与Ubuntu Linux.Fedo ...
- LiteOS学习笔记-9LiteOS SDK oc流程之MQTT
LiteOS学习笔记-9LiteOS SDK oc流程之MQTT MQTT协议 MQTT协议简介 MQTT消息类型 LiteOS中MQTT实现 LiteOS OC MQTT 抽象组件 概述 配置并连接 ...
- 渗透测试流程之Kali
渗透测试流程之Kali 渗透测试流程 Kali Kali Linux VM安装 使用镜像配置虚拟机 虚拟机上安装和运行Windows 渗透测试流程 Kali Kali Linux是基于Debian的L ...
- activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
注:(1)环境搭建:activiti自己定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自己定义流程之Spr ...
- [转]Asp.Net 上传大文件专题(3)--从请求流中获取数据并保存为文件[下]
转自:http://www.cnblogs.com/stg609/archive/2008/08/03/1259206.html 接着上一篇讲 3.4 读取剩余的请求 前面我们已经提到过R ...
- Asp.Net 上传大文件专题(3)--从请求流中获取数据并保存为文件[下]
接着上一篇讲 3.4 读取剩余的请求 前面我们已经提到过ReadEntityBody (Byte[] buffer, Int32 size)方法,该方法可以用来读取客户端的请求数据 ...
- activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自定义流程之Sprin ...
最新文章
- LeetCode:64. 最小路径和
- 细看CRLF注入***的原理和其防范措施
- 真正拿大厂offer的人,都赢在这一点
- 50matches:更准确的搜索引擎
- 【Html】Html基本标记
- 做游戏,学编程(C语言) 13 消灭星星
- parse_str 相反函数
- Quartz.Net定时任务时间表达式设置
- 火狐版Idm配合油猴使用教程
- 电脑ps4,电脑也能玩PS4游戏 全新串流功能实测体验
- 凯叔讲故事显示未能连接到服务器,凯叔讲故事(免费收听)
- 小程序战局最新动态!这些你应该知道
- 利用 Andorid 手机连接 Arduino 并控制 LED灯开关
- PWM/转速单闭环/转速电流双闭环电机控制Simulink仿真
- C语言二级指针 (清晰易懂 图解概述)
- objective-c常见类型%z
- mysql函数if为负数_MySQL的if,case语句
- 红旗linux shell方式下配置声卡的命令是:,‘红旗杯’linux大赛——基础知识2
- SAS学习1(总体介绍以及一些程序例子)
- 基于Arduino的HX711称重实验