HTTP 基本概念

1. HTTP

(Hypertext Transfer Protocol)超文本传输协议,是互联网上应用最为广泛的协议之一。

小林coding的解析特别通俗易懂
https://xiaolincoding.com/network/2_http/http_interview.html#http-%E6%98%AF%E4%BB%80%E4%B9%88

  • 协议:HTTP 是一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范(两个以上的参与者),以及相关的各种控制和错误处理方式(行为约定和规范)。
  • 传输:把一堆东西从 A 点搬到 B 点,或者从 B 点 搬到 A 点

HTTP 协议是一个双向协议。 在上网冲浪时,浏览器是请求方 A,百度网站就是应答方 B。双方约定用 HTTP 协议来通信,于是浏览器把请求数据发送给百度服务器,服务器再把一些数据返回给浏览器,最后由浏览器渲染在屏幕,就可以看到图片、视频了。
HTTP 是一个在计算机世界里专门用来在两点之间传输数据的约定和规范。

  • 超文本:「文本」在互联网早期的时候只是简单的字符文字,但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等,在 HTTP 眼里这些都算作「文本」。「超文本」它就是超越了普通文本的文本,它是文字、图片、视频等的混合体,最关键有超链接,能从一个超文本跳转到另外一个超文本。

HTML就是最常见的超文本了,它本身只是纯文字文件,但内部用很多标签定义了图片、视频等的链接,再经过浏览器的解释,呈现给我们的就是一个文字、有画面的网页了。

HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。
注:两点之间不一定是客户端和服务器,也可以是服务器和服务器

2. HTTP的基本概念:

  1. 报文(Message): HTTP通信的基本单位,分为请求报文和响应报文。报文包括报文首部和报文主体。
  2. 报文首部: 包含了请求或响应的元信息,如Host、User-Agent、Content-Type等。首部可以分为通用首部、请求首部、响应首部和实体首部。

常见字段:

  • Host :客户端发送请求时,用来指定服务器的域名。
  • Content-Length:服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据长度。(“粘包”)
  • Connection:字段最常用于客户端要求服务器使用「HTTP 长连接」机制,以便其他请求复用(HTTP 长连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。)
    (不要把 HTTP Keep-Alive 和 TCP Keepalive 搞混)
  • Content-Type:用于服务器回应时,告诉客户端,本次数据是什么格式。
  • Cookie: 由服务器发送给客户端,存储在客户端本地的一小段文本信息。用于跟踪用户的状态,常用于实现用户登录状态的保持。
  1. 请求报文(Request): 客户端向服务器发送的消息,用于请求某种操作。请求由请求行、请求头和请求体组成。请求行包括请求方法、请求的URL和HTTP协议版本。
    在这里插入图片描述
  2. 请求方法: 定义了对资源执行的操作,常见的有GET、POST、PUT、DELETE等。每个方法对应一种特定的操作。
  • GET 的语义是从服务器获取指定的资源,这个资源可以是静态的文本、页面、图片视频等。
  • POST 的语义是根据请求负荷(报文body)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST 请求携带数据的位置一般是写在报文 body 中,body 中的数据可以是任意格式的数据,只要客户端与服务端协商好即可,而且浏览器不会对 body 大小做限制。

GET 和 POST 方法都是安全和幂等的吗?
安全:指请求方法不会「破坏」服务器上的资源。
幂等:多次执行相同的操作,结果都是「相同」的。

  • *GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。*所以,可以对 GET 请求的数据做缓存,这个缓存可以做到浏览器本身上(彻底避免浏览器发请求),也可以做到代理上(如nginx),而且在浏览器中 GET 请求可以保存为书签。
  • *POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。*所以,浏览器一般不会缓存 POST 请求,也不能把 POST 请求保存为书签。

5. 响应报文(Response): 服务器向客户端返回的消息,用于响应客户端的请求。响应由状态行、响应头和响应体组成。状态行包括响应的状态码和对应的状态消息
在这里插入图片描述

  1. 状态码: 用于表示服务器对请求的处理结果。常见的状态码包括200(OK,请求成功)、404(Not Found,资源未找到)、500(Internal Server Error,服务器内部错误)等。
    在这里插入图片描述
  2. HTTP 缓存有两种实现方式,分别是强制缓存和协商缓存。

3. HTTP 特性

HTTP/1.1 的优点有:「简单、灵活和易于扩展、应用广泛和跨平台」

  1. 简单
    HTTP 基本的报文格式就是 header + body,头部信息也是 key-value 简单文本的形式,易于理解,降低了学习和使用的门槛。
  2. 灵活和易于扩展
    HTTP 协议里的各类请求方法、URI/URL、状态码、头字段等每个组成要求都没有被固定死,都允许开发人员自定义和扩充。
    同时 HTTP 由于是工作在应用层( OSI 第七层),则它下层可以随意变化,比如:
    HTTPS 就是在 HTTP 与 TCP 层之间增加了 SSL/TLS 安全传输层;
    HTTP/1.1 和 HTTP/2.0 传输协议使用的是 TCP 协议,而到了 HTTP/3.0 传输协议改用了 UDP 协议。
  3. 应用广泛和跨平台
    互联网发展至今,HTTP 的应用范围非常的广泛,从台式机的浏览器到手机上的各种 APP,从看新闻、刷贴吧到购物、理财、吃鸡,HTTP 的应用遍地开花,同时天然具有跨平台的优越性。

HTTP 协议 缺点:是 「无状态、明文传输、不安全」

  1. 无状态:无状态的好处,因为服务器不会去记忆 HTTP 的状态,所以不需要额外的资源来记录状态信息,这能减轻服务器的负担,能够把更多的 CPU 和内存用来对外提供服务。
    无状态的坏处,既然服务器没有记忆能力,它在完成有关联性的操作时会非常麻烦。
    例如登录->添加购物车->下单->结算->支付,这系列操作都要知道用户的身份才行。但服务器不知道这些请求是有关联的,每次都要问一遍身份信息。

对于无状态的问题,解法方案有很多种,其中比较简单的方式用 Cookie 技术。
Cookie 通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。
相当于,在客户端第一次请求后,服务器会下发一个装有客户信息的「小贴纸」,后续客户端请求服务器的时候,带上「小贴纸」,服务器就能认得了请添加图片描述

总之 HTTP/1.1 的性能一般般,后续的 HTTP/2 和 HTTP/3 就是在优化 HTTP 的性能。

参考链接
https://blog.csdn.net/Hardworking666/article/details/123833192
https://xiaolincoding.com/network/2_http/http_interview.html#http-1-1-%E7%9A%84%E6%80%A7%E8%83%BD%E5%A6%82%E4%BD%95

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

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

相关文章

橘子学Mybatis09之Mybatis关于二级缓存的使用

前面我们说了一级缓存,但是实际上我们说那玩意其实不咋实用。于是既然设计了缓存体系,就不可能弄个不实用的给人们。所以这里就引出二级全局缓存。 全局缓存就是无视sqlSession,你可以理解为一个分布式的缓存。作为全局的访问。 一、二级缓存…

爬虫工作量由小到大的思维转变---<第三十九章 Scrapy-redis 常用的那个RetryMiddleware>

前言: 为什么要讲这个RetryMiddleware呢?因为他很重要~ 至少在你装配代理ip或者一切关于重试的时候需要用到!----最关键的是:大部分的教学视频里面,没有提及这个!!!! 正文: 源代码分析 这个RetryMiddleware是来自: from scrapy.downloadermiddlewares.retry import Retry…

Transfomer相关最新研究

文章目录 LogTrans * (有代码)TFT (有代码)InfluTran (有代码)Informer *(有代码)(长时间)ProTranAutoformer ***(有代码)AliformerPyraformer &a…

JRT的无源码发布

之前介绍过JRT最大的特点就是业务脚本化。老javaer就会说你业务代码都在发布环境放着,那怎么代码保密,在发布环境别人随便改了启不是不安全,或者一些代码我就是不想让人看源码呢。 其实JRT的业务脚本化只是特性,不是代表就必须要…

选择排序(堆排序和topK问题)

选择排序 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。 如果我们用扑克牌来举例,那么选择排序就像是提前已经把所有牌都摸完了,而再进行牌…

git commit 描述如何修改

git Commit 描述写错了,如何修改_git提交描述错误怎么修改-CSDN博客 1.git commit --amend 2.按一下 i 键,进入插入模式 3.修改成描述 4.按 esc 键退出,然后按shift:,然后输入 wq 就完成修改了

ROS1工作空间内多个包先后编译顺序、包内编译顺序

在ros工作空间里有packageA和packageB两个包,其中第二个包依赖第一个包。除了packageB的CMakeLists.txt中的find_package要加入第一个包外,还需要修改package.xml,保证catkin_make的编译顺序: packageB的package.xml:…

Java中文乱码浅析及解决方案

Java中文乱码浅析及解决方案 一、GBK和UTF-8编码方式二、idea和eclipse的默认编码方式三、解码和编码方法四、代码实现编码解码 五、额外知识扩展 一、GBK和UTF-8编码方式 如果采用的是UTF-8的编码方式,那么1个英文字母 占 1个字节,1个中文占3个字节如果…

list的介绍及其模拟实现

今天我们了解list,list在python中是列表的意思 ,但是在C中它是一个带头双向循环链表: list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构&#xf…

springboot项目快速引入knife4j

引入依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version> </dependency>knife4j配置文件 basePackage改为自己存放接口的包名 /*** Kn…

【网络安全 | 漏洞挖掘 】Firefox长达21年的 “陈年老bug”,终于被修复了!

Firefox 的工单记录页面显示&#xff0c;一个在 21 年前发现的 bug 终于被修复了。 根据描述&#xff0c;具体错误是表格单元格无法正确处理内容 “溢出” 的情况&#xff0c;不支持 ‘hidden’、‘auto’ 和’scroll’ 属性。 如下图所示&#xff1a; 开发者在评论中指出&a…

如何使用Stable Diffusion的ReActor换脸插件

ReActor插件是从roop插件分叉而来的一个更轻便、安装更简单的换脸插件。操作简单&#xff0c;非常容易上手&#xff0c;下面我们就介绍一下&#xff0c;如何将ReActor作为stable diffusion的插件进行安装和使用。 一&#xff1a;安装ReActor插件 项目地址&#xff1a;https:/…

计算机网络——网络层(1)

计算机网络——网络层(1&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 网络层&#xff1a;数据平面网络层概述核心功能协议总结 路由器工作原理路由器的工作步骤总结 网际协议IPv4主要特点不足IPv6主要特点现状 通用转发和SDN通用转发SDN&#xff08;软件…

C++从零开始的打怪升级之路(day21)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的是关于vector的题目 1.删除有序数组中的重复项 26. …

前端[新手引导动画]效果:intro.js

目录 一、安装 二、配置 三、编写需要引导动画的页面 四、添加引导效果 一、安装 npm i intro.js 二、配置 详细配置可以参考&#xff0c;官网&#xff1a; Intro.js Documentation | Intro.js Docs https://introjs.com/docs 新建一个intro.js的文件&#xff1a; 三、…

扎哇面试准备

1.你是谁&#xff1f; 我是李四&#xff0c;24 届学生&#xff0c;目前就读于西安电子科技大学&#xff0c;硕士学历&#xff0c;就读的专业是软件工程&#xff08;非软件相关专业就不要介绍你的专业了&#xff09;&#xff0c;很荣幸参加贵公司的面试 2.你会啥&#xff1f; …

06.Elasticsearch应用(六)

Elasticsearch应用&#xff08;六&#xff09; 1.什么是分词器 ES文档的数据拆分成一个个有完整含义的关键词&#xff0c;并将关键词与文档对应&#xff0c;这样就可以通过关键词查询文档。要想正确的分词&#xff0c;需要选择合适的分词器 2.ES中的默认分词器 fingerprint…

MySQL的`FOR UPDATE`详解

MySQL的FOR UPDATE详解 欢迎阅读本博客&#xff0c;今天我们将深入探讨MySQL中的FOR UPDATE语句&#xff0c;它用于在事务中锁定选择的数据行&#xff0c;确保在事务结束前其他事务无法修改这些数据。 1. FOR UPDATE基础 FOR UPDATE是用于SELECT语句的一种选项&#xff0c;它…

15- OpenCV:模板匹配(cv::matchTemplate)

目录 1、模板匹配介绍 2、cv::matchTemplate 3、模板匹配的方法&#xff08;算法&#xff09; 4、代码演示 1、模板匹配介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。 它可以在一幅图像中寻找与给定模板最相似的部分。 模板匹配的步骤&#xff1a; &a…

C++提高编程——STL:常用算法

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…