浅聊一下HTTP协议

在日常上网浏览网页、刷视频时,背后都离不开 HTTP 协议的支持。作为 Web 世界的 “交通规则”,它负责服务器和客户端浏览器之间的数据传输。这篇文章就带大家全面了解 HTTP 协议,从基本概念到通信细节,再到安全相关的 HTTPS,让你对它有清晰的认知。

一、HTTP 协议是什么?

HTTP 协议,全名叫 Hyper Text Transfer Protocol(超文本传输协议),是应用层里专门用来在服务器和客户端浏览器之间传输超文本数据的协议。像我们平时看到的文字、图片、视频、音频这些,都靠它来传递。

它不只是个简单的传输协议,还是个双向协议,工作在 “浏览器 - 服务器” 架构下。简单说就是:浏览器把请求数据发给服务器,服务器处理完请求后,再把响应信息回传给浏览器。

二、HTTP 协议怎么通信?

HTTP 属于应用层协议,默认用 80 端口,在传输层会借助 TCP 协议来传数据。整个通信过程分 11 步,咱们结合浏览器和服务器(比如 Tomcat)的交互来看看:

  1. 用户在浏览器上发起新请求,比如输入网址按回车;
  2. 浏览器向服务器发送 TCP 连接请求;
  3. 服务器和浏览器通过 TCP 三次握手,建立起 TCP 连接;
  4. 浏览器按照 HTTP 协议格式,生成请求数据包(也就是 HTTP 请求报文);
  5. 把这个请求数据包发给服务器;
  6. 服务器按照 HTTP 协议格式,解析收到的请求报文;
  7. 服务器执行请求处理,调用相关的业务逻辑方法,生成响应数据;
  8. 服务器再按照 HTTP 协议格式,把响应数据打包成响应数据包(HTTP 响应报文);
  9. 服务器把响应数据包发送给浏览器;
  10. 浏览器按照 HTTP 协议格式,解析响应数据包;
  11. 浏览器把响应数据包里的内容显示在页面上,用户就能看到网页了。

三、URL:定位资源的 “地址”

HTTP 协议靠 URL(Uniform Resource Locator,统一资源定位符)来找到要访问的资源,它的格式是:http://host [":"port] [abs_path]

给大家举个例子:http://192.168.0.116:8080/index.html,这里每个部分的意思很明确:

  • “http” 表示用 HTTP 协议定位网络资源;
  • “host” 是合法的 Internet 主机域名或者 IP 地址,比如例子里的 “192.168.0.116”;
  • “port” 是端口号,要是没写就用默认的 80 端口,例子里用的是 8080 端口;
  • “abs_path” 是请求资源的 URI,例子里就是 “/index.html”。

这里得提一下 URL 和 URI、URN 的关系。URL 是 URI(Uniform Resource Identifier,统一资源标识符)的子集,它在 URI 的基础上多了定位资源的能力。而 URI 除了包含 URL,还包含 URN(Uniform Resource Name,统一资源名称)。URN 只用来定义资源的名称,没法定位资源,比如 “urn:isbn:0451450523”,这只是一本书的 ISBN 编号,能确定是哪本书,但没法知道在哪儿能找到这本书。

简单总结下三者的关系:URI 是大概念,下面分了 URL 和 URN,URL 能定位资源,URN 只能命名资源。

四、HTTP 报文:数据传输的 “包裹”

HTTP 报文分请求报文和响应报文,就像快递包裹一样,里面装着通信需要的各种信息。

4.1 请求报文

浏览器通过 URL 发请求时,会把请求信息打包成 HTTP 请求报文发给服务器。它的结构分四部分:

  1. 第一行是请求行,包含请求方式、URL、协议版本,比如 “GET /index.html HTTP/1.1”;
  2. 接下来几行是 HTTP 请求首部,里面有多个首部字段,用来传递额外的请求信息;
  3. 一个空行,作用是分隔首部和后面的内容主体 Body;
  4. 最后是请求的内容主体,也就是要传给服务器的数据(不是所有请求都有)。

4.2 响应报文

服务器处理完请求后,会把响应信息装进 HTTP 响应报文回传给浏览器。它的结构和请求报文类似,也分四部分:

  1. 第一行是状态行,包含协议版本、状态码和描述,最常见的就是 “HTTP/1.1 200 OK”,表示请求成功;
  2. 接下来几行是响应首部,同样有多个首部字段;
  3. 一个空行,分隔首部和内容主体;
  4. 最后是响应的内容主体,也就是服务器返回给浏览器的数据,比如网页的 HTML 代码。

给大家看个 HTTP 响应报文的示例(实际报文会更复杂,这里是简化版):

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1234<html>
<body>
响应内容
</body>
</html>

五、常用的 HTTP 请求方式

HTTP 请求报文的第一行(请求行)里会指定请求方式,常见的有 GET、POST、HEAD、PUT、DELETE、OPTIONS 这几种,各自的用途不一样:

请求方式用途特点
GET获取资源只检索数据,不影响资源;参数通过 URL 传递;幂等且可缓存
POST提交数据增加资源用来创建或增加资源;两个相同请求不会覆盖;参数通过 Request Body 传递;非幂等且不可缓存
HEAD获取响应报头和 GET 类似,但只返回响应报头,没有内容主体;常用于确认 URL 有效性和资源更新时间
PUT修改资源用来更新资源;两个相同请求会覆盖;数据通过内容主体传递;幂等
DELETE删除资源用来删除指定资源;幂等
OPTIONS查询支持的方法询问指定 URL 支持哪些请求方式;返回结果会包含 “Allow: GET, POST, HEAD, OPTIONS” 这类内容

这里重点说下 GET 和 POST 的区别,这俩是平时用得最多的:

  1. 用途不同:GET 是拿数据,POST 是提交数据;
  2. 请求报文格式有差异:POST 的请求行是 “POST /URL HTTP/1.1 \r\n”,GET 的是 “GET /URL HTTP/1.1 \r\n”;
  3. 参数传递方式不一样:GET 的参数在 URL 里,POST 的参数在 Request Body 里;
  4. 幂等性和缓存不同:GET 是幂等(多次执行结果一样)且能缓存,POST 是非幂等且不能缓存。

六、HTTP 首部字段:传递额外信息的 “小纸条”

HTTP 首部字段就像通信时附带的 “小纸条”,用来传递额外的信息,比如服务器域名、数据长度、内容类型等等。下面给大家介绍几个常用的:

  1. Host 字段:浏览器发请求时,用来指定服务器的域名。示例:Host: www.apesource.com
  2. Content-Length 字段:服务器返回响应时,告诉浏览器本次响应数据的长度。示例:Content-Length: 1000
  3. Connection 字段:浏览器用来要求服务器使用长连接,方便后续请求复用。示例:Connection: keep-alive(要是想断开连接,就写Connection: close
  4. Content-Type 字段:服务器告诉浏览器,本次响应数据的类型和编码。示例:Content-Type: text/html; charset=utf-8(表示是 HTML 文件,编码是 UTF-8)
  5. Accept 字段:浏览器发请求时,说明自己能接受哪些格式的响应数据。示例:Accept: */*(表示所有格式都能接受)
  6. Content-Encoding 字段:服务器告诉浏览器,响应数据用的压缩格式。示例:Content-Encoding: gzip
  7. Accept-Encoding 字段:浏览器告诉服务器,自己能处理哪些压缩格式。示例:Accept-Encoding: gzip, deflate

七、HTTP 状态码:请求结果的 “反馈信号”

服务器返回的响应报文里,状态行中的状态码就像 “反馈信号”,告诉浏览器请求处理的结果。状态码分 5 大类,每类有不同的含义:

7.1 1XX:信息提示

这类状态码是协议处理中的中间状态,实际用得很少,主要是告诉浏览器 “请求正在处理中”。

7.2 2XX:请求成功

表示服务器成功处理了请求,常见的有:

  • 200 OK:最常用的,说明请求完全成功,响应里有完整的内容主体;
  • 204 No Content:和 200 OK 类似,但响应报文没有内容主体;
  • 206 Partial Content:用于分块下载或断点续传,说明返回的只是资源的一部分。

7.3 3XX:重定向

表示客户端请求的资源位置变了,需要用新的 URL 重新请求,常见的有:

  • 301 Moved Permanently:永久重定向,说明原来的资源没了,以后都得用新 URL 访问;
  • 302 Found:临时重定向,资源还在,但暂时得用另一个 URL 访问。

7.4 4XX:客户端错误

表示浏览器发的请求有问题,服务器没法处理,常见的有:

  • 400 Bad Request:请求报文格式错了,服务器看不懂;
  • 403 Forbidden:服务器不让访问这个资源,不是请求格式的问题;
  • 404 Not Found:请求的资源在服务器上找不到;
  • 405 Not Allowed:服务器不支持浏览器用的这种请求方式。

7.5 5XX:服务器错误

表示请求没问题,但服务器处理时出了内部错误,常见的有:

  • 500 Internal Server Error:服务器内部出了未知错误;
  • 501 Not Implemented:浏览器请求的功能,服务器还没实现;
  • 502 Bad Gateway:服务器作为网关或代理时,访问后端服务器出错了(自身没问题);
  • 503 Service Unavailable:服务器现在太忙了,暂时没法响应请求,建议稍后再试。

八、连接管理:让通信更高效

HTTP 的连接管理主要涉及短连接、长连接和管线化连接,目的是减少通信开销,提高效率。

8.1 短连接和长连接

  • 短连接:HTTP/1.0 默认用的是短连接。每次通信都要重新 TCP 三次握手建立连接,响应完就 TCP 四次挥手断开。这样频繁建立和断开连接,开销很大。
  • 长连接:HTTP/1.1 改成了默认长连接(也叫持久性连接)。建立一次 TCP 连接就能进行多次 HTTP 通信,不用每次都重新连,大大减少了开销,还能减轻服务器压力。

这里要注意两点:

  1. HTTP/1.0 里要是想用长连接,得在请求里加Connection: Keep-Alive
  2. HTTP/1.1 里要是想断开长连接,客户端或服务器得发Connection: close

8.2 管线化连接

管线化连接是把多个 HTTP 请求批量提交的技术,发请求时不用等服务器先响应前一个。不过这得基于长连接,而且只有 HTTP/1.1 支持,HTTP/1.0 不支持。

比如以前发两个请求,得等第一个请求的响应回来,再发第二个;有了管线化,能同时把两个请求发出去,服务器处理完再依次返回响应,效率更高。

九、HTTPS:给 HTTP 加层 “安全锁”

HTTP 协议因为用明文传输,存在不少安全问题,而 HTTPS 就是为了解决这些问题而生的。

9.1 HTTP 的安全隐患

HTTP 用明文传数据,会有三个主要问题:

  1. 内容可能被窃听:比如数据被抓包,里面的信息就能被看到;
  2. 通信方身份可能被伪装:比如遇到钓鱼网站,你以为是正规网站,其实是假的;
  3. 报文可能被篡改:比如传输过程中,数据被改了(像强制植入广告),还没法发现。

9.2 什么是 HTTPS?

HTTPS 不是新协议,而是在 HTTP 和 TCP 之间加了一层 SSL(Secure Sockets Layer,安全套接层)。简单说就是:HTTP 先和 SSL 通信,再由 SSL 和 TCP 通信。通过 SSL,HTTPS 有了加密(防窃听)、认证(防伪装)、完整性保护(防篡改)这三个能力。

9.3 HTTP 和 HTTPS 的区别

  1. 安全性不同:HTTP 明文传输,不安全;HTTPS 加了 SSL,加密传输,安全;
  2. 连接建立过程不同:HTTP 只要 TCP 三次握手就能传报文;HTTPS 在 TCP 三次握手后,还要进行 SSL 握手,才能传加密报文;
  3. 端口不同:HTTP 默认 80 端口,HTTPS 默认 443 端口;
  4. 证书要求不同:HTTPS 需要向 CA(证书权威机构)申请数字证书,证明服务器身份;HTTP 不用。

9.4 两种加密方式

HTTPS 的加密主要用两种方式,各有优缺点:

9.4.1 对称密钥加密

加密和解密用同一个密钥。优点是运算速度快,缺点是没法安全地把密钥传给对方 —— 要是密钥在传输过程中被偷了,加密就没意义了。

9.4.2 非对称密钥加密

也叫公开密钥加密,加密和解密用不同的密钥(一个公钥,一个私钥)。公钥谁都能拿,私钥只有自己有。

  • 加密过程:发送方用接收方的公钥加密数据,接收方用自己的私钥解密;
  • 签名过程:发送方用自己的私钥签名,接收方用发送方的公钥验证签名,能确认发送方身份。

优点是公钥传输安全,缺点是运算速度慢。

9.5 HTTPS 的工作原理

HTTPS 的工作过程其实就是结合了两种加密方式,既保证安全又兼顾速度,具体步骤如下:

  1. 用户用浏览器访问 HTTPS 网站,服务器收到请求后,选择浏览器支持的加密和哈希算法,然后把数字证书(里面包含颁发机构、网址、公钥、有效期等信息)返回给浏览器;
  2. 浏览器校验证书:要是证书有问题(比如过期、不被信任),会弹出警告;要是没问题,就生成一个随机秘钥 X,用证书里的公钥加密后发给服务器;
  3. 服务器收到加密后的随机秘钥 X,用自己的私钥解密,得到 X;然后用 X 对网页内容加密,发给浏览器;
  4. 浏览器用之前生成的随机秘钥 X 和约定的加密算法,解密服务器发来的内容,最后把网页显示给用户。

到这里,HTTP 协议的核心内容就讲完了。从基本概念到通信流程,再到安全升级的 HTTPS,相信大家对 HTTP 有了更全面的认识。如果有疑问,欢迎在评论区交流~

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

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

相关文章

机器人控制器开发(定位——cartographer ros2 使用2)

文章总览 1 纯定位模式 当完成建图后&#xff0c;会生成pbstream格式的地图文件 配置纯定位模式的lua脚本 backpack_2d_localization.lua include "backpack_2d.lua"TRAJECTORY_BUILDER.pure_localization_trimmer {max_submaps_to_keep 3, } POSE_GRAPH.optimi…

《大数据之路1》笔记3:数据管理

一 元数据 1.1 元数据概述 定义&#xff1a; 元数据是关于数据的数据&#xff0c;元数据打通了源数据、数据仓库、数据应用&#xff0c;记录了数据从生产到消费的全部过程。元数据主要记录数据仓库中模型的定义、各层级间的映射关系、监控数据仓库的数据状态和ETL的任务运行状态…

排序实现java

排序算法概述Java中实现排序可以通过多种方式&#xff0c;包括内置方法、自定义算法或使用第三方库。常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序等。使用Arrays.sort()方法对于数组排序&#xff0c;Java提供了Arrays.sort()方法&#xff0c;支持对基本…

51c大模型~合集182

我自己的原文哦~ https://blog.51cto.com/whaosoft/14174587 #LaV-CoT 超越GPT-4o&#xff0c;蚂蚁集团与南洋理工大学提出&#xff1a;首个语言感知的视觉思维链 随着大型视觉语言模型&#xff08;VLM&#xff09;的飞速发展&#xff0c;它们在处理复杂的视…

C++ STL之deque的使用和模拟实现

目录 deque 核心本质与定位 与stack和queue的关系: deque的使用 deque的底层实现 deque的原理介绍 deque的缺陷 总结: deque deque文档 : deque 翻译: 双端队列 deque&#xff08;通常发音类似“deck”&#xff09;是“double-ended queue”&#xff08;双端队列&…

布草洗涤厂设备租赁押金原路退回系统—东方仙盟

设备租赁状态设备管理添加设备设备收押金设备退押金在布草洗涤行业的运营版图中&#xff0c;设备租赁是连接厂商与客户的重要纽带&#xff0c;而押金的收取与退还则是这一环节中关乎信任与效率的关键节点。未来之窗布草洗涤厂深谙此道&#xff0c;专为设备租赁业务打造的 “押金…

换源rocklinux和centos

一、Rockylinux换源&#xff0c;国外的源换成国内的源#nmcli connection modify ens33 ipv4.addresses 192.168.121.11 ipv4.gateway 192.168.121.2 ipv4.method manual ipv4.dns 114.114.114.114 connection.autoconnect yes修改地址#systemctl stop firewalld#systemctl diab…

第一部分:服务器硬件配置

目录1.1 服务器上架与连线1.2 启用CPU虚拟化功能&#xff08;BIOS设置&#xff09;1.3 配置RAID存储步骤1&#xff1a;进入RAID配置界面步骤2&#xff1a;确认RAID控制器信息步骤3&#xff1a;创建系统RAID&#xff08;用于安装ESXi&#xff09;步骤4&#xff1a;创建数据RAID&…

手搓一个 DELL EMC Unity存储系统健康检查清单

写在前面对于DELL EMC存储系统Unity的一些深度的健康检查通过Web的Unisphere图形化界面是做不到的&#xff0c;图形化界面只能看到是否有告警&#xff0c;物理的东西是否有问题的&#xff0c;逻辑的Pool和LUN等是否ready&#xff0c;再深入的潜在的问题是查不到的。另外&#x…

【数据结构】二叉树的概念

01 概念定义&#xff1a;二叉树既然叫二叉树&#xff0c;顾名思义即度最大为2的树称为二叉树。 它的度可以为 1 也可以为 0&#xff0c;但是度最大为 2 。 一颗二叉树是节点的一个有限集合&#xff0c;该集合&#xff1a;① 由一个根节点加上两棵被称为左子树和右子树的二叉树组…

【RK3576】【Android14】如何在Android14下单独编译kernel-6.1?

单独编译kernel依赖如下几个源码&#xff1a;【交叉编译工具链】prebuilts/clang/host/linux-x86/clang-r487747c【内核源码】kernel-6.1为什么Android下编译内核使用clang作为交叉编译工具链而不是GCC&#xff1f;Android 14 选择使用预置的 Clang 工具链&#xff08;如 clang…

什么是Redis的Pipeline

介绍Redis的Pipeline是一种网络优化技术&#xff0c;在没有Pipeline的时候&#xff0c;客户端往redis发送请求&#xff0c;客户端需要等到redis响应之后才能发送下一个请求。而Pipeline&#xff0c;使redis可以一次性接收多个请求。减少了通信次数&#xff0c;显著的提高了性能…

【ElementUI el-table跨页勾选】

一、el-table需加上refs和 row-key属性 二、type"selection"勾选框 需加上 reserve-selection储备选择属性 三、在分页请求数据时&#xff0c;触发 setSelected()方法 四、在 selection-change变化时保存 selectedRows <el-table ref"tables" :data&quo…

论文阅读/博弈论/拍卖:《Truthful Auction for Cooperative Communications》

摘要&#xff1a;一方面&#xff0c;协作通信由于其在提升无线网络容量方面的巨大潜力而日益受到关注。另一方面&#xff0c;协作通信技术的实际应用却很少见&#xff0c;即使在一些对带宽需求极高的应用场景中&#xff0c;系统设计者也并未采用协作通信技术来开发创新的网络解…

系统软中间件:连接软件与硬件的桥梁

理解“系统软中间件”这个术语很重要&#xff0c;它实际上是两个紧密相关但又不同的概念的组合&#xff1a; 系统软件中间件 严格来说&#xff0c;“系统软中间件”不是一个标准的独立术语。它通常指的是属于系统软件范畴的中间件&#xff0c;或者理解为作为系统软件重要组成部…

音视频学习(六十四):avc1 hvc1和hev1

基础概念缩写编码标准FourCC说明AVC/H.264Advanced Video Codingavc1最常用的 H.264 编码标识符&#xff0c;兼容 MP4/MOV/FMP4 等容器。HEVC/H.265High Efficiency Video Codinghvc1HEVC 视频流在 MP4/FMP4 中常用标识符&#xff0c;要求存储 NALU 的 VPS/SPS/PPS&#xff08;…

【WIT】编程百问一

01 什么时postman&#xff1f; Postman 是一款专门用于帮助开发人员处理 API 的工具&#xff0c;它的作用主要有以下几个方面&#xff1a; 方便调试 API&#xff1a;就像你打电话给别人要先拨对号码一样&#xff0c;开发人员要让不同的软件系统之间通过 API 进行通信&#xff…

RAG 从入门到放弃?丐版 demo 实战笔记(go+python)

背景 我当前有一个业务系统&#xff0c;希望能添加一个机器人助手。直接使用大模型&#xff0c;由于缺少相关的业务数据&#xff0c;效果并不理想&#xff0c;了解一下 RAG。 什么是 RAG RAG(Retrieval Augmented Generation)&#xff0c;搜索引擎 大模型。 简单来说就是从…

《IDEA 突然“三无”?三秒找回消失的绿色启动键、主菜单和项目树!》

目录 一、左上角绿色启动键凭空消失 1.1 解决办法 二、顶部 File / Edit / View... 整条主菜单栏 罢工 2.1 解决办法 三、左侧 Project 工具窗口 集体失联&#xff0c;只剩 External Libraries 孤零零 3.1 解决办法 昨天下午撸代码&#xff0c;不知道按到了哪儿&#xff…

软件工程实践二:Spring Boot 知识回顾

文章目录一、创建项目&#xff08;Spring Boot 向导&#xff09;二、项目最小代码示例三、运行与验证四、标准目录结构与说明五、Maven 依赖最小示例&#xff08;仅供参考&#xff09;六、常用配置&#xff08;application.yml 示例&#xff09;七、返回 JSON 与统一异常八、Va…