应用层协议 HTTP

目录
urlencode(URL 编码) 和 urldecode(URL 解码)
HTTP 协议
应用层协议是程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。
在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至 关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如 HTML /CSS/JS /图片 /视频)。
HTTP是基于 TCP 协议,默认使用 端口 80。
HTTP 协议是客户端与服务器之间通信的基础。客户端通过 HTTP 协议向服务器发送请求(request),服务器收到请求后处理并返回响应(response)。
HTTP 协议是一个无连接、无状态的协议,即每次请求都需要建立新的连接(TCP处理链接问题),且服务器不会保存客户端的状态信息。
http协议是基于TCP的协议
URL
平时我们俗称的 "网址" 其实就是说的 URL
url表示客户端想从http中获取服务器中的什么资源
- 服务器中的文件(固定网页)
- 交互式请求

www.baidu.com 与www.baidu.com/ 与www.baidu.com/index.html都是百度的首页
index.html 为默认首页
urlencode(URL 编码) 和 urldecode(URL 解码)
像 / ? : 等这样的字符, 已经被 url 当做特殊意义理解了. 因此这些字符不能随意出现.
比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义. 转义的规则如下: 将需要转码的字符转为 16 进制,然后从右到左,取 4 位(不足 4 位直接处理),每 2 位做一位,前面加上%,编码成%XY 格式
总结:将用户请求的中的字符转为符合 URL 传输要求的格式
urlencode
"hello world!" → "hello+world%21"
"价格=100" → "%E4%BB%B7%E6%A0%BC%3D100"
urldecode
"hello+world%21" → "hello world!"
"%E4%BB%B7%E6%A0%BC%3D100" → "价格=100"
例如:
"+" 被转义成了 "%2B"
urldecode 就是 urlencode 的逆过程;
补充:
一张网页可能不是一个简单的html文件 ,可能有很多资源构成(HTML+ 图片/视频等)
以二进制的方式读取可以读取文本或图片
HTTP 协议请求与响应格式
HTTP 请求

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

HTTP 响应

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

基本的应答格式

HTTP 的方法

其中最常用的就是 GET 方法和 POST 方法.
GET通常是用于获取网页 ,POST通常是提交参数 ,但是GET也能提交参数
HTTP 常见方法
1. GET 方法(重点)
用途:用于请求 URL 指定的资源。
示例:GET /index.html HTTP/1.1
特性:指定资源经服务器端解析后返回响应内容。
form 表单:https://www.runoob.com/html/html-forms.html
通过历史写的 http 服务器,验证 GET 方法,这里需要了解一下 FORM 表单的 问题 这里就要引入 web 根目录,文件读取的基本操作了
2.POST 方法(重点)
用途:用于传输实体的主体,通常用于提交表单数据。
示例:POST /submit.cgi HTTP/1.1
特性:可以发送大量的数据给服务器,并且数据包含在请求体中。
form 表单:https://www.runoob.com/html/html-forms.html
GET 和POST都可以提交参数
GET将提交的参数拼接到URL的后面
POST将提交的参数保存在request中的请求正文中
总结:
登陆一般不用GET ,POST比GET传参更私密,不是更安全 ,因为两者的request都是明文,
利用抓包工具都可将requst抓到
想要安全需要将明文加密.
GET和POST是HTTP协议中最常用的两种请求方法
两者的区别:
3. PUT 方法(不常用)
用途:用于传输文件,将请求报文主体中的文件保存到请求 URL 指定的位置。
示例:PUT /example.html HTTP/1.1
特性:不太常用,但在某些情况下,如 RESTful API 中,用于更新资源。
4. HEAD 方法
用途:与 GET 方法类似,但不返回报文主体部分,仅返回响应头。
示例:HEAD /index.html HTTP/1.1
特性:用于确认 URL 的有效性及资源更新的日期时间等。
5. DELETE 方法(不常用)
用途:用于删除文件,是 PUT 的相反方法。
示例:DELETE /example.html HTTP/1.1
特性:按请求 URL 删除指定的资源。
6. OPTIONS 方法
用途:用于查询针对请求 URL 指定的资源支持的方法。
示例:OPTIONS * HTTP/1.1
特性:返回允许的方法,如 GET、POST 等
HTTP 的状态码

最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)
例如:如果获取用户resquest成功 ,用户请求的内容存在 ,应该返回200
但是在状态码的遵守上 ,各大公司遵守的不太一致


重定向:
以下是仅包含重定向相关状态码的表格:
一般使用301(永久重定向)和302(临时重定向)

关于重定向的验证,以 301 为代表
HTTP 状态码 301(永久重定向)和 302(临时重定向)都依赖 Location 选项。
以下是关于两者依赖 Location 选项的详细说明:
HTTP 状态码 301(永久重定向):
- 当服务器返回 HTTP 301 状态码时,表示请求的资源已经被永久移动到新的位 置。
- 在这种情况下,服务器会在响应中添加一个 Location 头部,用于指定资源的新位置。这个 Location 头部包含了新的 URL 地址,浏览器会自动重定向到该地址,并进行缓存,将old-ur l 缓存成 new-url , 以后再次打开old-url就会自动打开new-url 。
- 例如,在 HTTP 响应中,可能会看到类似于以下的头部信息:
HTTP/1.1 301 Moved Permanently\r\n Location: https://www.new-url.com\r\n
HTTP 状态码 302(临时重定向):
- 当服务器返回 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 地址。
其他注意事项:
301 是强制重定向,用户代理(如浏览器)必须遵循。
如果响应中没有
Location头部,301 响应是无效的。301 不仅适用于浏览器,也适用于 API 客户端、爬虫等其他 HTTP 客户端.
重定向时,用的是全路径
HTTP 常见 Header
- Content-Type: 指明正文的数据类型(text/html 等)
- Content-Length: Body 的长度
- Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上; 处于request中
- User-Agent: 声明用户的操作系统和浏览器版本信息;
- referer: 当前页面是从哪个页面跳转过来的;判定跳转
- Location: 搭配 3xx 状态码使用, 告诉客户端接下来要去哪里访问;
- Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
关于 connection 报头
HTTP 中的 Connection 字段是 HTTP 报文头的一部分,它主要用于控制和管理客户 端与服务器之间的连接状态
核心作用
- 管理持久连接:Connection 字段还用于管理持久连接(也称为长连接)。持久 连接允许客户端和服务器在请求/响应完成后不立即关闭 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 连接。
关于 HTTP 常见 header 的表格




demo1:一个http的请求和应答

HTTP 历史及版本核心技术与时代背景
HTTP(Hypertext Transfer Protocol,超文本传输协议)作为互联网中浏览器和服务 器间通信的基石,经历了从简单到复杂、从单一到多样的发展过程。以下将按照时间 顺序,介绍 HTTP 的主要版本、核心技术及其对应的时代背景。
HTTP/0.9
核心技术:
- 仅支持 GET 请求方法。
- 仅支持纯文本传输,主要是 HTML 格式。
- 无请求和响应头信息。
时代背景:
1991 年,HTTP/0.9 版本作为 HTTP 协议的最初版本,用于传输基本的超文本 HTML 内容。
当时的互联网还处于起步阶段,网页内容相对简单,主要以文本为主。
HTTP/1.0
核心技术:
- 引入 POST 和 HEAD 请求方法。
- 请求和响应头信息,支持多种数据格式(MIME)。
- 支持缓存(cache)。
- 状态码(status code)、多字符集支持等。
时代背景:
1996 年,随着互联网的快速发展,网页内容逐渐丰富,HTTP/1.0 版本应运而 生。
为了满足日益增长的网络应用需求,HTTP/1.0 增加了更多的功能和灵活性。
然而,HTTP/1.0 的工作方式是每次 TCP 连接只能发送一个请求,性能上存在一定局限。
HTTP/1.1
核心技术:
- 引入持久连接(persistent connection),持管道化(pipelining)。
- 允许在单个 TCP 连接上进行多个请求和响应,提高了性能。
- 引入分块传输编码(chunked transfer encoding)。
- 支持 Host 头,允许在一个 IP 地址上部署多个 Web 站点。
时代背景:
1999 年,随着网页加载的外部资源越来越多,HTTP/1.0 的性能问题愈发突出。
HTTP/1.1 通过引入持久连接和管道化等技术,有效提高了数据传输效率。
同时,互联网应用开始呈现出多元化、复杂化的趋势,HTTP/1.1 的出现满足了 这些需求。
HTTP/2.0
核心技术:
- 多路复用(multiplexing),一个 TCP 连接允许多个 HTTP 请求。
- 二进制帧格式(binary framing),优化数据传输。
- 头部压缩(header compression),减少传输开销。
- 服务器推送(server push),提前发送资源到客户端。
时代背景:
2015 年,随着移动互联网的兴起和云计算技术的发展,网络应用对性能的要求越来越高。
HTTP/2.0 通过多路复用、二进制帧格式等技术,显著提高了数据传输效率和网 络性能。
同时,HTTP/2.0 还支持加密传输(HTTPS),提高了数据传输的安全性。
HTTP/3.0
核心技术:
- 使用 QUIC 协议替代 TCP 协议,基于 UDP 构建的多路复用传输协议。
- 减少了 TCP 三次握手及 TLS 握手时间,提高了连接建立速度。
- 解决了 TCP 中的线头阻塞问题,提高了数据传输效率。
时代背景:
2022 年,随着 5G、物联网等技术的快速发展,网络应用对实时性、可靠性的要求越来越高。
HTTP/3.0 通过使用 QUIC 协议,提高了连接建立速度和数据传输效率,满足了这些需求。
同时,HTTP/3.0 还支持加密传输(HTTPS),保证了数据传输的安全性。
更多推荐













所有评论(0)