一文拿下HTTP

news2024/11/6 21:44:11

HTTP

HTTP协议

是应用层使用最广泛的协议之一,从浏览器获取到网页,就是基于http

  • 浏览器和服务器之间的交互桥梁

  • 基于传输层的TCP协议来实现的,是一种无状态的应用层协议

    • 为啥是无状态的呢

      • 简化服务器端的处理逻辑:HTTP是无状态的,服务器不必保存客户端请求的状态,这样可以减少服务器存储空间的占用和处理复杂度,更容易扩展和管理系统
      • 支持多个请求同时进行:HTTP请求和响应式独立的,浏览器可以同时发送多个请求,提高网络通信的效率
  • 在这里插入图片描述

HTTP请求

  • 首行

    • 方法 + URL + 版本号
      在这里插入图片描述

      • 认识URL

        • URL的组成
          在这里插入图片描述

        • 最重要的四个部分

          • 域名/IP

          • 端口号

            • HTTP默认端口号80
            • HTTPS默认端口号443
          • 带层次的路径

          • 查询字符串(以键值对的方式来组织的)

        • 举个例子

          • 在这里插入图片描述
      • 方法

        • 在这里插入图片描述

          • GET请求

            • 使用场景

              • 在浏览器地址直接输入url
              • 点击收藏夹
              • html里的link、script、img、a…
              • 通过js来构造get(form标签)
            • 举个例子

              • 在这里插入图片描述
          • POST请求

            • 使用场景

              • 典型的就是登录操作,登录跳转的时候会设计POST
              • 传文件
          • GET 和 POST 的区别

            • GET和POST本质没有区别,大部分场景下能够互相替代,但是在适用情况下是有差异的

            • 传参方式不同

              • GET是习惯使用query string
              • POST是习惯使用body正文传参
            • 语义差别(使用场景上的不同)

              • GET一般用于从服务器获取数据
              • POST一般用于给服务器提交数据
            • 幂等

              • GET请求一般是获取数据,设置为幂等的,每次请求的数据是一样的
              • POST提交数据,每次提交的数据不同,所以是不幂等的
            • 缓存方面

              • GET可以缓存
              • POST一般不能缓存
            • 长度限制

              • GET请求一般有长度限制
              • POST请求一般没有长度限制
  • 请求头(header)

    • 构成
      在这里插入图片描述

      • Host

        • 描述了服务器所在的端口,用来描述最终访问的目标。这个内容大概率和URL中是一样的,也有一定情况是不同的
      • Content-Length

        • GET请求中没有这两个字段,POST中一定有
        • body的数据长度
      • Content-Type

        • body的数据格式
      • User-Agent(UA)

        • 描述了浏览器和操作系统的版本
        • 主要分为PC和移动端
      • Referer

        • 当前页面的来源
        • 如果直接通过地址栏输入地址、直接点击收藏夹,就没有referer
        • 用于
          在这里插入图片描述
      • Cookie

        • 本质上是浏览器给网址提供的 本地存储数据的机制

          • 网页是默认不允许访问计算机的硬盘的(为了保证安全,浏览器对于访问硬盘作出了明确的限制),但是我们有这个需求,所以就引入了cookie
          • 通过键值对的方式组织数据
        • cookie从哪来

          • 从服务器来,服务器来决定,浏览器的cookie要存什么
          • 浏览器通过HTTP响应报头部分(set-cookie字段)来知道自己要理解和存储的,下一次请求时就带上这个cookie
        • cookie在哪存

          • 可以认为存于浏览器,也可以认为存在硬盘中
          • cookie在存的时候,是按照浏览器+域名细分的
          • cookie的内容不仅有键值对,还有过期时间,越敏感的网站,过期时间越短
        • cookie要到哪去

          • 回到服务器里去
          • 客户端会通过cookie保存当前用户使用的中间状态,当客户端访问服务器的时候,就自动把cookie内容带入请求中,服务器就知道客户端什么样子
          • cookie就像是服务器在客户端的寄存处一样,用于服务器记录客户端的状态
        • cookie的工作原理

      • session

        • Session是什么

          • 除了将用户信息通过cookie存储在用户浏览器中,也可以利用session存储在服务器端,存储在服务器端的信息更加安全。 session可以存储在服务器上的文件、数据库或者内存中。可以将session存储在Redis这种内存型数据库中,效率会更高
        • Session工作原理
          在这里插入图片描述

          • 客户端登录完成之后,服务器会创建对应的 session,session 创建完之后,会把 session 的 id 发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着 sessionid,服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了
        • 使用session维护用户登录状态过程

          • 用户进行登录时,提交包含用户名和密码的表单,放入HTTP请求报文中

          • 服务器验证该用户名和密码,如果正确则把用户信息存储在Redis中,它在Redis中的key称为SessionID

            • SessionID的安全性问题,不能让它被恶意攻击者轻易获取,那么就不能产生一个容易被猜到的SessionID值。此外,还需要经常重新生成SessionID。在安全性要求高的场景,eg转账,除了使用Session管理用户状态,还要对用户进行重复验证,eg重新输入密码、短信验证码等方式
          • 服务器返回的响应报文的Set-Cookie首部字段包含了SessionID,客户端收到响应报文之后将该Cookie值存入浏览器中

          • 客户端之后对同一个服务器进行请求时会包含该Cookie值,服务器收到之后提取出Session ID,从Redis中取出用户信息,继续之前的业务操作

        • 如果客户端禁用了cookie,那么session还能用吗

          • 可以,Session的作用是在服务端来保持状态,通过sessionid来进行确认身份,但sessionid一般是通过Cookie来进行传递的。如果Cooike被禁用了,可以通过在URL中传递sessionid
      • cookie和session的区别

        • 为啥要有cookie和session

          • HTTP是无状态的,请求和响应都是独立的,一次会话中的多次请求时无感知的,如何解决这个问题呢?这就需要借助会话持久技术,常见的就是cookie和session

            • eg,用户进行登录操作的时候,切换到其他页面,服务器无法判断是哪个用户登录的,每次进行页面跳转的时候,都需要重新登录
        • 存储位置不同

          • cookie存储在客户端
          • session存放在服务端,session存储的数据比较安全
        • 存储的数据类型不同

          • 两者都是key-value的结构,cookie的value只能是字符串类型
          • session可以存储任意数据
        • 存储的数据大小限制不同

          • cookie大小受浏览器限制,很多是4k的大小
          • session理论上受当前内存的限制
        • 生命周期的控制

          • cookie的有效期可以设置较长时间
          • session的有效期比较短
  • 空行

    • 表示header的结束标记
  • 正文(body)

    • 如果是GET请求,一般没有body

    • 如果是POST请求,一般有body

    • body的数据格式

      • 根据请求头中的Content-Type字段来知道以何种方式解码

      • application/x-www-form-urlencoded

        • 原生form表单,不设置Content-Type属性的话,就默认以这种方式进行传输
      • multipart/form-data

        • 使用表单上传文件的时候,必须让表单的Content-Type 等于 multipart/form-data
        • 支持传输多种文件格式
      • application/json

        • 用得比较多,json字符串,支持格式化数据
      • text/xml

        • 一般用来传输xml格式的文件,这种数据格式

HTTP响应

  • 例如
    在这里插入图片描述

  • 首行

    • 版本号+状态码+描述码
      在这里插入图片描述

      • HTTP的状态码
        在这里插入图片描述

        • 200 OK

          • 成功
        • 404 NotFound

          • 访问资源不存在,在服务器中没找到
        • 403 Forbidden

          • 拒绝访问,没有权限
        • 302 Found

          • 3xx都是表示重定向
          • 重定向,类似呼叫转移
          • 这样的响应报文会在header里带个location属性,通过这个属性描述要跳转到哪个新地址
        • 500 Internal Server Error

          • 服务器内部错误(服务器代码抛异常了)
        • 504 Gateway timeout

          • 请求超时(响应时间太久,浏览器等不及了)
        • 在这里插入图片描述

  • header响应头

  • 空行

    • 表示header的结束标志
  • body

HTTP报文格式

  • 在这里插入图片描述

如何构造HTTP请求

对于GET

  • 地址栏直接输入

  • 点击收藏夹

  • html中的link script img a标签

  • form标签

    • 只能构造GET、POST,无法构造PUT、DELETE、OPTIONS等请求

      • GET请求
        在这里插入图片描述

      • POST请求
        在这里插入图片描述

Ajax构造http请求

  • 浏览器提供的一种通过js构造http请求的方式

  • html中,通过Ajax发起http请求后,不必等待服务器响应,就可以继续往下执行,等服务器响应回来,再由浏览器通知到我们的代码中

  • 代码中如何使用Ajax

    • js原生提供Ajax的api,但是很难用

    • jQuery提供的api,针对原生api的封装,简单很多

      • 是一个特殊的全局对象, j Q u e r y 的 a p i 都是以 是一个特殊的全局对象,jQuery的api都是以 是一个特殊的全局对象,jQueryapi都是以的方式引出的,只有一个参数,是一个js对象
        在这里插入图片描述
  • 跟form比起来,Ajax的优点

    • 支持PUT、DELETE方法
    • Ajax发送的请求可以灵活设置header
    • Ajax发送的请求的body也可以灵活设置

使用postman构造请求

  • 在这里插入图片描述

HTTP和HTTPS

区别

  • 两者默认端口不同

    • HTTP:80
    • HTTPS:443
  • URL前缀不同

    • HTTP 的 URL 前缀是 http://
    • HTTPS 的 URL 前缀是 https://
  • 安全性和资源消耗

    • HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。
    • HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源

HTTPS加密

  • 为什么需要加密

    • 因为http的内容是明文传输的,明文数据会经过中间代理服务器、路由器、WiFi热点、通信服务运营商等多个物理节点,如果信息再传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息不被双方察觉,这就是中间人攻击,所以我们需要对信息进行加密,最常用的就是对称加密
    • 加密流程
      在这里插入图片描述
  • 对称加密

    • 一个密钥,可以加密一段信息,也可以对加密后的信息进行解密,这就是对称加密
    • 但是对称加密怎么才能保证密钥只被传输双方知晓,同时不被别人知道呢?如果传输过程密钥被别人劫持到手,他就可以用密钥解开传输的任何内容了。如果浏览器预存了网站A的密钥,就可以确保不会有人知道密钥了,但是浏览器显然不能预存所有网站的密钥。所以我们就需要非对称加密
  • 非对称加密

    • 两把密钥:公钥和私钥,用公钥加密的内容只有私钥能解开,同时用私钥加密的内容只有公钥能解开

    • 只能保证单方向传输的安全性:服务器先把公钥以明文传输给浏览器,之后浏览器向服务器传数据前先用这个公钥加密好再传,然后服务器私钥解密。但是服务器到浏览器这个明文传输的阶段,公钥被中间人劫持了怎么办?他也能用公钥解密服务器传来的信息了,只能保证浏览器到服务器传输数据的安全性

    • 两组密钥

      • 服务器拥有公钥A和私钥A,浏览器拥有公钥B和私钥B
      • 浏览器把公钥B明文传输给服务器,服务器将公钥A明文传输给浏览器
      • 浏览器向服务器传输的内容用公钥A加密,服务器使用私钥A解密。服务器向浏览器传输的内容用公钥B加密,浏览器使用私钥B解密
    • 这样做的确可以,但是非对称加密算法非常耗时,对称加密快很多

  • 非对称加密+对称加密

    • 网站服务器拥有非对称加密的公钥A,私钥A
    • 浏览器向服务器请求,服务器把公钥A明文传输给浏览器
    • 浏览器随机生成一个用于对称加密的密钥X,并且使用公钥A加密传给服务器
    • 服务器拿到私钥A解密得到密钥X,这样双方都有密钥X,且别人都无法知道它,之后的数据都通过密钥X加密解密
  • 数字证书

    • 其实非对称加密+对称加密还是会遭到中间人攻击

      • 中间人把公钥A劫持,保存下来,并且将公钥A替换为自己伪造的公钥B
      • 浏览器生成一个用于对称加密的密钥X,用公钥B加密后传给服务器
      • 中间人劫持到后用私钥B解密得到密钥X,再用公钥A加密后传输给服务器
      • 服务器拿到后用私钥A解密得到密钥X
    • 数字证书

      • 根本原因是浏览器无法确认收到的公钥是不是服务器自己的,如何证明浏览器收到的公钥是网站服务器的呢?CA机构颁发“身份证”:数字证书

      • 网站在使用HTTPS前,需要向CA机构申领一份数字证书,其中包含持有者信息、公钥信息等

      • 如何防止数字证书被篡改?

        • 数字签名
          在这里插入图片描述

          • 制作过程

            • CA机构拥有非对称加密的私钥和公钥
            • CA机构对证书明文数据T进行hash
            • 对hash后的值用私钥加密,得到数字签名S
          • 验证过程

            • 拿到证书,得到明文T,签名S
            • 拿CA机构的公钥对S解密,得到S(是浏览器信任的机构,浏览器保留它的公钥)
            • 用证书指明的hash算法对明文T进行hash得到T
            • 对比T和S的值,如果相等则证书可信
          • 为什么制作签名的时候要hash一次

            • 非对称加密效率差,证书信息长,比较耗时。而hash后得到的是固定长度的信息,这样解密就快很多
        • 中间人有可能篡改吗?

          • 假如中间人篡改了原文,但是它没有CA机构的私钥,无法得到加密后的签名,就无法篡改签名,此时T和解密后S的值不同,就说明被篡改了,证书不可信
        • 中间人有可能把证书掉包吗

          • 证书包含网站A的信息,包括域名,浏览器把证书的域名和请求 的域名对比一下,就知道有没有掉包了

常见的加密算法

  • 对称加密

    • DES
    • AES
  • 非对称加密

    • RSA
    • DSA
    • ECC

HTTP的长、短连接

HTTP协议和TCP/ID协议的关系

  • HTTP的长连接和短连接本质上是TCP的长连接和短连接
  • HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议
  • IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传输数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序和发送顺序一致

如何理解HTTP协议是无状态的

  • 这里的无状态,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态
  • HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接

什么是长短连接

  • HTTP/1.0默认使用短连接

    • 短连接:三次握手建立连接,一次收发数据之后就进行四次挥手
  • HTTP/1.1起,默认使用长连接

    • 长连接:一次连接可以收发多条数据,只有超过一定的时间不再发送数据 才会断开连接
    • 使用长连接的HTTP协议,会在响应头加入:Connection:keep-alive

HTTP1.0 1.1 2.0的主要区别

在这里插入图片描述

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

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

相关文章

【调度算法】NSGA III

写在前面:NSGA III算法在数学上比NSGA II算法要复杂得多,尤其是在参考点那里,我也不是看得很明白,所以这篇文章只是尝试梳理下NSGA III的整体改进思路和优势,不对函数、公式、代码之类的细节做过多分析。如有错误&…

【CANoe】文件处理_hex文件读取解析

hex文件里面只有00,01,04三种码。那么我们在解析的时候只需要对这三种不同状态的进行不同的解析即可。 hex文件格式的解析,可阅读:HEX文件格式详解 首先创建一个Block的结构体,根据经验我们知道,一个数据…

gRPC之gRPC转换HTTP

1、gRPC转换HTTP 我们通常把RPC用作内部通信,而使用Restful Api进行外部通信。为了避免写两套应用,我们使用grpc- gateway 把gRPC转成HTTP。服务接收到HTTP请求后,grpc-gateway把它转成gRPC进行处理,然后以JSON 形式返回数据。…

FOC程序算法编写

1、FOC多路PWM驱动 在BLDC电机控制上,6路PWM 控制模式比3路PWM更自由,因为6个半桥式晶体管的每一个都可以单独控制。 (1)3PWM (2)6PWM 2、死区时间 开关元器件的和严格意义并不是相同的。IGBT,…

驱动编写LED灯

demo.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include<linux/io.h> #include "head.h" unsigned int major; char kbuf[128] {}; // 定义三个指针指向映射后的虚拟…

vue3.0 + element plus upload文件上传

提供了&#xff0c;文件超过指定个数&#xff0c;页面做了隐藏的效果 记录一下

HTTPS、SSL/TLS,HTTPS运行过程,RSA加密算法,AES加密算法

1、为什么网站要使用安全证书 我们所处的网络环境是复杂多样的&#xff0c;大致分为两类&#xff0c;一类是可信的网络服务商&#xff0c;比如直接连的电信运营商的网络&#xff0c;网线&#xff0c;4G&#xff0c;5G&#xff1b;另一类是不可信的网络&#xff0c;比如WIFI&am…

libpcap之零拷贝mmap

一、用户空间 在通过socket(AF_PACKET,…)创建fd后&#xff0c;进行接收队列的建立 //pcap-linux.c static int pcap_activate_linux(pcap_t *handle) { ...ret setup_mmapped(handle, &status); ... }1.1 设置默认ring bufer size static int setup_mmapped(pcap_t *h…

点云处理【六】(点云分割)

点云分割 第一章 点云数据采集 1. 点云分割 点云数据中包含目标物体&#xff0c;点云分割算法即将物体分割出来。 2 分割算法 2.1 RANSAC(随机采样一致性)方法 基于随机采样一致性的分割的步骤如下&#xff1a; 1.从一个样本集S中&#xff0c;随机抽取n个样本&#xff0c;…

下拉选择框监听el-option的方式

<el-select v-model"form.expenseType" placeholder"请选择费用类型" clearable filterable size"small"><el-option v-for"item in expenseNameList" :key"item.value" :label"item.label" :value"…

发现学习的新契机——广东开放大学电大搜题服务

广东开放大学一直以来致力于为广大学子提供优质的教育资源和学习支持&#xff0c;而最新推出的电大搜题微信公众号更进一步满足了学生们对于学习资料的需求。这一全新的学习辅助工具将为学子们带来便捷、高效的学习体验。 无论是传统的广播电视大学学生&#xff0c;还是广东开…

首届中国虚拟艺术巡展 NFT Showcase 圆满落幕!

由 Web3 营销先锋 Beep Crypto 精心策划&#xff0c;于 10 月 5 日至 10 月 17 日在广州潮流策展空间 YCC! 天宜隆重呈现。 本届展览以“虚拟时尚”为主题&#xff0c;融汇了众多的数字艺术展品&#xff0c;包括诸如 RTFKT X Nike、Gucci X 10KTF、Tiffany X Cryptopunks、Mee…

python二次开发Solidworks:读取立方体的高度

在SW中新建一个零件文档&#xff0c;建立一个立方体&#xff0c;长度和宽度自定义&#xff0c;高度100mm&#xff0c;下面通过python实现读取该立方体的高度&#xff1a; import win32com.client as win32 import pythoncomswApp win32.Dispatch(sldworks.application) swApp.…

使用telegram机器人发送通知

文章目录 背景1 创建机器人2 与机器人的会话3 调用API让机器人发送消息 背景 在训练深度学习模型时&#xff0c;除了粗略估计外&#xff0c;很难预测训练何时结束。此外&#xff0c;我们可能还想随时随地查看训练情况&#xff0c;如果每次都需要登录回服务器的话并不方便。因此…

RK3568笔记四:基于TensorFlow花卉图像分类部署

若该文为原创文章&#xff0c;转载请注明原文出处。 基于正点原子的ATK-DLRK3568部署测试。 花卉图像分类任务&#xff0c;使用使用 tf.keras.Sequential 模型&#xff0c;简单构建模型&#xff0c;然后转换成 RKNN 模型部署到ATK-DLRK3568板子上。 在 PC 使用 Windows 系统…

项目环境配置

一、后端环境搭建-前后端联调 1.1 nginx反向代理 1.2 nginx负载均衡配置 二、完善登录功能 处理密码明文&#xff0c;防止密码被别人获取破坏系统 MD5加密是单向的不可逆的 &#xff0c;不能由加密后的换算加密前的 //密码比对password DigestUtils.md5DigestAsHex ( pa…

二叉树,堆排序及TopK问题

要讲二叉树的概念&#xff0c;就要先讲树的概念。 树是什么呢&#xff1f; 树其实是一种储存数据的结构&#xff0c;因为他的结构倒过来和生活中的树很相似所以才被称之为树。 这是一颗多叉树&#xff0c;从最顶端的节点可以找到下边的几个节点&#xff0c;下边的节点又可以找…

Apollo:前端开发者的全栈探索之旅

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

【C语言必知必会 | 第四篇】一文带你精通顺序结构

引言 C语言是一门面向过程的、抽象化的通用程序设计语言&#xff0c;广泛应用于底层开发。它在编程语言中具有举足轻重的地位。 此文为【C语言必知必会】系列第四篇&#xff0c;进行C语言顺序结构的专项练习&#xff0c;结合专题优质题目&#xff0c;带领读者从0开始&#xff0…