【音视频 | HTTP协议】HTTP协议详细介绍(HTTP方法、报文格式、报文头部字段、状态码)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍 HTTP 协议🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
⏰发布时间⏰: 2024-07-18 18:20:51

本文未经允许,不得转发!!!



在这里插入图片描述

🎄一、概述

HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW,World Wide Web )服务器传输超文本到本地浏览器的传送协议。

HTTP 是一种应用层协议,是基于 TCP/IP 通信协议来传递数据的,其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现,HTTP3.0 基于 UDP 实现。现主流使用 HTTP1.0 和 HTTP3.0。

✨1.1 HTTP 协议的工作过程

  • 1、HTTP服务端创建一个HTTP端口(默认80)的TCP连接,等待HTTP客户端连接;
  • 2、HTTP客户端,通常是浏览器,创建一个TCP套接字连接HTTP服务器的HTTP端口(默认80);
  • 3、客户端向HTTP服务器发送一个请求报文,一个请求报文由请求行、请求头部、空行和请求数据组成。
  • 4、HTTP服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据组成。
  • 5、若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。
  • 6、客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

HTTP 协议的重要特点: 一个请求,一个响应。


✨1.2 了解 URL

URL(Uniform Resource Locator),统一资源定位符,这就是我们平时说的网址。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。

URL 基本格式

URL 的标准格式如下:
协议类型:[//服务器地址[:端口号]][/资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]

URL 的完整格式如下:
协议类型:[//[访问资源需要的凭证信息@]服务器地址[:端口号]][/资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]
  • 协议类型:常见的协议类型有 httphttps,访问 mysql 时的协议类型为 jdbc:mysql。
  • 访问资源需要的凭证信息: 一般就是登录信息(用户名、密码等),但是现在的网站进行认证一般不再通过 URL 进行,故一般省略。
  • 服务器地址:服务器的地址可以时一个 IP 地址,也可以是一个域名(域名会通过 DNS 系统解析成一个具体的 IP 地址,可以使用 ping 域名 来得到该域名的 IP 地址),IP 地址用来描述网络上的一个具体位置,能够用来定位一个具体的主机。在 HTML 中可以省略(比如 img、link、script、a 标签的 src 或者 href 属性),省略后表示服务器的 ip 或域名与当前 HTML 所属的 ip 或域名一致
  • 端口号:端口号的主要作用是表示一台计算机中的特定进程所提供的服务,即用来区分一个主机上的不同程序。每个程序在访问网络的时候,都会关联上一个或多个端口号,通过端口号就能区分出当前的请求要给谁。当端口号省略时,浏览器会根据协议类型自动决定使用哪个端口号(如 http 协议默认使用80端口,https 协议默认使用443端口)
  • 资源层级 UNIX 文件路径:表示访问该服务器程序上某个资源的路径。可以省略,省略后相当于 /
  • 文件名:表示访问该服务器上的哪个资源(如 html、图片等等),不能省略。
  • 查询字符串:查询字符串(query string)本质是一个键值对结构,且键值对之间使用 & 分割,键和值之间使用 = 分割。表示客户端给服务器传递的参数。该参数是 web 开发的一个重要参数,给前后端交互提供了很多可能性。该参数 key 和 value 的取值和个数,完全都是由程序员自己约定,因此可以通过这样的方式来自定制我们需要的信息给服务器。可以省略。
  • 片段标识符:片段标识符主要用于页面内跳转,例如跳转到当前页面的某个部分、章节等等 可以省略。

urlencode 介绍
urlencode,也就是url编码。因为像 /?: 等这样的字符,已经被 url 当做特殊意义理解了,因此这些字符不能随意出现。如果某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义,即 urlencode

urlencode将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成 %XY 格式。


在这里插入图片描述

🎄二、HTTP 方法

HTTP 方法包括:GET、POST、PUT、HEAD、DELETE、OPTIONS、TRACE、CONNECT、LINK、UNLINE等。详细使用介绍如下:

方法描述
GET请求指定资源,
POST向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)
HEAD类似于GET,只不过返回的响应中没有具体内容,用于获得报文首部
PUT传输文件,向指定资源位置上传其最新内容
DELETE请求服务器删除Request-URI所标识的资源
OPTIONS使服务器传回该资源所支持的所有HTTP请求方法。用’*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
TRACE回显服务器收到的请求,主要用于测试或诊断
CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接
LINK建立和资源之间的联系
UNLINE断开连接关系

其中,最常用的两个方法是GETPOST,下面着重介绍一下。

✨2.1 GET 方法

GET 是最常用的 HTTP 方法,常用于获取服务器上的某个资源。

以下几种方式都会触发 GET 方法的请求:
1、在浏览器中直接输入 URL 回车或点击浏览器收藏夹中的链接,此时浏览器就会发送出一个 GET 请求。
2、HTML 中的 link、img、script 等标签的属性中放的 URL,浏览器也会构造出 HTTP GET 请求
3、使用 Javascript 重点 ajax,也能构造出 HTTP GET 请求
4、各种编程语言(只要能够访问网络),就都能够构造出 HTTP GER 请求

GET 请求报文的特点:
1、请求行里面的第一个部分就是 GET
2、URL 里面的 query string 可以为空,也可以不为空
3、GET 请求的 header(请求头部) 有若干个键值对结构
4、GET 请求的 body 一般是空的

GET 请求行的URL长度在HTTP协议(RFC 2616 标准)中并没有限制,但会受限于浏览器和HTTP服务器实现,它们可能处理不了太长的URL,所以会有一个URL的最大值。

GET 也可以传输二进制数据,虽然不能直接在 query string 中传输二进制数据,但是可以针对二进制数据进行 urlencode,转码后就可以放到 url 中;GET 还可以直接将二进制数据放到 body 中


✨2.2 POST 方法

POST 方法也是一种常见的方法,多用于提交用户输入的数据给服务器(如登录页面)。

以下几种方法都会触发 POST 方法的请求:
1、通过 HTML 中的 form 标签可以构造 POST 请求
2、使用 JavaScript 的 ajax 可以构造 POST 请求

POST 请求的特点:
1、首行第一个部分就是 POST
2、URL 里面的 query string 一般是空的
3、POST 请求的 header 里面有若干个键值对
4、POST 请求的 body 一般不为空(body 的具体数据格式,由 header 中的 Content-Type 来描述;body 的具体数据长度,由 header 中的 Content-Length 来描述


✨2.3 GET 和 POST 的区别

GET 和 POST 其实没有本质区别,使用 GET 的场景完全可以使用 POST 代替,使用 POST 的场景一样可以使用 GET 代替。但是在具体的使用上,还是存在一些细节的区别

  • GET 习惯上会把客户端的数据通过 query string 来传输(body 部分是空的);POST 习惯上会把客户端的数据通过 body 来传输(query string 部分是空的)。
  • GET 习惯上用于从服务器获取数据;POST 习惯上是客户端给服务器提交数据。
  • 一般情况,程序员会把 GET 请求的处理,实现成“幂等”的;对于 POST 请求的处理,不要求实现成“幂等”。
    幂等,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说,幂等的方法不应该具有副作用。例如,抢购手机,你点击下单了,但没有反应,于是你就点击好几次。如果最后只有一次付款,就是幂等,否则就不是幂等。
  • GET 请求可以被缓存,可以被浏览器保存到收藏夹中;POST 请求不能被缓存。

在这里插入图片描述

🎄三、HTTP报文(请求报文、响应报文)格式

HTTP有两类报文:请求报文和响应报文。请求报文是指从客户向服务器发送请求报文,响应报文是指从服务器到客户的应答。

✨3.1 HTTP 的 请求报文

HTTP 的 请求报文格式如下图:包含了 3个部分:请求行、请求头部、请求数据。
注意,请求头部后必须加空行(\r\n),用来表示请求头部结束。
在这里插入图片描述

  • 请求行:请求行包含一个方法、一个请求URL和一个协议版本,它们之间以空格分隔,并以CRLF(即:\r\n)结束;
    下面是一个完整的请求行的示例:
    GET https://www.baidu.com/ HTTP/1.1
    
  • 请求头部:请求头部的整体格式是 键值对 结构,每个 键值对 占一行,键和值之间使用 冒号+空格(: ) 进行分割,每一行结尾以CRLF(即:\r\n)结束。
    下面是常见的请求头部的一部分:
    Connection: close
    Accept: application/json, text/plain, */*
    User-Agent: C++ HTTP Client
    
  • 请求数据(请求体):请求体是用于传输额外的数据。请求体的具体内容,取决于请求行中所使用的HTTP方法。注意:在请求头部之后,需要插入一个空行(CRLF),用于区分请求头部与请求体。大部分请求报文是没有请求体的。

✨3.2 HTTP 的 响应报文

HTTP 的 响应报文格式如下图:包含了 3个部分:状态行、响应头部、响应数据。
注意,响应头部后必须加空行(\r\n),用来表示响应头部结束。
在这里插入图片描述

  • 状态行:状态行包含一个协议版本、一个状态码和一个状态文本,它们之间由空格分隔,并以CRLF(即:“\r\n”)结束。
    下面是状态行例子:
    RTSP/1.0 200 OK
    
  • 响应头部:响应头部包含与请求头部类似的信息,也都是键值对结构的信息。故这里不再赘述。
  • 响应正文(响应体):某些HTTP响应可能包含响应体,用于传输额外的数据。注意:在响应头部之后,需要插入一个空行(CRLF),用于区分响应头部与响应体

在这里插入图片描述

🎄四、常见的HTTP报文头部字段

HTTP报文头部包括 请求报文头部、响应报文头部,前面介绍了这些报文头部都是一些 键值对 结构的信息,下面介绍一些常见的头部字段:

  • Host:HOST 的值表示服务器主机的地址和端口(地址可以是域名,也可以是 IP;端口号可以省略或者手动指定)
  • Content-Length:该字段指明在RTSP协议最后一个标头之后的双 CRLF 之后的内容长度,也就是 body 的数据长度,长度单位是字节
  • Content-Type:Content-Type 表示 body 的数据格式,以下介绍三种请求中的数据格式
    • application/x-www-form-urlencoded:这是 form 表单提交的数据格式,此时 body 的格式就类似于 query string(是键值对的结构,键值对之间使用 & 分割,键与值之间使用 = 分割
    • multipart/form-data:这是 form 表单提交的数据格式(需要在 from 标签上加上 enctyped=“multipart/form-data”),通常用于 HTML 提交图片或者文件
    • application/json:此时 body 数据为 json 格式,json 格式就是源自 js 的对象的格式。用一个 { } 括住,里面有多个键值对,键值对之间使用逗号分割,键和值之间使用冒号分割
  • User-Agent: 该字段用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。
  • Referer:Referer 表示这个页面是从哪个页面跳转过来的,这是一个很有用的字段
  • Accept: 用于指定客户端通知服务器自己可以接受的实体数据结构类型。例如: Accept: application/sdp,之后服务器通过Content-Type字段返回其实体数据结构类型;
  • Accept-Encoding:用于客户端通知服务器自己可以接受的数据压缩格式,例如:Accept-Encoding: gzip, compress, br,之后服务器将通过Content-Encoding字段通知客户端它的选择。
  • Accept-Language: 用于客户端通知服务器自己可以理解的语言及其接受度,例如:Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5 ,之后服务器将通过Content-Language字段通知客户端它的选择
  • Authorization:客户端请求消息头含有服务器用于验证用户代理身份的凭证
  • Bandwidth: 用于描述客户端可用的带宽值。例如: Bandwidth: 4000
  • Blocksize:此字段由客户端发送到媒体服务器,要求服务器提供特定的媒体包大小,服务器可以自由使用小于请求的块大小。 此数据包大小不包括 IP、UDP 或 RTP 等低层标头
  • CSeq: 指定了RTSP请求响应的序列号,每个RTSP请求都必须包含一个唯一的CSeq值,以便服务器能够正确地识别和处理请求。这个序列号随着请求消息递增。服务器响应必须有CSeq值,指明响应哪个请求。
  • Cache-Control:通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求中设置的指令,不一定被包含在响应中
  • Connection:该字段决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。如果是Connection: close,则表示这个请求结束后就会关闭网络连接。
  • Date:提供服务器生成响应的日期和时间,有助于客户端判断响应的新鲜度或进行时间同步。Date字段的格式符合RFC 1123,比如:Sat, 06 Apr 2024 11:15:00 GMT。
  • Expires:指明过期的时间
  • Rang: 用于指定一个时间范围,可以使用SMPTE、NTP或clock时间单元。
  • Session: Session头字段标识了一个RTSP会话。Session ID 是由服务器在SETUP的回应中选择的,客户端一当得到Session ID后,在以后的对Session 的操作请求消息中都要包含Session ID.例如:Session: 4581E0AE;timeout=65
  • Transport: Transport头字段包含客户端可以接受的传输选项列表,包括传输协议,地址端口,TTL等。服务器端也通过这个头字段返回实际选择的具体选项。如: Transport: RTP/AVP/TCPunicast;destination=192.168.31.222;source=192.168.31.222;interleaved=0-1

在这里插入图片描述

🎄五、HTTP 状态码

✨5.1 状态码格式

1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求

✨5.2 常见状态码

200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码需和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

✨5.3 响应状态码有5类

100~199 表示成功接收请求。要求客户端继续提交下一次请求才能完成整个处理过程。
200~299:表示成功接睡请求并完成整个处理过程。常用是200。
300~399:为完成请求,客户需要进一步细化请求,例如,请求的资源已移动一个新地址,常用302 307 304。
400~499:客户端的请求错误,通常拽请的资源不在服务器上,常用是404 ,403指是浏览器没有权限去访问页面。
500~599:服务器端出现错误,常用是500。


在这里插入图片描述

🎄六、总结

本文注意介绍HTTP协议,介绍了HTTP常用的方法、HTTP协议的报文格式、常见的报文头部字段、常见的状态码。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考:
https://blog.csdn.net/weixin_46913514/article/details/116480652
https://blog.csdn.net/weixin_51367845/article/details/123313047

  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wkd_007

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

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

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

打赏作者

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

抵扣说明:

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

余额充值