HTTP简介、工作原理、消息结构及头部



一、HTTP简介

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW)服务器传输超文本到本地浏览器的传送协议。
在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。浏览器和服务器之间的传输协议是HTTP,用于了浏览器和服务器的通信。
一个HTTP"服务器"同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器等),通过接收客户端的请求并向客户端发送HTTP响应数据。HTTP使用统一资源标识符(URI)来传输数据和建立连接。


二、HTTP工作原理

HTTP协议工作在客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端(WEB服务器)发送请求。web服务端根据接收的请求,向客户端发送响应请求。

HTTP默认端口号是80。

2.1、HTTP协议有三个特点:

1、HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

2、HTTP是独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。

3、HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

2.2、HTTP协议通信流程:

1.浏览器------->服务器-------->CGI(通用网关接口)Program------->数据库
2.数据库-------> CGI(通用网关接口)Program-------->服务器------->浏览器


三、HTTP的消息结构

3.1、客户端请求消息

主要由4个部分组成:
①请求行:指定了请求方法,请求地址和使用的协议版本

POST /fannuo_3.5/admin/cms_channel_edit.php?id=1 HTTP/1.1

②请求头部

Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://127.0.0.1/fannuo_3.5/admin/cms_channel_edit.php?id=1
Content-Type: application/x-www-form-urlencoded
Content-Length: 11963
Origin: http://127.0.0.1
DNT: 1
Connection: close
Cookie: admin_name=admin; admin_password=21232f297a57a5a743894a0e4a801fc3; PHPSESSID=3kq9ntuheuupt7no8ht3esmdlu; phpecmsupload=allow
Upgrade-Insecure-Requests: 1

③空行:空行分隔开请求头部和请求数据

④请求数据

c_name=%E5%85%B3%E4%BA%8E%E6%88%91%E4%BB%AC&c_parent=0&c_nname=&c_nav=1&c_cmodel=c_spage.php&c_dmodel=d_normal.php&c_mcmodel=c_mspage.php&c_mdmodel=d_mnormal.php&c_content=%3Cp+style%3D%22margin-top%3A0px%3Bmargin-bottom%3A0px%3Bwhite-space%3Anormal%3B%22%3E%0D%0A%09%3Cbr+

在这里插入图片描述

3.2、服务端响应消息

主要由4个部分组成:
①状态行:使用的协议及版本,响应码

HTTP/1.1 200 OK

②消息报头

Date: Fri, 18 Dec 2020 06:26:45 GMT
Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a mod_log_rotate/1.02
X-Powered-By: PHP/7.3.4
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Connection: close
Content-Type: text/html; charset=utf-8
Content-Length: 107

③空行:分隔开响应头部和响应数据

④响应正文

<script type="text/javascript">alert("频道修改成功!");window.location.href="cms_channel.php"</script>

在这里插入图片描述


四、HTTP的头部信息

根据不同上下文,可将消息头分为:

1、General headers(通用标头): 同时适用于请求和响应消息,但与最终消息主体中传输的数据无关的消息头。

2、Request headers: 包含更多有关要获取的资源或客户端本身信息的消息头。

3、Response headers: 包含有关响应的补充信息,如其位置或服务器本身(名称和版本等)的消息头。

4、Entity headers(实体标头): 包含有关实体主体的更多信息,比如主体长(Content-Length)度或其MIME类型。

以下消息头按照英文字母排序列出:

消息头描述
Accept用户代理期望的MIME 类型列表
Accept-CH列出配置数据,服务器可据此来选择适当的响应。
Accept-Charset列出用户代理支持的字符集。现在,UTF-8得到了很好的支持,是编码字符的首选方法,并且通过减少基于配置的熵来保证更好的隐私性,大部分浏览器省略了Accept-Charset标头
Accept-CH-Lifetime仅在Chrome 61或更高版本中可用
Accept-Encoding列出用户代理支持的压缩方法。
Accept-Features
Accept-Language列出用户代理期望的页面语言。
Accept-Ranges标识自身支持范围请求(partial requests)。字段的具体值用于定义范围请求的单位。当浏览器发现 Accept-Ranges 头时,可以尝试继续中断了的下载,而不是重新开始。
Access-Control-Allow-Credentials指定了当浏览器的credentials设置为true时是否允许浏览器读取response的内容。当用在对preflight预检测请求的响应中时,它指定了实际的请求是否可以使用credentials。请注意:简单 GET 请求不会被预检;如果对此类请求的响应中不包含该字段,这个响应将被忽略掉,并且浏览器也不会将相应内容返回给网页。
Access-Control-Allow-Origin指定一个来源,告诉浏览器允许该来源访问资源;内容为“ *”通配符,浏览器则允许任何来源访问资源。
Access-Control-Allow-Methods用于预检请求的响应。其指明了实际请求所允许使用的 HTTP 方法。
Access-Control-Allow-Headers用于预检请求的响应。其指明了实际请求中允许携带的首部字段。
Access-Control-Expose-Headers在跨源访问时,XMLHttpRequest对象的getResponseHeader()方法只能拿到一些最基本的响应头,Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma,如果要访问其他头,则需要服务器设置本响应头。Access-Control-Expose-Headers 头让服务器把允许浏览器访问的头放入白名单。
Access-Control-Max-Age指定了preflight请求的结果能够被缓存多久。Access-Control-Max-Age: 。delta-seconds参数表示结果可以缓存的秒数。
Access-Control-Request-Method用于预检请求。其作用是,将实际请求所使用的 HTTP 方法告诉服务器。
Access-Control-Request-Headers用于预检请求。其作用是,将实际请求所携带的首部字段告诉服务器。
Age包含对象在缓存代理中存贮的时长,以秒为单位。Age的值通常接近于0。表示此对象刚刚从原始服务器获取不久;其他的值则是表示代理服务器当前的系统时间与此应答中的通用头 Date 的值之差。
Allow用于枚举资源所支持的 HTTP 方法的集合
Alternates
Authorization请求消息头含有服务器用于验证用户代理身份的凭证,通常会在服务器返回401 Unauthorized 状态码以及WWW-Authenticate 消息头之后在后续请求中发送此消息头。
Cache-Control通用消息头字段,被用于在http请求和响应中,通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求中设置的指令,不一定被包含在响应中。
Connection决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。
Content-Encoding是一个实体消息首部,用于对特定媒体类型的数据进行压缩。当这个首部出现的时候,它的值表示消息主体进行了何种方式的内容编码转换。这个消息首部用来告知客户端应该怎样解码才能获取在 Content-Type 中标示的媒体类型内容。
Content-Language是一个 entity header (实体消息首部),用来说明访问者希望采用的语言或语言组合,这样的话用户就可以根据自己偏好的语言来定制不同的内容。
Content-Length是一个实体消息首部,用来指明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目。
Content-Location指定的是要返回的数据的地址选项。最主要的用途是用来指定要访问的资源经过内容协商后的结果的URL。
Content-MD5未实现
Content-Range响应首部,显示的是一个数据片段在整个文件中的位置。
Content-Security-Policy允许站点管理者控制用户代理能够为指定的页面加载哪些资源。除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点。这将帮助防止跨站脚本攻击(Cross-Site Script)(XSS)。
Content-Type实体头部用于指示资源的MIME类型 media type
Cookie一个请求首部,其中含有先前由服务器通过 Set-Cookie 首部投放并存储到客户端的 HTTP cookies。
DNT设置该变量1,指定用户明确退出任何形式的网上跟踪。
Date是一个通用首部,其中包含了报文创建的日期和时间。
ETagHTTP响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web服务器不需要发送完整的响应。而如果内容发生了变化,使用ETag有助于防止资源的同时更新相互覆盖(“空中碰撞”)。
Expect是一个请求消息头,包含一个期望条件,表示服务器只有在满足此期望条件的情况下才能妥善地处理请求。规范中只规定了一个期望条件,即 Expect: 100-continue, 对此服务器可以做出如下回应:100 如果消息头中的期望条件可以得到满足,使得请求可以顺利进行的话,417 (Expectation Failed) 如果服务器不能满足期望条件的话;也可以是其他任意表示客户端错误的状态码(4xx)。
Expires响应头包含日期/时间, 即在此时候之后,响应过期。无效的日期,比如 0, 代表着过去的日期,即该资源已经过期。如果在Cache-Control响应头设置了 “max-age” 或者 “s-max-age” 指令,那么 Expires 头会被忽略。
From包含一个电子邮箱地址,这个电子邮箱地址属于发送请求的用户代理的实际掌控者的人类用户。
HostHost 请求头指明了请求将要发送到的服务器主机名和端口号。如果没有包含端口号,会自动使用被请求服务的默认端口(比如HTTPS URL使用443端口,HTTP URL使用80端口)。
If-Match表示这是一个条件请求。在请求方法为 GET 和 HEAD 的情况下,服务器仅在请求的资源满足此首部列出的 ETag值时才会返回资源。而对于 PUT 或其他非安全方法来说,只有在满足条件的情况下才可以将资源上传。
If-Modified-Since是一个条件式请求首部,服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 200 。如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 304 响应,而在 Last-Modified 首部中会带有上次修改时间。 不同于 If-Unmodified-Since, If-Modified-Since 只可以用在 GET 或 HEAD 请求中。 当与 If-None-Match 一同出现时,它(If-Modified-Since)会被忽略掉,除非服务器不支持 If-None-Match。
If-None-Match是一个条件式请求首部。对于 GETGET 和 HEAD 请求方法来说,当且仅当服务器上没有任何资源的 ETag 属性值与这个首部中列出的相匹配的时候,服务器端会才返回所请求的资源,响应码为 200 。对于其他方法来说,当且仅当最终确认没有已存在的资源的 ETag 属性值与这个首部中所列出的相匹配的时候,才会对请求进行相应的处理。
If-Range用来使 Range 头字段在一定条件下起作用:当字段值中的条件得到满足时,Range 头字段才会起作用,同时服务器回复206 部分内容状态码,以及Range 头字段请求的相应部分;如果字段值中的条件没有得到满足,服务器将会返回 200 OK 状态码,并返回完整的请求资源。
If-Unmodified-Since用于请求之中,使当前请求成为条件式请求:只有当资源在指定的时间之后没有进行过修改的情况下,服务器才会返回请求的资源,或是接受 POST 或其他 non-safe 方法的请求。如果所请求的资源在指定的时间之后发生了修改,那么会返回 412 (Precondition Failed) 错误。
Last-Event-ID给定服务器在先前HTTP连接上接收的最后事件的ID。用于同步文本/事件流。
Last-Modified是一个响应首部,其中包含源头服务器认定的资源做出修改的日期及时间。 它通常被用作一个验证器来判断接收到的或者存储的资源是否彼此一致。由于精确度比 ETag 要低,所以这是一个备用机制。包含有 If-Modified-Since 或 If-Unmodified-Since 首部的条件请求会使用这个字段。
Link提供了序列化HTTP头部链接的方法。它在语义上与HTML元素 相等。但它是在HTTP层上,指定一个与获取的资源相关的URL以及关系的种类。
Location指定的是需要将页面重新定向至的地址。一般在响应码为3xx的响应中才会有意义。
Max-Forwards
Negotiate
Origin首部字段表明预检请求或实际请求的源站。
Pragma是一个在 HTTP/1.0 中规定的通用首部,这个首部的效果依赖于不同的实现,所以在“请求-响应”链中可能会有不同的效果。它用来向后兼容只支持 HTTP/1.0 协议的缓存服务器,那时候 HTTP/1.1 协议中的 Cache-Control 还没有出来。
Proxy-Authenticate是一个响应首部,指定了获取 proxy server (代理服务器)上的资源访问权限而采用的身份验证方式。代理服务器对请求进行验证,以便它进一步传递请求。Proxy-Authenticate 首部需要与 407 Proxy Authentication Required 响应一起发送。
Proxy-Authorization是一个请求首部,其中包含了用户代理提供给代理服务器的用于身份验证的凭证。这个首部通常是在服务器返回了 407 Proxy Authentication Required 响应状态码及 Proxy-Authenticate 首部后发送的。
Range是一个请求首部,告知服务器返回文件的哪一部分。在一个 Range 首部中,可以一次性请求多个部分,服务器会以 multipart 文件的形式将其返回。如果服务器返回的是范围响应,需要使用 206 Partial Content 状态码。假如所请求的范围不合法,那么服务器会返回 416 Range Not Satisfiable 状态码,表示客户端错误。服务器允许忽略 Range 首部,从而返回整个文件,状态码用 200 。
Referer包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。
Retry-After表示用户代理需要等待多长时间之后才能继续发送请求。当与 503 (Service Unavailable,当前服务不存在) 响应一起发送的时候,表示服务下线的预期时长。当与重定向响应一起发送的时候,比如 301 (Moved Permanently,永久迁移),表示用户代理在发送重定向请求之前需要等待的最短时间。
Sec-Websocket-Extensions
Sec-Websocket-Key包含base64编码的值,如果已解码,则为16个字节在长度上。此(编码)值用于创建服务器握手以表明已接受连接。服务器不必使用base64-解码Sec-WebSocket-Key值。
Sec-Websocket-Origin指示建立连接。原点序列化为ASCII并转换小写。服务器可以将此信息用作如果服务器未验证来源,它将接收来自任何地方的连接。
Sec-Websocket-Protocol它表示服务器选择的子协议。网络浏览器验证服务器包含的值之一是WebSocket客户端的握手。服务器子协议必须确保它根据客户的选择 握手并在其握手中指定它。
Sec-Websocket-Version包括客户端的WebSocket协议版本。如果这个版本没有匹配服务器可以理解的版本,服务器必须终止WebSocket连接。服务器可以发送非200
Server包含了处理请求的源头服务器所用到的软件相关信息。应该避免使用过长或者过于详细的描述作为 Server 的值,因为这有可能泄露服务器的内部实现细节,有利于攻击者找到或者探测已知的安全漏洞。
Set-Cookie用来由服务器端向客户端发送 cookie
Set-Cookie2已废弃
Strict-Transport-Security告知浏览器强制使用HTTPS代替HTTP
TCN
TE请求型头部用来指定用户代理希望使用的传输编码类型。(可以将其非正式称为 Accept-Transfer-Encoding, 这个名称显得更直观一些)。
Trailer是一个响应首部,允许发送方在分块发送的消息后面添加额外的元信息,这些元信息可能是随着消息主体的发送动态生成的,比如消息的完整性校验,消息的数字签名,或者消息经过处理之后的最终状态等。
Transfer-Encoding消息首部指明了将 entity 安全传递给用户所采用的编码形式。Transfer-Encoding 是一个逐跳传输消息首部,即仅应用于两个节点之间的消息传递,而不是所请求的资源本身。一个多节点连接中的每一段都可以应用不同的Transfer-Encoding 值。如果你想要将压缩后的数据应用于整个连接,那么请使用端到端传输消息首部 Content-Encoding 。
Upgrade用于将已经建立的客户端/服务器连接升级到其他协议(通过相同的传输协议)。例如,客户端可以使用它来将连接从HTTP 1.1升级到HTTP 2.0,或者将HTTP或HTTPS连接升级到WebSocket。HTTP / 2明确禁止使用此机制/标头;它特定于HTTP / 1.1。
User-Agent
Variant-Vary
Vary列出了使用Web服务器选择特定内容的条件的标头。此服务器对于高效和正确缓存发送的资源很重要。
Via是一个通用首部,是由代理服务器添加的,适用于正向和反向代理,在请求和响应首部中均可出现。这个消息首部可以用来追踪消息转发情况,防止循环请求,以及识别在请求或响应传递链中消息发送者对于协议的支持能力。
Warning是一个通用报文首部,包含报文当前状态可能存在的问题。在响应中可以出现多个 Warning 首部。一般来说, Warning 首部可以应用于任何类型的报文。然而一部分警告码(warn-code)是为缓存代理服务器定制的,并且只可以应用在响应报文中。
WWW-Authenticate定义了使用何种验证方式去获取对资源的连接。WWW-Authenticate header通常会和一个 401 Unauthorized 的响应一同被发送。
X-Content-Duration为Ogg媒体配置服务器
X-Content-Security-Policy使用 内容安全策略
X-DNSPrefetch-Control控制着浏览器的 DNS 预读取功能。 DNS 预读取是一项使浏览器主动去执行域名解析的功能,其范围包括文档的所有链接,无论是图片的,CSS 的,还是 JavaScript 等其他用户能够点击的 URL。
X-Frame-Options是用来给浏览器 指示允许一个页面 可否在 , , 或者 中展现的标记。站点可以通过确保网站没有被嵌入到别人的站点里面,从而避免 clickjacking 攻击。
X-Requested-With通常在值为“XMLHttpRequest”时使用
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七天啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值