HTTP:Hypertext Transfer Protocol

URL

URL的定义:Uniform Resource Locator,统一资源定位器是因特网的万维网服务程序上用于指定信息位置的表示方法。在WWW上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL,它是WWW的统一资源定位标志,就是指网络地址(就是我们俗称的网址)。

URL结构组成:

1
http:\\host[:port][abs_path][?query]#fragment

协议:告诉浏览器使用何种协议,常用的是http协议或https协议
主机(host):域名或ip,指示需要向网络上哪一台发起请求
端口(port):表示用于访问WEB服务器上资源的入口,如果访问的该 Web 服务器使用HTTP协议的标准端口(HTTP为80,HTTPS为443)授予对其资源的访问权限,则通常省略此部分。
路径(abs_path):web服务器上资源的路径,以端口后第一个/开始,到?结束
查询参数(query):提供给web服务器的额外参数,如果为GET请求一般URL带有查询参数
锚点(fragment):给予浏览器显示位于该点的内容的指示,其片段标识符不会与请求一起发送到服务器
URL结构示例:

1
http://202.108.22.5:80/wann/x.html

http:// 表示一种HTTP协议(Hypertext Transfer Protocol,超文本传输协议)是因特网应用最广泛的一种传输协议,所以的
www文件都必须遵守这个协议。
202.108.22.5:服务器地址(IP地址),标识网络上的唯一一台电脑。202.108.22.5 是百度的服务器地址。
www.baidu.com 域名,标识网络上的唯一一台电脑。服务器地址和域名实际上有着对应关系,在Web应用中,域名和ip地址的关系是域名为了代替IP地址作为网址提供网站的访问入口。电脑通过dns服务器,把域名转化成ip地址,电脑再通过ip地址进行通讯,把”网站”呈现给用户。
/wann/x.html:是带层次的文件路径(path)。路径可以是相对路径也可以是绝对路径,以/开头的是绝对路径,其他的是相对
路径。
http://202.108.22.5:80/wann/x.html 可以写成202.108.22.5/wann/x.html或者baidu.com/wann/x.html
注:
我们通常接触的都是网站的域名,这是因为:
1.域名形式易记忆,比IP地址有更多的选择。
2.一个ip地址可以有很多个域名,一个域名理论上只有一个ip地址。(每台服务器的IP是唯一的,每台服务器可以绑定很多域名,每个域名都是可以解析到这台服务器的IP,这样就可以实现很多域名访问同一台服务器。)
3.服务器IP地址改变时,直接更改域名解析即可,无需告诉访问用户新的IP地址。

HTTP 请求 URL

我们再通过一个完整的域名解析一下URL:
例如:http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument
第一个出场的时http:
http://告诉浏览器使用何种协议。对于大部分 Web 资源,通常使用 HTTP协议或其安全版本,HTTPS 协议。另外,浏览器也知道如何处理其他协议。例如,mailto:协议指示浏览器打开邮件客户端;ftp:协议指示浏览器处理文件传输。

第二个出场的是主机:
www.example.com 既是一个域名,也代表管理该域名的机构。它指示了需要向网络上的哪一台主机发起请求。当然,也可以直接向主机的IPaddress 地址发起请求。但直接使用 IP 地址的场景并不常见。

第三个出场的是端口:
我们前面说到,两个主机之间要发起TCP连接需要两个条件,主机+端口。它表示用于访问Web服务器上资源的入口。如果访问的该Web服务器使用HTTP协议的标准端口(HTTP为80,HTTPS为443)授予对其资源的访问权限,则通常省略此部分。否则端口就是 URI 必须的部分。

第四个出场的是路径:
/path/to/myfile.html 是 Web 服务器上资源的路径。以端口后面的第一个 / 开始,到 ? 号之前结束,中间的 每一个/ 都代表了层级(上下级)关系。这个 URL 的请求资源是一个 html 页面。

第五个出场的是查询参数:
?key1=value1&key2=value2 是提供给 Web 服务器的额外参数。如果是 GET 请求,一般带有请求 URL 参数,如果是 POST 请求,则不会在路径后面直接加参数。这些参数是用 & 符号分隔的键/值对列表。key1 = value1 是第一对,key2 = value2 是第二对参数。

第六个出场的是锚点:
#SomewhereInTheDocument是资源本身的某一部分的一个锚点。锚点代表资源内的一种“书签”,它给予浏览器显示位于该“加书签”点的内容的指示。例如,在HTML文档上,浏览器将滚动到定义锚点的那个点上;在视频或音频文档上,浏览器将转到锚点代表的那个时间。值得注意的是 # 号后面的部分,也称为片段标识符,永远不会与请求一起发送到服务器。

HTTP报文

HTTP 协议主要由三大部分组成:
起始行(start line):描述请求或响应的基本信息;
头部字段(header):使用 key-value 形式更详细地说明报文;
消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。

请求行



HTTP 请求方法一般分为 8 种,它们分别是:
1.GET 获取资源,GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保持原样返回;
2.POST 传输实体,虽然 GET 方法也可以传输主体信息,但是便于区分,我们一般不用 GET 传输实体信息,反而使用 POST 传输实体信息,
3.PUT 传输文件,PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。但是,鉴于 HTTP 的 PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题,因此一般的 W eb 网站不使用该方法。若配合 W eb 应用程序的验证机制,或架构设计采用REST(REpresentational State Transfer,表征状态转移)标准的同类 Web 网站,就可能会开放使用 PUT 方法。
4.HEAD 获得响应首部,HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认 URI 的有效性及资源更新的日期时间等。
5.DELETE 删除文件,DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方法按请求 URI 删除指定的资源。
6.OPTIONS 询问支持的方法,OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。
7.TRACE 追踪路径,TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法。
8.CONNECT 要求用隧道协议连接代理,CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security传输层安全)协议将传输
内容加密后通过网络隧道传输。

请求头部(客户端)


Host:
Host 请求头指明了服务器的域名(对于虚拟主机来说),以及(可选的)服务器监听的TCP端口号。如果没有给定端口号,会自动使用被请求服务的默认端口(比如请求一个 HTTP 的 URL 会自动使用80作为端口)。

Referer:
HTTP Referer 属性是请求标头的一部分,当浏览器向 web 服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。

1
Referer: https://developer.mozilla.org/testpage.html

可以用于防范CSRF攻击

User-Agent:
首部字段 User-Agent 会将创建请求的浏览器和用户代理名称等信息传达给服务器。

1
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0

Accept:
告诉WEB服务器客户端能够接收的MIME类型(指一系列消息内容类型的集合,咱们在upload-labs里面就有遇到过)
文本文件: text/html、text/plain、text/css、application/xhtml+xml、application/xml
图片文件: image/jpeg、image/gif、image/png
视频文件: video/mpeg、video/quicktime
应用程序二进制文件: application/octet-stream、application/zip
/ 表示任何类型,type/* 表示该类型下的所有子类型

Accept-Charset:
表示客户端可以接受的字符编码

Accept-Encoding:
表示HTTP标头会明白客户端希望服务端返回的内容编码;浏览器通知服务器,浏览器支持的数据压缩格式。如GZIP压缩

1
2
3
4
5
6
7
8
Accept-Encoding: gzip // 由文件压缩程序 gzip 生成的编码格式
Accept-Encoding: compress //使用Lempel-Ziv-Welch(LZW)算法的压缩格式
Accept-Encoding: deflate //使用 zlib 结构和 deflate 压缩算法的压缩格式
Accept-Encoding: br //使用 Brotli 算法的压缩格式
Accept-Encoding: identity
Accept-Encoding: * //匹配标头中未列出的任何内容编码,如果没有列出 Accept-Encoding,这个就是默认值,但并不表示
支持所有算法
Accept-Encoding: deflate, gzip;q=1.0, *;q=0.5 //采用权重 q 值来表示相对优先级

Accept-Language:
表示客户端需要服务端返回的语言类型。浏览器通知服务器,浏览器支持的语言。各国语言(国际化i18n)

From:
请求头用来告知服务器使用用户代理的电子邮件地址。例如:From:webmaster@example.org咱们在2022极客大挑战中就有遇到这样的题目

Authorization:
请求头用于向服务器认证用户代理的凭据,通常用在服务器以401未经授权状态和WWW-Authenticate标头响应之后;用来告知服务器,用户的认证信息,服务端只有收到认证之后才会返回给客户端 200 OK的响应;如果没有认证信息,则返回401告诉客户需
要认证信息。

Expect:
指示服务器要满足期望才能正确处理请求。如果服务器没有办法完成客户端的所期望完成的事且服务器存在错误的话,会返回417;如果可以满足的话会返回100

Cache-Control:
no-cache(不要缓存的实体,要求现在从WEB服务器去取)
max-age:(只接受 Age 值小于 max-age 值,并且没有过期的对象)
max-stale:(可以接受过去的对象,但是过期时间必须小于 max-stale 值)
min-fresh:(接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象)
响应:public(可以用 Cached 内容回应任何用户)
private(只能用缓存内容回应先前请求该内容的那个用户)
no-cache(可以缓存,但是只有在跟WEB服务器验证了其有效后,才能返回给客户端)
max-age:(本响应包含的对象的过期时间)
ALL: no-store(不允许缓存)

Connection:
close(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了)。
keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求)。
响应:close(连接已经关闭)。
keepalive(连接保持着,在等待本次连接的后续请求)。
Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒)。例如:Keep-Alive:300

Proxy-Authorization:
Proxy-Authorization 是属于请求与认证的范畴,我们在上面提到一个认证的 HTTP 标头是 Authorization,不同于 Authorization 发生在客户端 - 服务器之间;Proxy-Authorization发生在代理服务器和客户端之间。它表示接收到从代理服务器发来的认证时,客户端会发送包含首部字段 Proxy-Authorization 的请求,以告知服务器认证所需要的信息。

响应头部(服务器)


聊到响应头部,那就应该聊到响应码
以 2xx 为开头的都表示请求成功响应。
状态码 含义
200 成功响应
204 请求处理成功,但是没有资源可以返回
206 对资源某一部分进行响应,由Content-Range 指定范围的实体内容。

以 3xx 为开头的都表示需要进行附加操作以完成请求
状态码 含义
301 永久性重定向,该状态码表示请求的资源已经重新分配 URI,以后应该使用资源现有的 URI
302 临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
303 该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。
304 该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。
307 临时重定向。该状态码与 302 Found 有着相同的含义。

以 4xx 的响应结果表明客户端是发生错误的原因所在。
状态码 含义
400 该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
401 该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。
403 该状态码表明对请求资源的访问被服务器拒绝了。
404 该状态码表明服务器上无法找到请求的资源。

以 5xx 为开头的响应标头都表示服务器本身发生错误
状态码 含义
500 该状态码表明服务器端在执行请求时发生了错误。
503 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

响应头部:
Accept-Ranges:
Accept-Ranges HTTP 响应标头,这个标头有两个值;当服务器能够处理客户端发送过来的请求时,使用bytes 来指定,当服务
器不能处理客户端发来的请求时,使用 none 来指定

Age:
Age HTTP 响应标头告诉客户端源服务器在多久之前创建了响应,它的单位为秒,Age标头通常接近于0,如果是0则可能是从源服务器获取的,如果不是表示可能是由代理服务器创建,那么Age的值表示的是缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时必须加上首部字段 Age。

Server:
服务器标头包含有关原始服务器用来处理请求的软件的信息。应该避免使用过于冗长和详细的Server值,因为它们可能会泄露内部实施细节,这可能会使攻击者容易地发现并利用已知的安全漏洞。

Retry-After:
HTTP 响应标头 Retry-After 告知客户端需要在多久之后重新发送请求,使用此标头主要有如下三种情况
当发送 503(服务不可用)响应时,这表示该服务预计无法使用多长时间。
当发送 429(太多请求)响应时,这表示发出新请求之前要等待多长时间。
当发送重定向的响应像是 301(永久移动),这表示在发出重定向请求之前要求用户客户端等待的最短时间。
字段值可以指定为具体的日期时间,也可以是创建响应后所持续的秒数,例如

1
2
Retry-After: Wed, 21 Oct 2015 07:28:00 GMT
Retry-After: 120

Location:
Location 响应标头表示 URL 需要重定向页面,它仅仅与 3xx(重定向) 或 201(已创建) 状态响应一起使用。

Via:
列出从客户端到 OCS 或者相反方向的响应经过了哪些代理服务器,他们用什么协议(和版本)发送的请求。当客户端请求到达第一个代理服务器时,该服务器会在自己发出的请求里面添 加 Via 头部,并填上自己的相关信息,当下一个代理服务器收到第一个代理服务器的请求时,会在自己发出的请求里面复制前一个代理服务器的请求的Via头部,并把自己的相关信息加到后面,以此类推,当 OCS 收到最后一个代理服务器的请求时,检查Via头部,就知道该请求所经过的路由。例如:Via:1.0236.D0707195.sina.com.cn:80 (squid/2.6.STABLE13)

Vary:
WEB服务器用该头部的内容告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求。假如源WEB服务器在接到第一个请求消息时,其响应消息的头部为:Content-Encoding:gzip;Vary:Content-Encoding那么Cache服务器会分析后续请求消息的头部,检查其Accept-Encoding,是否跟先前响应的Vary头部值一致,即是否使用相同的内容编码方法,这样就可以防止 Cache 服务器用自己 Cache 里面压缩后的实体响应给不具备解压能力的浏览器。例如:Vary:Accept-Encoding

实体标头(不限于请求头或响应头)

Allow:
HTTP 实体标头 Allow 列出了资源支持的方法集合。如果服务器响应405 MethodNot Allowed状态码时来指示可以使用哪些
请求方法,则会发生此标头。

1
Allow: GET, POST, HEAD

这段代码表示服务器允许支持 GET 、POST 和 HEAD 方法。当服务器接收到不支持的 HTTP 方法时,会以状态码 405 Method Not Allowed 作为响应返回。

Content-Encoding:(WEB服务器表明自己使用了什么压缩方法压缩响应中的对象。)
我们上面讲过Accept-Encoding是客户端希望服务端返回的内容编码,但是实际上服务端返回给客户端的内容编码实际上是通过 Content-Encoding返回的。内容编码是指在不丢失实体信息的前提下所进行的压缩。主要也是四种,和Accept-Encoding 相同,它们是 gzip、compress、deflate、identity。下面是一组请求/响应内容压缩编码

1
2
Accept-Encoding: gzip, deflate
Content-Encoding: gzip

Content-Language:(WEB 服务器告诉浏览器自己响应的对象的语言)
首部字段 Content-Language 会告知客户端,服务器使用的自然语言是什么,它与 Accept-Language相对.

1
Content-Language: de-DE, en-CA

Content-Length:(WEB 服务器告诉浏览器自己响应的对象的长度)
Content-Length的实体标头指服务器发送给客户端的实际主体大小,以字节为单位。如下:服务器返回给客户端的主体大小是 3000 字节。

1
Content-Length: 3000

Content-Type:(WEB 服务器告诉浏览器自己响应的对象的类型。)
HTTP 响应标头 Content-Type 说明了实体内对象的媒体类型,和首部字段Accept一样使用,表示服务器能够响应的媒体类型

Expires:
HTTP Expires 实体标头包含日期时间,在该日期时间之后,响应被认为过期;在响应时间之内被认为有效。特殊的值比如0表示过去的日期,表示资源已过期。

1
Expires: Wed, 21 Oct 2015 07:28:00 GMT

后记

理解HTTP对于一个WEB手是基础之中的基础;它对我们在利用bp进行抓包过程中的响应消息有着非常重要的帮助,当然并不止在这个地方有用处;隔了这么久终于把这个坑给填上了,依旧记得当时在做22极客大挑战那题有关于HTTP题目的迷茫;所以了解并掌握HTTP对我们来说是十分重要的。
这一篇博客基本源于http://t.csdn.cn/sg8fl 感谢该位博主的分享让我对HTTP有了理解。
哈哈哈哈哈今天是平安夜,那就祝大家平安吧!