HTTP协议相关知识
一:HTTP协议概述
(1)HTTP的发展历史
1989年,CERN的蒂姆·伯纳斯李提出一种能让远隔两地的研究者们共享知识的设想,这个设想即为WEB的最初设想。设想之初提出三大构建技术:HTML(HyperText Markup Language,超文本标记语言)——解决页面在客户端显示的问题;HTTP(HyperText Transfer Protocol,超文本传输协议)——解决客户端与服务器之间文件传输的问题;URL(Uniform Resource Locator,统一资源定位符)——解决资源在互联网中的定位问题。
HTTP协议于1990年问世,当时的版本并未成为正式的标准,因此被称为HTTP/0.9。1996年5月HTTP/1.0作为标准被正式公布,1997年1月公布的HTTP/1.1是目前主流的HTTP协议版本。新一代的HTTP/2.0目前正在制定当中,但要达到较高的使用覆盖率,仍需要时间。
(2)HTTP协议的特点
HTTP协议是一个面向对象的应用层协议,由于其简捷、快速的特点,非常适用于互联网应用。目前WEB中正在使用的是HTTP/1.1,其主要特点可概括为:
1、协议简单、无状态。简单可以理解为用户和Web服务器之间的交互方式简单,可概括为:“用户端发起请求,服务端响应请求”这样的一个过程。当然,这个过程中涉及到很多工程上的问题,我们这里不做讨论。HTTP无状态的特点表现为HTTP协议自身不对请求和响应之间的通信状态进行保存,既协议对于发送过的请求和响应都不做持久化处理。
2、协议支持B/S模式(Browser/Server)。用户可以使用浏览器或APP通过简单的操作即可享受互联网的服务和资源。
3、协议灵活。HTTP协议可用于多种资源的传输,包括但不限于数据传输,视频、文件传输,各种交互场景。
对于WEB安全而言,HTTP作为应用层的传输方式,目前存在的大量安全问题基本都是HTTP的应用所带来的,但HTTP本身并没有很好的防护措施。
二:客户端与Web服务器交互的大致过程
一般作为计算机专业科班出身的同学,对于网络的学习都是按计算机网络体系结构所划分的层次进行的,但学完之后仍对互联网时如果工作的没有一个完整的认知,毕竟网络是一个巨大且复杂的系统。如果要对HTTP协议有一个更深入、全面的了解,笔者认为还是需要对客户端与Web服务器之间的交互过程有一个大概的了解。当然,鉴于笔者能力有限,且网络是一个复杂、工程量大的系统,想通过一篇文章就讲清楚所有的知识点显然是妄想。因此,笔者对于客户端与Web服务器交互的过程仅仅讨论个大概,至于想了解具体细节的同学,笔者在文后会推荐一些笔者自己阅读过且认为相当值得阅读的专业书籍。
客户端和服务器的交互过程可以用两句话概括:(1)客户端向Web服务器发送HTTP请求;(2)Web服务器响应客户端发送过来的HTTP请求。
我们假设客户端和Web服务器之间的交互是通过在浏览器上输入目标服务器的URL(即网址,为了凸显专业性则称URL)进行的。
(1)用户在浏览器中输入目标服务器的URL,浏览器解析URL并生成HTTP请求信息。
(2)查询RUL中目标服务器域名对应的IP地址,解析器取出IP地址,并将IP地址写入浏览器指定的内存地址中。浏览器向WEB服务器发送请求信息时。从该内存地址中取出IP地址,并将其与HTTP请求消息交给操作系统内部的协议栈。
(3)操作系统内部的协议栈(网络控制软件)将从浏览器接收到的HTTP请求信息进行打包。
(4)协议栈将包转交给网卡(网卡是负责网络通信的硬件),网卡将包转换为电信号通过交换机、路由器、光猫等设备通过网线(接入网)传输至互联网内部。
(5)请求包进入互联网内部之后通过各节点的接力转发,到达目标服务器所在的局域网中。
(6)目标服务器中的防火墙对请求包进行检测。
(7)缓存服务器检查缓存中是否存在请求包中所需要的数据。如果存在则缓存服务器将数据读出;不存在则则将请求包提交至服务器处理。
(8)目标服务器将请求包解包并还原为原始的请求消息,然后交给服务器程序进行处理。
(9)服务器生成响应消息,并将响应消息返回给客户端。
三:HTTP包的结构与内容
本文对于HTTP协议相关知识的分享主要是侧重于网络安全方向, HTTP包中的大量参数会对安全生产产生重大影响,因此,对于HTTP包的抓取和分析至关重要。
1.HTTP请求包的结构和内容
HTTP请求主要由三个部分组成:请求行、消息头/消息报头、请求正文。接下来分别介绍这3个部分的内容:
(1)请求行
格式: Method Request-URI HTTP-Version CRLF
Method::表示请求方法,方法表示需要让服务器完成怎样的操作。其中典型的操作包括读取URI表示的数据、将客户端输入的数据发送给RUI表示的程序等。常见的方法有:
①GET:表示获取URI指定的信息。
②POST:表示从客户端向服务器发送数据。一般用于发送表单中的填写的数据等情况。
③DELETE:表示删除URI指定服务器上的文件。
④PUT:表示替换RUI指定服务器上的文件,若URI指定的文件不存在,则创建该文件。
⑤HEAD:表示获取URI指定的信息头,并不返回信息内容。
⑥OPTIONS:用于通知或查询通信选项。
⑦TRACE:将服务器收到的请求行和头部直接返回给客户端。该方法主要用于在使用代理的环境中检查改写请求的情况。
⑧CONNECT:使用代理传输加密消息时使用的方法。
Request-URI:URI是Uniform Resource Identifier的缩写,称统一资源标识符,URI用字符串标识某一互联网资源。
HTTP-Version:表示当前使用的HTTP协议的版本
(2)请求消息头
请求消息头是用于向服务器端传递客户端自身的信息以及用户的附加信息。这些信息可以帮助服务器端更好的识别用户的请求,以提供对应的响应内容。请求消息头中涉及安全的内容有:
①Host:主要用于指定被请求资源的Internet主机和端口号,即标识请求目标。
②Content-Length:标识当前请求包中的内容长度。
③Origin:标识本次请求的发起源,只适用于POST方法。
④Referer:标识当前请求的发起页面。
⑤Accept:用于指定客户端接收哪些类型的信息。
⑥Accept-Encoding:告知服务器端当前客户端可接受的内容编码。
⑦Accept-Language:告知服务器端支持的语言类型。
⑧User-Agent:用于告知服务器当前访问者的情况,包括当前用户的操作系统、浏览器等的基本信息。
- 请求正文
请求正文即HTTP传输的信息。
2:HTTP响应头的结构和内容
服务器端接收到客户端的请求包后,会根据包中的请求内容进行处理,并生成HTTP响应消息。HTTP响应包由响应行、响应消息头/响应消息报头、响应正文组成。
(1)响应行
格式: HTTP-Version Status-code Reason-Phrase
HTTP-Version:标识当前所使用的HTTP版本
Status-code:表示服务器发回的响应状态码,用于告知客户端服务器对本次请求的响应状态。常见的状态码有:
A:1xx 表示提示信息,说明请求已被成功接收,继续处理。
B: 2xx 表示成功,说明请求已被成功接收、理解、接受。
① 200 OK 表示客户端请求成功 ②203 Temporarily Moved页面临时重定向
C:3xx 表示重定向,说明要完成请求必须进行更进一步的处理。
①301 Permanently Moved 页面重定向
D:4xx 表示客户端错误,说明有语法错误或请求无法实现。
①400 Bad Request 客户端请求有语法错误,不能被服务器所理解。
②401 Unauthorized 请求未经授权
③403 Forbidden 服务器收到请求,但拒绝提供服务。
④404 Not Found 请求资源不存在,或者请求无法实现。
E:5xx 表示服务端错误,服务器处理请求时出错。
①500 Internal Server Error 服务器发生不可预期的错误。
②503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
- 响应消息头
响应消息头允许服务器传递不能放在响应行中的附加响应消息,以及关于服务器的信息和Request-URI所标识的资源进行下一步访问的信息。常见的响应消息头中的内容有:
①Server:用于告知客户端提供本次响应的服务器端用于处理请求的软件信息。
②X-Powered-By:用于标识实现当前Web站点所采用的语言及版本号。
③Set-cookie:根据响应包生成Cookie,并提供给客户端。
④Content-Length:用于标识当前响应包中的内容长度。
- 响应正文
响应包中的正文内容,会携带当前页面的源码。
四:推荐书籍
A:HTTP协议相关
(1)《图解HTTP》——上野宣[日]
(2)《HTTP权威指南》——David Gourley, Brian Totty等[美]
(3)《TCP/IP 详解 卷1:协议》—— W.Richard Stevens等[美]
B:网络科普相关
(1)《网络是怎样链接的》——户根勤[日]
(2)《计算机网络》——谢希仁