详解HTTP协议(一)

news2024/11/25 20:22:35

1、HTTP概述

1、什么是HTTP

超文本传输协议(Hyper Text Transfer Protocol,HTTP)

HTTP是一个基于请求与响应的、无状态的应用层协议,用于在两点之间传输超文本数据,常基于TCP/IP协议传输数据

设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法

2、HTTP的特点

  • 基于TCP/IP协议:连接可以保证安全可靠,但内容就无法保证安全隐私了。
  • 基于请求响应模型:一次请求对应一次响应
  • 无状态的:每次请求之间相互独立

3、HTTP的优缺点

优点:

  • 简单:HTTP的报文格式是header+body,头部信息也是简单的key-value形式,易于解析
  • 灵活且易于扩展:HTTP工作在应用层,下层可以随意变化。而且HTTP的请求方法、状态码、头字段等组成部分都可以自定义,即插即用
  • 应用广泛且跨平台

缺点,都属于双刃剑:

  • 无状态:
    • 好处:服务器不需要保存每个HTTP连接的状态,减轻服务器的压力,把资源都用于提供服务
    • 坏处:完成有关联性的操作时比较麻烦,可以用Cookie、Session解决,手动维护状态
  • 明文传输
    • 好处:方便解析、调试
    • 坏处:容易被他人获取请求或响应的内容,不安全

HTTP最大的缺点就是不安全,体现在:

  • 通信使用明文,不加密,内容可能被窃取
  • 不会对通信双方的身份进行验证,可能访问到伪装的站点
  • 无法验证报文的完整性、正确性,通信内容可能被篡改

HTTP的安全问题,在HTTPS上得到了解决,引入了SSL/TSL层,获得了极致的安全。

4、为什么有了TCP还需要HTTP

  • 分层结构,TCP负责端到端的传输,HTTP专注于应用层的逻辑。上层服务不应该去强耦合底层协议,协议是会升级和淘汰的
  • TCP已经负责了很多事情,再给它加字段加功能会导致TCP过于庞大,难以升级和维护
  • 直接面向TCP开发网络应用,不利于专注于业务的开发,可能会深陷于协议的细节中

2、HTTP请求

1、HTTP请求报文组成

HTTP请求报文由4部分组成(请求行+请求头+请求空行+请求体

下面是一个POST方法的请求报文:

1、请求行

请求行分为三个部分:请求方法、请求地址URL和HTTP协议版本,它们之间用空格分割。例如,GET /index.html HTTP/1.1。

1、请求方法

HTTP/1.1 定义的请求方法有8种:

最常用的两种是GETPOST

2、URL

URI:统一资源标识符,在网络上唯一标识一个资源

URL:统一资源定位符,是一种资源位置的抽象唯一识别方法。

组成:<协议>://<主机>:<端口>/<路径>

端口和路径有时可以省略(HTTP默认端口号是80)

URL是URI的子集,它不仅唯一标识的一个资源,还提供了对该资源的访问方式。 

3、协议版本

协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1、HTTP/2、HTTP/3

2、请求头

请求头部为请求报文添加了一些附加信息,由键值对组成,每行一对,名和值之间使用冒号分隔。

3、请求空行

请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据。

4、请求体

请求数据不在GET方法中使用,而在POST方法中使用。POST方法适用于需要客户填写表单的场合

与请求数据相关的最常使用的请求头部是Content-Type和Content-Length。

2、GET与POST

1、两者的区别

GET

  • GET的含义是,从服务器获取指定的资源,要求服务器将目标资源放在响应报文的数据部分发送给客户端。

  • GET方式的请求不包含请求体部分,在URL后面使用一个问号分隔,然后把请求参数和对应的值直接附加在后面,这种方式的弊端是:

    • 参数长度受限制,不能传送大量数据
    • 不适合传送私密数据
  • GET也可以有请求体,但是RFC定义GET的作用是请求资源,所以根据这个语义,GET不需要请求体。

POST

  • POST的含义是,根据请求体的内容,对服务器的指定资源做相应的处理。
  • 将请求参数以键值对的形式封装在请求体中,好处是:
    • 浏览器不会对请求体大小做限制,可以传输大量数据
    • 数据不会直接展示在URL中,相对安全一些。但是HTTP是明文传输,抓个包就能看到了。
  • POST的URL也是可以带参数的,但一般没人这么做

2、它们是安全与幂等性吗

安全:请求不会破坏服务器的资源

幂等:多次发起相同的请求,返回结果都是相同的

结论:

  • 请求本身不能体现什么,得看它们具体做了什么事情。

  • GET方法一般用来读数据,是只读的,所以安全、幂等。

    • 所以可以给GET请求的响应做缓存,可以把响应的内容缓存在浏览器,也可以缓存在代理服务器
  • POST一般用来新增或修改数据,所以不安全、不幂等

    • 所以浏览器一般不会缓存POST请求的响应
  • 但是实际开发中,可以用GET请求来完成数据的修改和删除,也可以用POST来完成数据的查询

    那么此时GET就是不安全不幂等的,POST就是安全幂等的,所以还是要根据实际使用来确定。

3、HTTP响应

1、什么是响应

响应内容是服务器返回给浏览器的内容

当服务器收到浏览器的请求后,会发送响应消息给浏览器,浏览器根据响应内容来作出显示。

2、响应报文格式

HTTP响应与HTTP请求相似,也由4个部分构成:

  1. 响应行
  2. 响应头
  3. 响应空行
  4. 响应体

看一个简单的响应报文:

响应行:

HTTP/1.1 200 OK

响应头:

Server: Apache-Coyote/1.1

Content-Type: text/html;charset=UTF-8

Content-Length: 624

Date: Mon, 03 Nov 2014 06:37:28 GMT

响应空行

响应体

解析:

响应行:

  • HTTP/1.1 200 OK:响应协议为HTTP1.1,状态码为200,表示请求成功,OK是对状态码的解释;

响应头:

  • Server: Apache-Coyote/1.1:服务器的版本信息;
  • Content-Type: text/html;charset=UTF-8:响应体是html文件,使用的编码为UTF-8;
  • Content-Length: 624:响应体为724字节;
  • Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello:响应给客户端的Cookie;
  • Date: Mon, 03 Nov 2014 06:37:28 GMT:响应的时间,这可能会有8小时的时区差;

响应空行:

  • 和请求空行一样,用途是分隔响应头和响应体。

响应体:

  • 响应体有时是一个html文件,浏览器可以直接访问。
  • 如果访问的是一个jsp页面,响应返回的也是一个html文件。服务器将该jsp翻译成了一个html,然后再响应给浏览器。
  • 响应体的类型,由响应头的Content-Type指出

3、HTTP的常见字段

1、请求字段

  • Host:客户端发送请求时,用来指定服务器的域名。
    • Host: www.A.com
  • Accept:客户端告诉服务器,自己接收什么格式的数据
    • Accept: */* ,代表任何格式都可以
  • Accept-Encoding:客户端告诉服务器自己支持的压缩方式
    • Accept-Encoding: gzip, deflate
  • User-Agent:客户端告诉服务器,自己的浏览器信息
  • Referer:客户端告诉服务器,当前请求的来源地址,可以做防盗链或统计工作
  • Connection:使用TCP长连接

2、响应字段

  • Content-Type:服务器告诉客户端,本次响应的格式
    • Content-Type: text/html; charset=utf-8
  • Content-Length:本次响应的字节长度
    • Content-Length: 1000
  • Content-Encoding:指定服务器返回的数据的压缩方式
    • Content-Encoding: gzip
  • Connection:使用TCP长连接
    • Connection: keep-alive
  • Set-Cookie:服务器发给客户端的Cookie

3、响应行的状态码

响应状态码由三位数字组成,表示服务器对请求的响应结果

相当于服务器和浏览器单方面的暗号,浏览器接收到这三位数字,就明白了服务器的含义。

HTTP响应状态码的第一个数字定义了响应的类别,后面两位没有具体分类,第一个数字有五种可能的取值,具体介绍如下所示:

分类分类描述
1xx提示信息,服务器收到了请求,但需要客户端继续执行操作
2xx成功,报文被成功接收并处理
3xx重定向,资源位置发生变动,需要客户端重新发送请求
4xx客户端发生错误,发来的请求报文有误,服务器无法处理。
5xx服务器发生错误,服务器在处理请求的过程中发生了错误

常用的具体状态码如下:

状态码含义
200请求成功,浏览器会把响应回来的信息显示在浏览器端。
302表示重定向。比如说浏览器访问一个资源,服务器响应给浏览器一个302的状态码,并且通过响应头Location发送了一个新的url,告诉浏览器去请求这个url。这就是重定向。
304第一访问一个资源后,浏览器会将该资源缓存到本地,第二次再访问该资源时,如果该资源没有发生改变,那么服务器响应给浏览器304状态码,告诉浏览器使用本地缓存的资源
404客户端错误的一种,比如说在浏览器端请求一个不存在的资源,这时浏览器端会出现404状态码。
405客户端错误的一种,表示当前的请求方式不支持。比如说服务器端只对GET请求做了处理,而客户端的请求是post方式的,这个时候会出现405状态码。
500服务器端错误,比如说服务器端代码出现空指针等异常,浏览器就会收到服务器发送的500状态码。

300系列详解

  • 301:永久移动,服务器自动将请求转到新的地址
  • 302:重定向,服务器返回浏览器一个新的地址,浏览器再次访问这个地址去获得数据
  • 304:服务器告诉浏览器资源未修改,使用本地缓存

4、响应头

格式:

  • 响应头名称:值
  • 例如,Server : Apache-Coyote/1.1

常用的响应头:

响应头名称含义
Content-Type服务器告诉客户端,本次响应体的数据格式以及编码格式(字符集)
Content-Disposition服务器告诉客户端,以什么格式打开响应体数据。

详解:

  • Content-Disposition
    • 默认值为in-line,在当前页面打开。
    • 也可以设置为attachment,以附件形式打开响应体,用于文件下载。

5、响应体

响应体就是传输的数据。

4、资源跳转的不同方式

请求转发(forward)、请求重定向(redirect)、定时刷新都可以实现资源的跳转,但它们有一些区别。

1、资源跳转方式的区别

  • 请求转发

    • 一次请求,一次响应

    • 地址栏不变

    • 只能在服务器内部同一应用跳转,不能转发到别的服务器

  • 请求重定向

    • 两次请求,两次响应,不同的request对象(每次请求服务器都会创建新的request对象)

    • 地址栏发生了改变

    • 既可以在服务器内,也可以不同服务器不同应用上跳转

  • 定时刷新

    • 两次请求,两次响应,不同的request对象
    • 地址栏发生了改变
    • 可以用于服务器内部的资源跳转,也可以用于不同应用和不同服务器之间的资源跳转
    • 定时刷新和请求重定向的区别是,定时刷新可以设置时间间隔,比如实现“登录成功,5秒后返回首页”的操作。

2、资源跳转方式的实现过程

一句话总结:转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:

转发过程:

  1. 客户浏览器发送http请求
  2. web服务器接受此请求
  3. 服务器调用内部的一个方法在容器内部完成请求处理和转发动作
  4. 将目标资源发送给客户

在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。

转发行为是浏览器只做了一次访问请求。

重定向过程:

  1. 客户浏览器发送http请求
  2. web服务器接受后发送302状态码,以及对应新的location给客户浏览器
  3. 客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址
  4. 服务器根据此请求寻找资源并发送给客户端

既然是浏览器重新发出了请求,则就没有什么request传递的概念了。

在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。

重定向行为中,浏览器做了至少两次的访问请求。

在重定向的过程中,传输的信息会被丢失

3、转发和重定向的功能区别

转发:客户端提交了请求,服务器根据内部逻辑,跳转多个地址,给客户端返回最终结果。

重定向:客户端提交了请求,服务器返回302状态码和新的地址,要求客户端再次发出请求,客户端请求新的地址后,服务器返回最终结果。

简单来说,转发属于服务器内部的事情,比如一件事情A做了一半,发送给B继续做,最后完成。对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。

而重定向是,请求发送给A,A判断这件事无法完成,要求客户端再去访问B,B发现可以做,就完成了。这个时候浏览器可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。

生活中的例子:

假设你去办理某个执照,

转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。

重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。

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

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

相关文章

vmware17 开启虚拟机虚拟化

背景 我们需要在虚拟机里创建虚拟机。 实体机需要再bios里设置硬件设备的虚拟化 vmware软件可以在软件里设置虚拟化 设置虚拟化 现在我们看到是不能设置的&#xff0c;那是因为我现在开着这个虚拟机系统&#xff0c; 需要先关闭&#xff0c;才能对他进行设置。

【ACM】—蓝桥杯大一暑期集训Day5

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前正在学习C/C、Java、算法等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&#xff…

【Hypermesh】TetraMesh Panel 常用选项详解

我的主页&#xff1a; 技术邻&#xff1a;小铭的ABAQUS学习的技术邻主页博客园 : HF_SO4的主页哔哩哔哩&#xff1a;小铭的ABAQUS学习的个人空间csdn&#xff1a;qgm1702 博客园文章链接&#xff1a; https://www.cnblogs.com/aksoam/p/17575322.html 结合Hypermesh 2020 帮…

Cesium态势标绘专题-辅助文件

本专题没有废话,只有代码,撸! 提示内容封装Tooltip.ts /** 封装提示内容方法* @Author: Wang jianLei* @Date: 2023-01-17 14:56:53* @Last Modified by: jianlei wang* @Last Modified time: 2023-05-19 17:33:37*/ import CreateRemindertip from ./ReminderTip;const T…

Spring-缓存初步认识

Spring-缓存 简单介绍 缓存是一种介于数据永久存储介质和数据应用之间的数据临时存储介质缓存有效提高读取速度&#xff0c;加速查询效率 spring使用缓存方式 添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring…

【1++的C++初阶】之list

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C初阶】 文章目录 一&#xff0c;什么是list二&#xff0c;构造与析构2.1 结点结构2.2 链表结构2.3 迭代器结构 三&#xff0c;部分重要接口的作用及其实现3.1 迭代器相关的接口3.2 list相关…

uniapp 微信小程序 Picker下拉列表数据回显问题

效果图&#xff1a; 1、template <template><view class"items select-box"><view class"items-text">品牌型号</view><picker change"bindBrandType" :value"brandIndex" :range"brandList"…

线性表之链表

1、链表概述 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 顺序表的存储位置可以用一个简单直观的公式表示&#xff0c;它可以随机存取表中任意一个元素&#xff0c;但插入和删除需要移动大量元素。链式…

【多线程】Synchronize关键字之对象锁和类锁

目录 类锁和对象锁的区别 类锁 对象锁 测试用例 1.m1()和m2()方法都加锁【都为非静态&#xff0c;都加锁互斥执行】 2.m1()加锁&#xff0c;m2()不加锁【都为非静态&#xff0c;互不影响】 3.m3()和m4()都加锁【都为静态&#xff0c;互斥】 4.m3()加锁&#xff0c;m4()不…

WPF快速开发(2):图标库知识点

文章目录 前言知识点windows资源Style:样式Setter:属性继承关系 Trigger:触发器 WPF层级划分数据绑定声明数据上下文绑定数据模板 前言 图标资源下载 iconfont 知识点 windows资源 Window.Resources&#xff1a;资源位置声明X:Key&#xff1a;资源Id&#xff0c;用于前端的…

ARM DAY3 点亮三盏灯

1.汇编代码 .text .global _start _start: //RCC初始化 RCC_INIT://设置GPIOE组使能ldr r0,0x50000A28ldr r1,[r0]orr r1,r1,#(0x1<<4)str r1,[r0]//设置GPIOF组使能 ldr r0,0x50000A28ldr r1,[r0]orr r1,r1,#(0x1<<5)str r1,[r0]//LED1灯初始化 LED1_INIT://设置…

WebLLM项目:在浏览器中运行LLM聊天机器人

大家好&#xff0c;基于LLM的聊天机器人可以通过前端访问&#xff0c;而且它们涉及到大量且昂贵的服务器端API调用。但如果可以让LLM完全在浏览器中运行——利用底层系统的计算能力呢&#xff1f;这样&#xff0c;LLM的全部功能都将在客户端可用——无需担心服务器的可用性、基…

算法竞赛入门【码蹄集新手村600题】(MT1020-1040)

算法竞赛入门【码蹄集新手村600题】(MT1020-1040&#xff09; 目录MT1021 %f格式符MT1022 小数、指数MT1023 进制乱炖MT1024 进制形式MT1025 八、十六进制MT1026 合并MT1027 整数逆序MT1028 四位数逆序MT1029 位数MT1030 最大公约数MT1031 最简分数MT1032 最小公倍数MT1033 多项…

LeetCode[327]区间和的个数

难度&#xff1a;Hard 题目&#xff1a; 给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中&#xff0c;值位于范围 [lower, upper] &#xff08;包含 lower 和 upper&#xff09;之内的 区间和的个数 。 区间和 S(i, j) 表示在 nums 中&#xff0c;位置从 i 到 …

一文了解UML

目录 1 什么是UML? 2 UML视图&#xff08;UML View&#xff09; 2.1 用户视图&#xff08;Users View&#xff09; 2.2 结构视图&#xff08;Structural Views&#xff09; 2.3 行为视图&#xff08;Behavioral Views&#xff09; 2.4 环境视图&#xff08;Environmenta…

Vc - Qt - 自定义ComboBox

示例代码创建了一个名为ComboBoxWidget的自定义QWidget类&#xff0c;并在initUI方法中创建了一个垂直布局。然后将一个只读的QLineEdit和一个QPushButton添加到布局中。当按钮被点击时&#xff0c;会调用showMenu方法&#xff0c;该方法创建一个QMenu并添加选项。每个选项连接…

vite打包性能优化以及填坑

目录 前言 项目优化前 分析 优化 拆分包 去除debugger CDN 加速 按需导入 文件压缩 图片压缩 viteImagemin报错 填坑 坑1 坑2 总结 配置 前言 最近在使用 Vite4.0 构建一个中型前端项目的过程中&#xff0c;遇到了一些坑&#xff0c;也做了一些项目在构建生产环…

RepViT:从ViT的角度重新审视mobile CNN

文章目录 RepViT: Revisiting Mobile CNN From ViT Perspective摘要本文方法代码实验结果 RepViT: Revisiting Mobile CNN From ViT Perspective 摘要 近年来&#xff0c;与轻量级卷积神经网络(cnn)相比&#xff0c;轻量级视觉变压器(ViTs)在资源受限的移动设备上表现出了更高…

JVM系统优化实践(21):GC生产环境案例(四)

您好&#xff0c;这里是「码农镖局」CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 前面说了一般应用的OOM情况&#xff0c;但是OOM不知发生在应用层&#xff0c;有时候专门负责运行Java的Tomcat也会偶尔罢工一下&#xff0c;抛出OOM异常。因为Tomcat本身也…

git在工作区和本地库的操作命令

本文介绍一些开发时&#xff0c;常用的在工作区和本地库之间的操作命令 一、提交修改内容到 本地库 工作树的修改内容要提交到本地库&#xff0c;首先需要先添加到缓存区stage&#xff0c;在commit到本地库。 # filename就是你修改后需要提交的文件 git add <filename>…