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

对于端口,其实是由http[s]提供的
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博客

