HTTP(Hypertext Transfer Protocol)是一种用于在计算机网络上传输超文本数据的应用层协议。它是构成万维网的基础之一,被广泛用于万维网上的数据通信。(超文本(Hypertext)是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。)
不要被官方性语言吓到,简单来说,网络上传输东西有一定的规则, 就像收发快递有包装、贴码等标准一样,我们在网络上传递的信息也会有一定的标准,而HTTP就是网络上传输多种信息的标准(不仅仅是文本,所以叫超文本)。
那这个“标准“具体都有啥呢?从下图可以看出HTTP包含了请求、响应及会话三个部分,下面我们分别进行讲解。
一、HTTP 请求
当我们在浏览器中输入网址并回车后,浏览器会向服务器发送一个 HTTP 请求。这个请求由多个部分组成,其中最重要的是请求行、头部和正文。
1、请求行:
请求行包含三个部分,分别是请求方法、请求 URI 和 HTTP 版本号。
1)请求方法指定了客户端想要执行的动作,例如 GET、POST、PUT、DELETE 等。
2)请求 URI 指定了要访问的资源的位置,也就是我们想要的信息的存放地。
3)HTTP 版本号表示请求所使用的 HTTP 协议版本,往往是HTTP1.1,了解即可。
2、头部:
包含了一系列的键值对,用于向服务器传递一些请求信息。例如,Accept 表示客户端可以接受的响应内容类型,User-Agent 表示客户端的浏览器信息,Referer 表示客户端从哪个页面跳转而来等等。
3、正文:
正文是可选的(有的有正文,有的没有,get就没有请求正文),用于向服务器传递一些数据。例如,当客户端向服务器提交表单时,表单数据就可以放在请求的正文中。
4、HTTP 请求报文(实际应用)
上面我们已经讲了HTTP请求的格式和内容,下面我们讲一下HTTP请求在实际传输过程中是什么样子的。
HTTP请求报文组成部分(再简述一下上面的理论):
1)请求行(必须在 HTTP 请求报文的第一行)
2)请求头(即头部,从第二行开始,到第一个空行结束。请求头和请求体之间存在一个空行,是键值对)
3)请求体(即正文,通常以键值对 {key:value}方式传递数据)
下面是HTTP请求进行传递时的样子,
这段请求的意思就是:以POST方式请求访问某台 HTTP 服务器上的 /form/login 页面资源,并附带参数 name = veal、age = 37,是HTTP1.1版本,请求体长度为16
二、HTTP 响应
当服务器收到客户端的请求后,它会向客户端返回一个 HTTP 响应。与请求类似,响应也由多个部分组成,其中最重要的是状态行、头部和正文。
1、状态行:
状态行包含三个部分,分别是 HTTP 版本号、状态码和状态短语。
1)HTTP 版本号表示响应所使用的 HTTP 协议版本。
2)状态码是一个三位数字,用于表示服务器对请求的处理结果。常见的状态码有 200 表示成功、404 表示未找到资源、500 表示服务器内部错误等等。HTTP 定义了很多状态码,用于表示服务器对请求的处理结果。这些状态码被分成 5 类,分别是 1xx、2xx、3xx、4xx 和 5xx。
其中,
1xx 表示信息类状态
2xx 表示成功状态,例如 200 表示成功,201 表示资源创建成功。
3xx 表示重定向状态,例如 301 表示永久重定向,302 表示临时重定向。
4xx 表示客户端错误状态,例如 400 表示请求格式错误,401 表示未授权,404 表示未找到资源等等。
5xx 表示服务器错误状态,例如 500 表示服务器内部错误,503 表示服务器暂时无法处理请求等等。
常见状态码及其含义:
3)状态短语是对状态码的简短描述,例如 200 对应的状态短语是 OK,404 对应的状态短语是 Not Found。
2、头部:
包含了一系列的键值对,用于向客户端传递一些响应信息。
例如,Content-Type 表示响应内容的类型,Content-Length 表示响应内容的长度,Set-Cookie 表示服务器要求客户端保存一个 Cookie 等等。
3、正文:
响应的实际内容。例如,当客户端请求一个网页时,网页的 HTML 代码就可以放在响应的正文中。
4、响应报文(实际应用)
HTTP 的响应报文组成部分:
1)响应行(必须在 HTTP 响应报文的第一行)报文协议及版本,状态码及状态描述
2)响应头(从第二行开始,到第一个空行结束。响应头和响应体之间存在一个空行,是键值对)
3)响应体
例,
在响应行开头的 HTTP 1.1 表示服务器对应的 HTTP 版本。紧随的 200 OK 表示请求的处理结果的“状态码”和“原因短语”。
三、HTTP 会话(cookie、session)
从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话。会话技术就是记录这次会话中客户端的状态和数据的。
简单来说,一次会话就是你与某个网站进行了一次完整的交流,这个交流可能会你来我往很多次(一次会话可能会有很多次请求、响应,就像人与人的一次会话会有很多对话)。
HTTP 是一种无状态协议,这意味着每次请求都是独立的,服务器不会记录客户端的状态信息。为了实现状态管理,HTTP 引入了 Cookie 和 Session 机制。
简单来说,你和网站服务器又不和人一样能面对面互相见到,它怎么知道你是你?cookie与session就相当于我们双方的“脸部特征”,让我们能够互相认识,而不用每说一句之前都得重新“自我介绍“。
1、通俗介绍:
1)Session:由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是 Session。
典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的 Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。
这个 Session是保存在服务端的,有一个唯一标识。在服务端保存 Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑 Session的转移,在大型的网站一般会有专门的 Session服务器集群,用来保存用户会话,这个时候 Session信息都是放在内存的,使用一些缓存服务比如 Memcached之类的来放 Session。
2)Cookie:思考一下服务端如何识别特定的客户?这个时候 Cookie就登场了。
每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie来实现 Session跟踪的,第一次创建 Session的时候,服务端会在HTTP协议中告诉客户端,需要在Cookie里面记录个SessionID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。
设想你某次登陆过一个网站,只需要登录一次就可以在一定时间内浏览这个网站的所有内容,这是如何做到的?也是 Cookie
Cookie是指某些网站为了辨别用户身份而储存在客户端上的数据(通常经过加密)。也就是说,只要有了某个用户的 cookie,就能以他的身份登录。
2、官方介绍
1)Cookie 是一种在客户端保存状态信息的机制。服务器可以通过 Set-Cookie 头部向客户端发送一个 Cookie,客户端在下一次请求时将该 Cookie 发送回服务器。服务器可以根据 Cookie 的内容来识别客户端的身份,从而实现状态管理。
2)Session 是一种在服务器保存状态信息的机制。服务器在接收到客户端的请求时,为该客户端创建一个 Session 对象,并将该对象的 ID 保存在一个 Cookie 中发送给客户端。客户端在下一次请求时将该 Cookie 发送回服务器,服务器根据 Cookie 中的 Session ID 来查找该客户端对应的 Session 对象,从而实现状态管理。
3)其中工作原理大致如下:
客户端请求服务端
服务端开启会话,并下发一个特殊的COOKIE(会话的唯一标识符), 服务端将会话数据存储在指定位置
客户端收到服务端响应内容,并且保存这个COOKIE
客户端在下一次请求服务端时带上这个COOKIE,服务端根据这个唯一标识符读取相关会话数据,恢复会话的状态
3、基于COOKIE、SESSION能做什么?
有了COOKIE,我们能存储SESSION在浏览器端的唯一标识,能存储其他各种不敏感的数据。
有了SESSION,我们能对同一个用户的连续访问行为进行识别,用户可以 避免重复登录的烦恼,比如你在PC上登录天猫,就能很欢乐的连续买买买,而不用买一件登录一次。
简单来说,有了COOKIE、SESSION,我们就能进行连续请求与响应(与服务器已经“互相认识”),不用每次请求之前都得重新登录
四、相关练习
这里有几道不错的CTF题,大家可以找着做一下。
攻防世界的:
web基础-攻防世界-CSDN博客
CTFHub技能树的(作者以后会出CTFHub技能树的专栏,希望小伙伴们多多支持):
web-前置技能(HTTP协议)-CTFHub-CSDN博客
参考文献:
HTTP 的工作原理
HTTP协议演进与各版本特性
计算机网络——HTTP协议原理-CSDN博客