参考博客:https://cloud.tencent.com/developer/article/2183902

一、HTTP协议概述

HTTP(HyperText Transfer Protocol) 即 超文本传输协议,它是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP 是万维网(www)的数据通信的基础。

HTTP 作为一个应用层协议,它由请求和响应两部分构成,是一个标准的个客户端和服务器模型,它的主要特点:支持客户端/服务器模型、简单快速、灵活、无连接、无状态

1、简单快速

客户端向服务器发送服务请求时,只需传路径和请求方法。请求方法包括有 GET、POST、HEAD 等。每种方法规定了客户端与服务器联系的不同类型。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快

2、灵活

HTTP 允许传输任意类型的数据对象,正在传输的类型由 Content-Type 加以标记,最常见的 4 种 Content-Type 的取值如下:

  • application/x-www-form-urlencoded(常见的 form 提交):最常见 POST 提交数据的方式。浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以此钟方式提交数据
  • multipart/form-data(文件提交):另一种非常常见的 POST 数据提交的方式。我们在使用表单上传文件时,必须让 form 的 enctyped 等于这个值
  • application/json(提交 json 格式的数据):现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦
  • text/xml(提交 xml 格式的数据) :XML-RPC(XML Remote Procedure Call)。它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范
3、无连接

无连接的含义是限制每次连接只处理一个请求,服务器处理完客户端的请求,然后响应,并收到应答之后,就断开连接,这种方式可以节省传输时间。

4、无状态

HTTP 协议是无状态协议,无状态是指协议对于事务处理没有记忆能力,这种方式的一个坏处就是,如果后续的处理需要用到之前的信息,则必须要重传,这样就导致了每次连接传输的数据量增大。好处就是,如果后续的连接不需要之前提供的信息,响应就会比较快。而为了解决 HTTP 的无状态特性,出现了 CookieSession 技术.

在这里插入图片描述

二、HTTP报文结构

  • 你也许对 TCP/UDP 的报⽂格式有所了解,拿 TCP 报⽂来举例,它在实际要传输的数据之前附加了⼀个20 字节的头部数据,存储 TCP 协议必须的额外信息,例如发送⽅的端⼝号、接收⽅的端⼝号、包序号、标志位等等。

  • 有了这个附加的 TCP 头,数据包才能够正确传输,到了⽬的地后把头部去掉,就可以拿到真正的数据。

在这里插入图片描述

HTTP 协议也是与 TCP/UDP 类似,同样也需要在实际传输的数据前附加⼀些头数据,不过与 TCP/UDP不同的是,它是⼀个“纯⽂本”的协议,所以头数据都是 ASCII 码的⽂本,可以很容易地⽤⾁眼阅读,不⽤借助程序解析也能够看懂。

HTTP 协议的请求报⽂和响应报⽂的结构基本相同,由三⼤部分组成:

  1. 起始⾏(start line):描述请求或响应的基本信息;
  2. 头部字段集合(header):使⽤ key-value 形式更详细地说明报⽂;
  3. 消息正⽂(entity):实际传输的数据,它不⼀定是纯⽂本,可以是图⽚、视频等⼆进制数据。
  • 这其中前两部分起始⾏和头部字段经常⼜合称为“请求头”或“响应头”,消息正⽂⼜称为“实体”,但与“header”对应,很多时候就直接称为“body”。

  • HTTP 协议规定报⽂必须有 header,但可以没有 body,⽽且在 header 之后必须要有⼀个“空⾏”,也就是“CRLF”,⼗六进制的“0D0A”。

所以,⼀个完整的 HTTP 报⽂就像是下图的这个样⼦,注意在 header 和 body 之间有⼀个“空⾏”

在这里插入图片描述

下面是一个HTTP请求报文:

  • 在这个浏览器发出的请求报⽂⾥,第⼀⾏“GET / HTTP/1.1”就是请求⾏,⽽后⾯的“Host”“Connection”等等都属于 header,报⽂的最后是⼀个空⽩⾏结束,没有 body。

  • 在很多时候,特别是浏览器发送 GET 请求的时候都是这样,HTTP 报⽂经常是只有 header ⽽没 body。

在这里插入图片描述

2.1 请求⾏

了解了 HTTP 报⽂的基本结构后,我们来看看请求报⽂⾥的起始⾏也就是请求⾏(request line),它简要地描述了客户端想要如何操作服务器端的资源

请求⾏由三部分构成:

  1. 请求⽅法:是⼀个动词,如 GET/POST,表示对资源的操作;
  2. 请求⽬标:通常是⼀个 URI,标记了请求⽅法要操作的资源;
  3. 版本号:表示报⽂使⽤的 HTTP 协议版本。

这三个部分通常使⽤空格(space)来分隔,最后要⽤ CRLF 换⾏表示结束。(图示SP代表空格)

在这里插入图片描述

下面具体说明GET的请求行

GET / HTTP/1.1\r\n
GET /live/livestream.m3u8 HTTP/1.1\r\n
  • 在这个请求⾏⾥,“GET”是请求⽅法,“/”是请求⽬标,“HTTP/1.1”是版本号,把这三部分连起来,意思就是“服务器你好,我想获取⽹站根⽬录下的默认⽂件,我⽤的协议版本号是 1.1,请不要⽤ 1.0 或者 2.0回复我。

  • 别看请求⾏就⼀⾏,貌似很简单,其实这⾥⾯的“讲究”是⾮常多的,尤其是前⾯的请求⽅法和请求⽬标,组合起来变化多端,后⾯我还会详细介绍。

2.2 状态⾏

看完了请求⾏,我们再看响应报⽂⾥的起始⾏,在这⾥它不叫“响应⾏”,⽽是叫“状态⾏”(statusline),意思是服务器响应的状态。

⽐起请求⾏来说,状态⾏要简单⼀些,同样也是由三部分构成:

  1. 版本号:表示报⽂使⽤的 HTTP 协议版本;
  2. 状态码:⼀个三位数,⽤代码的形式表示处理的结果,⽐如 200 是成功,500 是服务器错误;
  3. 原因:作为数字状态码补充,是更详细的解释⽂字,帮助⼈理解原因。

在这里插入图片描述

下面是一个HTTP响应报文

HTTP/1.1 200 OK\r\n

意思就是:“浏览器你好,我已经处理完了你的请求,这个报⽂使⽤的协议版本号是 1.1,状态码是 200,⼀切 OK。”

⽽另⼀个“GET /favicon.ico HTTP/1.1”的响应报⽂状态⾏是:

HTTP/1.1 404 Not Found

翻译成⼈话就是:“抱歉啊浏览器,刚才你的请求收到了,但我没找到你要的资源,错误代码是 404,接下来的事情你就看着办吧。”

2.3 头部字段

请求⾏或状态⾏再加上头部字段集合就构成了 HTTP 报⽂⾥完整的请求头或响应头

在这里插入图片描述

在这里插入图片描述

请求头和响应头的结构是基本⼀样的,唯⼀的区别是起始⾏,所以我把请求头和响应头⾥的字段放在⼀起介绍。

  • 头部字段是 key-value 的形式,key 和 value 之间⽤“:”分隔,最后⽤ CRLF 换⾏表示字段结束。⽐如在“Host: 127.0.0.1”这⼀⾏⾥ key 就是“Host”,value 就是“127.0.0.1”。

  • HTTP 头字段⾮常灵活,不仅可以使⽤标准⾥的 Host、Connection 等已有头,也可以任意添加⾃定义头,这就给 HTTP 协议带来了⽆限的扩展可能。

不过使⽤头字段需要注意下⾯⼏点:

  • 字段名不区分⼤⼩写,例如“Host”也可以写成“host”,但⾸字⺟⼤写的可读性更好;

  • 字段名⾥不允许出现空格,可以使⽤连字符“-”,但不能使⽤下划线“_”。例如,“test-name”是合法的字段名,⽽“test name”“test_name”是不正确的字段名;

  • 字段名后⾯必须紧接着“:”,不能有空格,⽽“:”后的字段值前可以有多个空格;

  • 字段的顺序是没有意义的,可以任意排列不影响语义;

  • 字段原则上不能重复,除⾮这个字段本身的语义允许,例如 Set-Cookie。

⽤wireshark抓包的分析

请求报文
在这里插入图片描述

响应报文

在这里插入图片描述

2.4 常⽤头字段

HTTP 协议规定了⾮常多的头部字段,实现各种各样的功能,但基本上可以分为四⼤类:

  1. 通⽤字段:在请求头和响应头⾥都可以出现;
  2. 请求字段:仅能出现在请求头⾥,进⼀步说明请求信息或者额外的附加条件;
  3. 响应字段:仅能出现在响应头⾥,补充说明响应报⽂的信息;
  4. 实体字段:它实际上属于通⽤字段,但专⻔描述 body 的额外信息。

对 HTTP 报⽂的解析和处理实际上主要就是对头字段的处理,理解了头字段也就理解了 HTTP 报⽂。

2.4.1 User-Agent

  • User-Agent是请求字段,只出现在请求头⾥。它使⽤⼀个字符串来描述发起 HTTP 请求的客户端,服务器可以依据它来返回最合适此浏览器显示的⻚⾯。

  • 但由于历史的原因,User-Agent ⾮常混乱,每个浏览器都⾃称是“Mozilla”“Chrome”“Safari”,企图使⽤这个字段来互相“伪装”,导致 User-Agent 变得越来越⻓,最终变得毫⽆意义。

  • 不过有的⽐较“诚实”的爬⾍会在 User-Agent ⾥⽤“spider”标明⾃⼰是爬⾍,所以可以利⽤这个字段实现简单的反爬⾍策略。

2.4.2 Accept

  • Accept是请求字段,代表客户端希望接受的数据类型。
  • ⽐如Accept:text/xml(application/json);代表客户端希望接受的数据类型是xml(json )类型;
  • ⽐如Accept: */*则说明客户端接收所有类型的数据。

2.4.3 Host

  • ⾸先要说的是Host字段,它属于请求字段,只能出现在请求头⾥,它同时也是唯⼀⼀个 HTTP/1.1 规范⾥要求必须出现的字段,也就是说,如果请求头⾥没有 Host,那这就是⼀个错误的报⽂。

  • Host 字段告诉服务器这个请求应该由哪个主机来处理,当⼀台计算机上托管了多个虚拟主机的时候,服务器端就需要⽤ Host 字段来选择,有点像是⼀个简单的“路由重定向”。

  • 例如我们的试验环境,在 127.0.0.1 上有三个虚拟主机:“www.chrono.com”“www.metroid.net”和“origin.io”。那么当使⽤域名的⽅式访问时,就必须要⽤Host 字段来区分这三个 IP 相同但域名不同的⽹站,否则服务器就会找不到合适的虚拟主机,⽆法处理。

2.4.4 Range

  • Range是请求字段。

  • ⽐如Range: bytes=5001-10000 对于只需获资源的范围请求,包含⾸部字段 Range 即可告知服务器资源的指定范围。上⾯的示例表示请求获取从第 5001 字节到第 10000 字节的资源。

  • ⽐如Range: bytes=0- 则是请求所有的数据。

  • 接收到附带 Range ⾸部字段请求的服务器,会在处理请求之后返回状态码为 206 Partial Content 的响应。⽆法处理该范围请求时,则会返回状态码 200 OK 的响应及全部资源。

2.4.5 Connection

管理持久连接

  1. close 断开连接
  • HTTP/1.1版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定 Connection ⾸部字段的值为 close 。
Connection: close
  1. Keep-Alive 保持连接
  • HTTP/1.1 之前的版本的默认连接都是⾮持久连接。为此,如果想在旧版本的HTTP协议上维持持续连接,则需要指定 Connection ⾸部字段的值为 keep-alive 。

  • 在客户单发送请求给服务器时,携带此参数和值,服务器也会加上字段和值进⾏返回响应。

Connection: keep-alive

http是⼀个⽆状态的⾯向连接的协议。

  • http⽆状态:⽆状态协议是指http协议本身对于事务处理没有记忆功能,服务器不知道浏览器的状态。通俗的即使你登录了,去访问同⼀个⽹站的不同⽹⻚,服务器都不会知道你是谁,如果需要记录登录⽤户的信息,⽤户操作,⽤户⾏为等数据需要使⽤cookie或session来存储。

  • keep-alive:从HTTP/1.1起,浏览器默认都开启了Keep-Alive,保持连接特性,客户端和服务器都能选择随时关闭连接,则请求头中为connection:close。简单地说,当⼀个⽹⻚打开完成后,客户端和服务器之间⽤于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的⽹⻚,会继续使⽤这⼀条已经建⽴的TCP连接。但是Keep-Alive不会永久保持连接,它有⼀个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。

  • 误解:⽆状态不代表HTTP不能保持TCP连接,更不能代表HTTP使⽤的是UDP协议(⽆连接)。即使http在⽆状态下,只要客户端和服务器的头部信息connection:keep-alive,则在有效期内他们使⽤同⼀条TCP连接。

2.4.6 Date

  • Date字段是⼀个通⽤字段,但通常出现在响应头⾥,表示 HTTP 报⽂创建的时间,客户端可以使⽤这个时间再搭配其他字段决定缓存策略。

2.4.7 Server

  • Server字段是响应字段,只能出现在响应头⾥。它告诉客户端当前正在提供 Web 服务的软件名称和版本号, Server 字段也不是必须要出现的,因为这会把服务器的⼀部分信息暴露给外界,如果这个版本恰好存在 bug,那么⿊客就有可能利⽤ bug 攻陷服务器。所以,有的⽹站响应头⾥要么没有这个字段,要么就给出⼀个完全⽆关的描述信息。

  • ⽐如 GitHub,它的 Server 字段⾥就看不出是使⽤了 Apache 还是 Nginx,只是显示为“GitHub.com”。

在这里插入图片描述

再⽐如srs流媒体服务器的响应

Server: SRS/3.0.141(OuXuli)\r\n

2.4.8 Content-Type

  • Content-Type是实体字段,表发送端(客户端|服务器)发送的实体数据的数据类型。⽐如:ContentType:text/html(application/json) ; 代表发送端发送的数据格式是html(json)。

2.4.9 Content-Length

  • 实体字段⾥要说的⼀个是Content-Length,它表示报⽂⾥ body 的⻓度,也就是请求头或响应头空⾏后⾯数据的⻓度。服务器看到这个字段,就知道了后续有多少数据,可以直接接收。如果没有这个字段,那么 body 就是不定⻓的,需要使⽤ chunked ⽅式分段传输。

更多资料:https://github.com/0voice

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88303.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88303.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88303.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络基础及API使用详解

一、神经网络概述神经网络是一种模仿生物神经网络结构和功能的计算模型,它由大量的人工神经元相互连接构成,能够通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。1.1 神经网络的基本组成输入层:接收原始数据隐藏…

分桶表的介绍和作用

一、分桶表的基本介绍1、什么是分桶表?分桶表主要是用于分文件的,在建表的时候,指定按照那些字段执行分桶操作,并可以设置需要分多少个桶,当插入数据的时候,执行MR的分区的操作,将数据分散各个分…

HighReport报表工具开始支持BS报表设计器

HighReport报表工具同时支持c/s报表设计器和b/s报表设计器,大部分情况下使用c/s报表设计器,在某些业务场景或者用户自己简单修改报表模板,可以用b/s报表设计器。b/s报表设计器和c/s报表设计器操作一样b/s报表设计器免费下载免费使用(c/s报表设…

数据结构--堆的实现

目录 一、堆的概念及结构 二、小根堆的实现 2.1 堆的数据结构 2.2 堆的初始化HeapInit 2.3 堆的销毁HeapDestory 2.4 堆的插入HeapPush ​2.4.1 插入代码HeapPush 2.4.2 向上调整代码AdjustUp 2.4.3 交换数据代码Swap 2.5 堆的删除HeapPop 2.5.1 删除代码HeapPop 2…

evo轨迹评估工具

文章目录evo参数设置evo_traj指标度量evo_apeevo_rpe结果比较evo工具主要有如下六个常用命令: evo_ape - 用于评估绝对位姿误差;evo_rpe- 用于评估相对位姿误差;evo_traj - 这个主要是用来画轨迹、输出轨迹文件、转换数据格式等功能&#xf…

Django+DRF 实战:自定义异常处理流程

文章目录一、DRF 异常处理流程DRF 默认异常处理流程源码二、实战DRF 自定义异常处理流程应用自定义异常处理流程一、DRF 异常处理流程 DRF 默认异常处理流程 DRF默认的异常处理流程如下: 当异常发生时,会自动调用rest_framework.views.exception_hand…

Spring MVC 1

什么是Spring Web MVC 官方对Spring MVC的描述是这样的:Spring Web MVC 是基于Severlet API构建的原始Web框架,从一开始就包含在Spring框架中。它的正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc),但它…

一个基于若依(ruoyi-vue3)的小项目部署记录

一、背景 收到朋友的求助,他拿到了一个项目的源代码,说需要我帮助部署。部署要求是需要域名访问。 因为没有文档和其他资料以及帮助,我先清理了源收到的资料: 1.后端:是java代码,一看就是若依框架。心里大大…

【实战总结】WMIC在HW行动中的4类关键应用

WMIC命令完全指南:网络安全运维工程师的深度实践手册 关键词:WMIC命令、Windows管理、网络安全运维、系统信息收集、进程分析、自动化审计 【实战总结】WMIC在HW行动中的4类关键应用 1. 前言 在Windows环境下的网络安全运维中,WMIC&#x…

LKT4304稳定可靠高兼容性国产安全加密芯片

随着 IOT 的飞速发展,智能家居,智能汽车,智能工控等物联网设备和云服务的安全问题成为IOT普及的关键障碍。在设计之初就为物联网产品配备正确的安全解决方案,是帮助预防措施的关键所在。LKT4304是凌科芯安专为物联网应用场景而推出…

Android 网络开发核心知识点

Android 网络开发核心知识点 一、基础网络通信 1. HTTP/HTTPS 协议 HTTP方法:GET、POST、PUT、DELETE等状态码:200(成功)、404(未找到)、500(服务器错误)等HTTPS加密:SSL/TLS握手过程报文结构:请求头/响应头、请求体/响应体 2. 网…

DVWA靶场通关笔记-弱会话IDs(Weak Session IDs Medium级别)

目录 一、Session ID 二、代码审计(Medium级别) 1、配置security为Medium级别 2、源码分析 (1)index.php (2)Medium.php (3)对比分析 (4)渗透思路 三…

编辑器Vim的快速入门

如大家所了解的,Vim是一个很古老的编辑器,但是并没有随着时间的流逝消失在编辑器/IDE 的竞争中,Vim 独创的模式机制和 hjkl 移动光标方式使得使用者在编辑文件时可以双手不离开键盘,极大地提升了工作效率。由于 Vim 学习曲线极为陡…

深度学习核心:从基础到前沿的全面解析

🧠 深度学习核心:从基础到前沿的全面解析 🚀 探索深度学习的核心技术栈,从神经网络基础到最新的Transformer架构 📋 目录 🔬 神经网络基础:从感知机到多层网络🖼️ 卷积神经网络&am…

MySQL索引:数据库的超级目录

MySQL索引:数据库的「超级目录」 想象你有一本1000页的百科全书,要快速找到某个知识点(如“光合作用”): ❌ 无索引:逐页翻找 → 全表扫描(慢!)✅ 有索引:直接…

景观桥 涵洞 城门等遮挡物对汽车安全性的影响数学建模和计算方法,需要收集那些数据

对高速公路景观桥影响行车视距的安全问题进行数学建模,需要将物理几何、动力学、概率统计和交通流理论结合起来。以下是分步骤的建模思路和关键模型:一、 核心建模目标 量化视距(Sight Distance, SD):计算实际可用视距…

Git 用户名和邮箱配置指南:全局与项目级设置

查看全局配置 git config --global user.name # 查看全局name配置 git config --global user.email # 查看全局email配置 git config --global --list # 查看所有全局配置查看当前项目配置 git config user.name # 查看当前项目name配置 git config user.email # 查看当前项目…

视频序列和射频信号多模态融合算法Fusion-Vital解读

视频序列和射频信号多模态融合算法Fusion-Vital解读概述模型整体流程视频帧时间差分归一化TSM模块视频序列特征融合模块跨模态特征融合模块概述 最近看了Fusion-Vital的视频-射频(RGB-RF)融合Transformer模型。记录一下,对于实际项目中的多模…

frp内网穿透下创建FTP(解决FTP“服务器回应不可路由的地址。使用服务器地址替代”错误)

使用宝塔面板,点击FTP,下载Pure-FTPd插件 点击Pure-FTPd插件,修改配置文件,找到PassivePortRange, 修改ftp被动端口范围为39000 39003,我们只需要4个被动端口即可,多了不好在内网穿透frp的配置文件中增加…

STM32控制四自由度机械臂(SG90舵机)(硬件篇)(简单易复刻)

1.前期硬件准备 2s锂电池一个(用于供电),stm32f103c8t6最小系统板一个(主控板),两个摇杆(用于摇杆模式),四个电位器(用于示教器模式)&#xff0c…