深入了解HTTP请求流程
HTTP协议解析
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。它允许将HTML文档从web服务器传送到web浏览器。
发起HTTP请求
当你在浏览器地址栏输入URL时,你即发起了一个HTTP请求。很快你就可以在浏览器上看到返回结果。
URL:统一资源定位符,也被称为网页地址,是互联网标准的地址。URL的标准格式如下:
协议://服务器IP[:端口]/路径[?查询]
HTTP协议详解
HTTP是一种无状态的协议。无状态是指web浏览器与web服务器之间不需要建立持久的连接。这就意味着当一个客户向服务器发出请求,然后web服务器返回响应以后,连接就关闭了,在服务器端不会保留连接的相关信息。也就是说,HTTP请求只能是客户端发起,服务器端接收,而服务器不能主动向客户发送数据。
HTTP遵循请求(request)/响应(response)模型。
1、HTTP请求与响应
(1)http请求
HTTP请求分为三个部分,分别是请求行(请求方法),请求头(消息报头),请求正文。
(2)HTTP响应
与http请求相对应 的就是响应。同样它也分为三个部分,分别是响应行,响应头(消息报头),响应正文。
2、HTTP请求方法
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体。 |
HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
3、HTTP状态码
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
---|---|
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
状态码 | 描述 |
---|---|
100 | 继续。客户端应继续其请求 |
101 | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
200 | 请求成功。一般用于GET与POST请求 |
201 | 已创建。成功请求并创建了新的资源 |
202 | 已接受。已经接受请求,但未处理完成 |
203 | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | 部分内容。服务器成功处理了部分GET请求 |
300 | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
301 | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | 查看其它地址。与301类似。使用GET和POST请求查看 |
304 | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 | 使用代理。所请求的资源必须通过代理访问 |
306 | 已经被废弃的HTTP状态码 |
307 | 临时重定向。与302类似。使用GET请求重定向 |
400 | 客户端请求的语法错误,服务器无法理解 |
401 | 请求要求用户的身份认证 |
402 | 保留,将来使用 |
403 | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
405 | 客户端请求中的方法被禁止 |
406 | 服务器无法根据客户端请求的内容特性完成请求 |
407 | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | 服务器等待客户端发送的请求时间过长,超时 |
409 | 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 |
410 | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | 客户端请求信息的先决条件错误 |
413 | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | 服务器无法处理请求附带的媒体格式 |
416 | 客户端请求的范围无效 |
417 | 服务器无法满足Expect的请求头信息 |
500 | 服务器内部错误,无法完成请求 |
501 | 服务器不支持请求的功能,无法完成请求 |
502 | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
4、HTTP消息
由四个部分组成,分别是请求头,响应头,普通头和实体头。
(1)请求头
请求头只出现在http请求中,请求报头允许客户端向服务器传送请求的附加信息和客户端自身的信息。通常的http请求头如下:
-
Host
Host 请求报头域主要用于指定被请求资源的Internet主机和端口号,
例如:Host:www.xxser.com:8010。
2、User-Agent
User-Agent 请求报头域允许客户端将它的操作系统,浏览器和其他属性告诉服务器。登录一些网站时,很多时候都可以见到显示我们的浏览器,系统信息,这些都是此头的作用,如:User-Agent:My privacy
3、Referer
Referer包含一个URL,代表当前访问URL的上一个URL,也就是说,用户是从什么地方来到这个页面的。如:Referer:www.xxser.com/login.php,代表用户从login.php来到当前页面。
4、Cookie
Cookie 是一个很重要的请求头,它是一段文本,常用来表示请求者的身份等。在后面将详细讲。
5、Range
Range 可以请求实体的部分内容,多线程下载一定会用到这个请求头。例如:
表示头500字节:bytes=0~499
表示第二个500字节:bytes=500~999
表示最后一个500字节:bytes=500
表示500字节以后的范围:bytes=500-
6、x-forwarded-for
x-forwarded-for 即XXF头,它代表请求的IP,可以是多个,中间用逗号隔开。
7、Accept
Accept 请求报头域用于指定客户端接收哪些MIME类型的信息,如:Accept:text/html,表示用户端接收HTML文本。
8、Accept-Charset
Accept-Charset请求报头域用于指定客户端接收的字符集。例如:Accept-Charset:ios-8859-1,gb2312。如果在请求头消息中没有这个域,默认是任何人字符集都可以接收。
(2)响应头
响应头是服务器根据请求向客户端发送的HTTP头。常见的HTTP响应头如下:
1、Server
服务器使用的Web服务器名称,如:Server:Apache/1.3.6(Unix),攻击者通过查看此头,可以知道web服务器的名称。所以,建议在服务器端进行修改此头的信息。
2、Set-Cookie
向客户端设置Cookie,通过查看这个头,可以清楚的看到服务器向客户端发送的Cookie信息。
3、Last-Modified
服务器通过这个告诉浏览器,资源的最后修改时间。
4、Location
服务器通过这个头告诉浏览器去访问哪个页面,浏览器接受这个请求以后,通常会立刻访问Location头所指向的页面,这个头通常配合302状态码使用。
5、Refresh
服务器通过这个头告诉浏览器定时刷新浏览器
(3)普通头
在普通头报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。例如:Date ,表示消息产生的时间和日期。Connection,允许发送指定连接的选项。例如:指定连接是连续的,或者指定“close" 选项,通知服务器,在响应完成后,关闭连接。Cache-Control,用于指定缓存的指令,缓存指令是单向的,且是独立的。
(4)实体头:
请求和响应消息都可以发送一个实体头。实体头定义了关于实体正文和请求所标识的资源的元信息。元信息也就是实体内容的属性,包括实体信息类型,长度,压缩方法,最后一次修改时间等。常见的实体头有如下:
1、Content-Type
Content-Type实体头用于向接收方指示实体的介质类型。
2、Content-Encoding
Content-Encoding头被用做媒体类型的修饰符,它的值指示了已经被应用到实体正文的附件内容的编码,因而要获得Content-Type报头域中所引起的媒体类型,必须采用相应的解码机制。
3、Content-Length
Content-Length实体报头用于指明实体正文的长度,以字节的方式存储的十进制数字来表示。
4、Last-Modified
Last-Modified实体报头用于指示资源的最后修改时间和日期。