应用层协议 HTTP

1. HTTP****协议

1.1 概念

HTTP ( H yper T ext T ransfer P rotocol ,超文本(不仅包括文本,还有图片,视频等)传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输 超文本(如 HTML 文档)。
HTTP 协议是客户端与服务器之间通信的基础。客户端通过 HTTP 协议向服务器发送请求,服务器收到请求后处理并返回响应。
HTTP 协议是一个 无连接、无状态 的协议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。

1.2 URL

平时我们俗称的 " 网址 " 其实就是说的 URL,如下有一个网址

对于端口,其实是由https提供的
https:443
http:80
对于域名,其实就是为了可读性对IP地址进行了转换,就好比如,要使用某一个网站,输入的应该是这个网站的名字,而不是对应的IP地址
发现一些网址中可能含有一些特殊符号,像 / ? : 等这样的字符, 已经被 url 当做特殊意义理解了. 因此这些字符不能随意出现,
比如 , 某个参数中需要带有这些特殊字符 , 就必须先对特殊字符进行转义
转义的规则如下 :
将需要转码的字符转为 16 进制,然后从右到左,取 4 位 ( 不足 4 位直接处理 ) ,每 2 位做一位,前面加上% ,编码成 %XY 格式

"+" 被转义成了 "%2B",

在请求的时候,url中如果有特殊字符,客户端(一般为浏览器)会自动进行对特殊字符进行编码urlencode,服务器自己进行urldecode( urldecode 就是 urlencode 的逆过程 ;),如果直接出现在在url出现,就会导致url解析失败

1.3 HTTP****协议请求与响应格式

1.3.1 HTTP****请求

客户端发出

首行 : 方法 + url + 版本
Header: 请求的属性 , 冒号分割的键值对 ; 每组属性之间使用 \r\n 分隔 ; 遇到空行表示 Header 部分结束
Body: 空行后面的内容都是 Body. Body 允许为空字符串 . 如果 Body 存在 , 则在Header 中会有一个 Content-Length 属性来标识 Body 的长度 ;

1.3.1 HTTP 响应

服务端进行响应

首行 : 版本号 + 状态码 + 状态码解释
Header: 请求的属性 , 冒号分割的键值对 ; 每组属性之间使用 \r\n 分隔 ; 遇到空行表示 Header 部分结束
Body: 空行后面的内容都是 Body. Body 允许为空字符串 . 如果 Body 存在 , 则在Header 中会有一个 Content-Length 属性来标识 Body 的长度 ; 如果服务器返回了一个 html 页面 , 那么 html 页面内容就是在 body 中 .

http利用空行为分割符进行报头和有效载荷的分离,同时对于http协议,序列化和反序列化使用的是特殊字符进行子串拼接,且不依赖任何第三方库

1.4 HTTP的常见方法

1.4.1 GET(获取资源)

当用户对HTTP请求时,此时浏览器就会向服务器发送下列样式的请求

用途:用于请求 URL 指定的资源。
示例: GET(请求方法) /index.html(URL) HTTP/1.1(HTTP版本)
特性:指定资源经服务器端解析后返回响应内容
用户需要请求资源,此时就需要对服务端进行请求,对于请求利用URL来表示自己请求的资源在那个路径下,而服务器所保存的资源一般都在一个叫web的根目录下(注意不是Linux的根目录)

当用户请求资源时,此时服务器就会自动在URL前面拼接一个./wwwroot目录,因此对于http请求的本质,其实就是请求代码中./wwwroot目录下特定路径下的资源

1.4.2 POST(上传资源)

⽤途:⽤于传输实体的主体,通常⽤于提交表单数据。
⽰例: POST /submit.cgi HTTP/1.1
特性:可以发送⼤量的数据给服务器,并且数据包含在请求体中。

1.4.3 PUT⽅法

⽤途:⽤于传输⽂件,将请求报⽂主体中的⽂件保存到请求URL指定的位置。
⽰例: PUT /example.html HTTP/1.1
特性:不太常⽤,但在某些情况下,如RESTful API中,⽤于更新资源。

1.4.4 HEAD⽅法

⽤途:与GET⽅法类似,但不返回报⽂主体部分,仅返回响应头。
⽰例: HEAD /index.html HTTP/1.1
特性:⽤于确认URL的有效性及资源更新的⽇期时间等。

1.4.5 DELETE⽅法

⽤途:⽤于删除⽂件,是PUT的相反⽅法。
⽰例: DELETE /example.html HTTP/1.1
特性:按请求URL删除指定的资源。

1.4.6 OPTIONS⽅法

⽤途:⽤于查询针对请求URL指定的资源⽀持的⽅法。
⽰例: OPTIONS * HTTP/1.1
特性:返回允许的⽅法,如GET、POST等。

1.7 HTTP的状态码

1.7.1 基础的状态码

在访问浏览器时,常常会出现404,403这种错误,其实这就是 HTTP的状态码



最常⻅的状态码, ⽐如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向)
504(Bad Gateway服务器崩溃或过载)
这里有个细节,当服务器崩溃或过载时,用户怎么收到服务器发出的错误码?其实当用户请求资源访问服务器时,中间还有一个代理服务器,这个代理服务器用来转发请求,把请求转到对应服务的服务器上,当服务器崩溃或过载时,代理服务器就会知道,从而发送给用户对应的错误码

1.7.2 临时重定向和永久重定向

|-----|--------------------|----------|---------------------------------|
| 状态码 | 含义 | 是否为临时重定向 | 应⽤样例 |
| 301 | Moved Permanently | 否(永久重定向) | ⽹站换域名后,⾃动跳转 到新域名;搜索引擎更新 ⽹站链接时使⽤ |
| 302 | Found 或 See Other | 是(临时重定向) | ⽤⼾登录成功后,重定向 到⽤⼾⾸⻚ |
| 307 | Temporary Redirect | 是(临时重定向) | 临时重定向资源到新的位 置(较少使⽤) |
| 308 | Permanent Redirect | 否(永久重定向) | 永久重定向资源到新的位置(较少使⽤) |

对于临时和永久重定向举个例子:有一家在东边的面馆,由于要进行装修暂时到西边,而小明直到这个事情后每次都会去到老面馆,看是否装修完成,没有装修完成则去西边,而这就是临时重定向,而永久重定向就代表在东边的面馆搬到西边,自此以后小明就不会每次都会去到老面馆,直接去到西边就行了

对于永久重定向一般来说是给浏览器使用的,因为浏览器中的一些网址可能变化,因此浏览器每隔一段时间都要进行对网址的获取,而临时重定向,其实就是跳转,比如一些广告,和登录成功后,重定向到⽤⼾⾸⻚
当服务器返回HTTP 301状态码时,表⽰请求的资源已经被永久移动到新的位置。
在这种情况下,服务器会在响应中添加⼀个Location头部,⽤于指定资源的新位置。这个Location头部包含了新的URL地址,浏览器会再次发送请求⾃动重定向到该地址。
例如,在HTTP响应中,可能会看到类似于以下的头部信息:
HTTP/ 1.1 301 Moved Permanently\r\n
Location: https: //www.new-url.com\r\n
当服务器返回HTTP 302状态码时,表⽰请求的资源临时被移动到新的位置。
同样地,服务器也会在响应中添加⼀个Location头部来指定资源的新位置。浏览器会暂时使⽤新的URL进⾏后续的请求,但不会缓存这个重定向。
例如,在HTTP响应中,可能会看到类似于以下的头部信息:
HTTP/ 1.1 302 Found\r\n
Location: https: //www.new-url.com\r\n
⽆论是HTTP 301还是HTTP 302重定向,都需要依赖Location选项来指定资源的新位置。这个Location选项是⼀个标准的HTTP响应头部,⽤于告诉浏览器应该将请求重定向到哪个新的URL地址。

1.8 HTTP常⻅Header(报头)

Content-Type: 数据类型(text/html等)
Content-Length: Body的⻓度
Host: 客⼾端告知服务器, 所请求的资源是在哪个主机的哪个端⼝上;
User-Agent: 声明⽤⼾的操作系统和浏览器版本信息;
Referer: 当前⻚⾯是从哪个⻚⾯跳转过来的;
Location: 搭配3xx状态码使⽤, 告诉客⼾端接下来要去哪⾥访问;
Cookie: ⽤于在客⼾端存储少量信息. 通常⽤于实现会话(session)的功能;
关于connection报头:
HTTP中的 Connection 字段是HTTP报⽂头的⼀部分,它主要⽤于控制和管理客⼾端与服务器之间 的连接状态
连接状态分为两种:长连接(持久连接)短连接
客户端发送请求,服务端对请求回复,之后关闭连接,这种被称为短连接,一个网页不可能只有一个视频和图片资源,因此如果使用短连接就会效率就会慢很多
持久连接允许客⼾端和服务器在请求/响应完成后不⽴即关闭TCP连接,以便在同⼀个连接上发送多个请求和接收多个响应。
HTTP/1.1:在HTTP/1.1协议中,默认使⽤持久连接。当客⼾端和服务器都不明确指定关闭连接时,连接将保持打开状态,以便后续的请求和响应可以复⽤同⼀个连接。
HTTP/1.0:在HTTP/1.0协议中,默认连接是⾮持久的。如果希望在HTTP/1.0上实现持久连接,需要在请求头中显式设置 Connection: keep-alive 。
Connection: keep-alive :表⽰希望保持连接以复⽤TCP连接。
Connection: close :表⽰请求/响应完成后,应该关闭TCP连接。

1.9 HTTP协议性质

在本章开头说明了HTTP 协议是一个无连接、无状态的协议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。

上文讲述了connection代表连接状态,这不和HTTP协议无连接冲突了吗,其实对于连接状态指的是让TCP服务器保持长连接,对于HTTP协议来说,无关连接概念,只与request和rwsponse有关。

由于HTTP 协议是一个无状态的协议,因此不会记录用户信息,如果有一个登录服务,那么每次用户请求时都需要进行登录,会给用户的体验不好,因此HTTP中有cookie 与 session,这里就不再讲述,可以参考HTTP cookie 与 session-CSDN博客

相关推荐
A小辣椒44 分钟前
TShark:基础知识
linux
AlfredZhao3 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao17 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
霜落长河21 小时前
抛弃TCP改用UDP,HTTP3怎么了?
http
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux