【计算机网络】应用层——HTTP 协议(一)

news2024/11/15 11:20:02

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【网络编程】
本专栏旨在分享学习计算机网络的一点学习心得,欢迎大家在评论区交流讨论💌

目录

  • 一、什么是 HTTP 协议
  • 二、HTTP 协议的工作过程
  • 三、HTTP请求
    • URL
    • Get请求方法和Post请求方法
      • 其它请求方法
    • 请求“报头”(header)
    • 请求“正文”(body)

一、什么是 HTTP 协议

HTTP协议全称超文本传输协议,通过浏览器和服务器进行数据交互,进行超文本数据的传输,所以HTTP协议就是规定了超文本数据传输所要遵守的规则。

比如说我们在电脑浏览器上百度搜索的网址之后,浏览器就会给百度的服务器发送一个请求,而百度服务器接收到这个请求之后就会返回一个响应。这个响应被浏览器解析之后就展现成了我们所看到的内容(而在这一过程中,浏览器可能会向百度服务器发送多个请求,服务器会对应返回多个响应, 这些响应里就包含了页面 HTML, CSS, JavaScript, 图片, 字体等信息)。

二、HTTP 协议的工作过程

在这里插入图片描述

HTTP协议工作过程大体可以分为4个步骤:

  • 客户端发起请求:客户端(比如浏览器)向服务器发送HTTP请求。请求包括请求的方法(GET、POST等),请求的URL,以及其他请求头信息(比如User-Agent、Accept等)。

  • 服务器响应请求:服务器接收到客户端的请求后,会解析请求,并根据请求的内容和要求,生成一个HTTP响应。响应包括响应状态码(比如200表示成功,404表示未找到等),响应头信息(比如Content-Type、Content-Length等),以及响应体(即实际的内容)。

  • 传输数据:服务器将生成的HTTP响应发送回客户端。这个过程中,数据通过网络传输,通常使用TCP/IP协议传输。

  • 客户端处理响应:客户端接收到服务器的响应后,会对响应进行处理。比如,如果是一个网页,浏览器会解析HTML并渲染出页面;如果是一个文件,客户端可能会下载并保存文件。

三、HTTP请求

一个完整的HTTP请求包含请求行请求头请求体、严格来说请求头和请求体之间还有一个空行。
在这里插入图片描述

  • 请求行格式:<请求方法> <URL> <协议版本>
  • 请求头格式:<字段名>: <值>
  • 请求体格式:可选(有的请求有请求体,有的没有)

URL

URL:唯一资源管理器,即用来描述网络上的资源。

下面是完整的URL格式:
在这里插入图片描述
查询字符串:查询字符串以?为开始。另外查询字符串是键值对格式,键值对之间使用&来分割,键和值之间用=分割。键和值的含义都是开发者设定的,所以如果不理解键和值的含义是没有关系的。

URL中的部分的格式内容是可以省略的:

  • 省略服务器地址(即省略ip地址或者域名):此时就相当于当前服务器的地址。我们举个例子,如果我们要访问百度搜索的话,就需要请求中带有baidu的域名,而响应中的内容就是百度搜索的HTML语句。之后,这些HTML中又会触发其它的HTTP请求,那么这些后续触发的HTTP请求就可以省略ip地址,使用省略ip地址而触发的请求就相当于使用和刚才获取baidu的html一样的ip地址。
  • 省略端口号:端口号虽然可以省略,但是使用浏览器时会自动加上端口(端口:即要访问目标服务器的哪个端口)。如果时HTTP协议,自动添加的端口是80;如果是HTTPS协议,自动添加的端口是443。(80、144都是知名端口号)。一般当商业产品部署服务器的时候都会遵守上述规则:即把HTTP服务器绑定80端口,把HTTPS服务器绑定443端口,当然也可以不遵守,使用别的端口号就好了。所以省略端口号之后浏览器访问我们的服务器时就不需要显式指定端口号了。
  • 省略带层次的路径:我们以百度搜索为例,https://www.baidu.com/,如果省略了这里的/,那么这里访问的是百度服务器的主页。我们要知道服务器提供的资源也是分为根节点和子节点的,根节点/一般就对应的是服务器的主页。
  • 查询字符串(query string)也是可以省略的:无论是省略还是不省略都可以让后端根据实际情况来对进行处理。

另外:query string中可能会带有一些特殊的符号,这些特殊的符号有一定的含义。比如说空格(%20)、+(%2B、?(%3F)、#(%23)),当然中文也是需要进行转换的。转换规则就是把要转换内容的二进制的每个字节都用16进制进行表示,然后每个字节前面加上%。C++经过URL编码之后就变成了C%2B%2B。只有经过url编码之后浏览器和服务器才能正确识别。

在这里插入图片描述
这里的方法用来描述请求是干什么的:GET方法可以服务器中获取数据,而Post方法可以向服务器中传输数据。

Get请求方法和Post请求方法

获取百度搜索主页的GET请求:在这里插入图片描述
在这里插入图片描述
GET请求部分一般是没有Body的。
虽然GET和POST方法在传递数据的方式上有所区别,但在实际应用中,并没有严格的规定一定要按照约定来使用。在某些情况下,可以看到开发者使用GET来提交数据或使用POST来获取数据。这样的用法可能违背了原本的设计意图(get和post方法不必一定遵守之前的语义),但仍然可以工作。

现在来看Post请求:
Post请求的场景一般是用于登录和上传。
比如gitee的登录,请看:
在这里插入图片描述
在这里插入图片描述
上图中,中间空出来的是空行,空行下面是就是body。而body内容的格式和query string中的格式是类似的,即也是使用的键值对的格式(是经过了url编码的形式),在这个登录场景中,body内容包含了当前登录的用户名和密码(密码是经过加密的)的认证信息。
下面演示上传图片的场景:
在这里插入图片描述
在这里插入图片描述
上图中的value值就是把上传的整个图片进行转码,转换成字符串。
由此也可以观察到Post请求和Get请求之间的一个区别就是参数传递位置不同:GET方法将参数附加在URL的查询字符串中给服务器,用户可以直接观察到。POST方法将参数放在请求的主体中(body中)进行传递,用户无法直接观察到。但是无论是在哪里进行传递,最终都是要传递给服务器的。
Get请求和Post请求时没有本质区别的:为什么这么说呢?我们只是从习惯上来说Get请求把数据放到query string中,Post请求把数据放到body中,但是数据放到哪里都是可以的,我们既可以选择放到query string中,也可以放到body中,两者通常是可以相互替代的。

在这里插入图片描述

其它请求方法

在这里插入图片描述
上面这些请求比较少见,了解一下即可。

请求“报头”(header)

请求头的格式是键值对这样的结构:<字段名>: <值>(注意键和值之间有个:和空格来进行分割)。注意请求头中的键值对和url中查询字符串、请求体body中的键值对是有区别的:url中查询字符串、请求体body中的键值对是我们开发者自定义的,而请求头header中的键值对是标准规定的(有些是标准规定的也有一些是开发者自定义的键值对)。

在这里插入图片描述

  • Host:请求要访问的目标服务器主机的地址和端口
    我们知道请求行中的url中也可以包含主机的地址和端口,那我们为什么要在Host这里再表示一下呢?一般情况下Host中的内容和url中是一致的,但是也有不一样的情况(比如说使用了代理)。
  • Content-Length:表示body中的数据长度(单位是字节)。如果有的请求中没有body的话,这个字段就可以没有;如果有body的话就必须有这个字段(即Content-Length),否则就是非法请求了。

Content-Length可以解决HTTP数据的粘包问题,比如说:如果是Get请求没有body的话,此时就可以使用可以使用空行来进行分割;如果是Post请求有body的话,就可以使用长度来进行区分。

  • Content-Type:表示请求的body中的数据格式。

常见的Content-Type值包括:text/plain:纯文本类型application/json:JSON数据类型application/x-www-form-urlencoded:HTML表单数据类型multipart/form-data用于上传文件等多媒体类型的表单数据application/xml即XML数据类型image/jpeg、image/png、image/gif等图像类型application/octet-stream二进制流数据类型

  • User-Agent(UA):表示浏览器/操作系统的属性。
  • Referer:表示这个页面是从哪个页面跳转过来的。
  • Cookie:是浏览器本地存储数据的一种机制。

在浏览器访问服务器之前,此时浏览器对服务器是一无所知的(浏览器上没有任何和服务器相关的数据)。

浏览器向服务器发送请求,服务器返回响应(比如html、css、json等)并且浏览器拿到服务器返回的数据后就可以展示网页了。

另外用户拿到网页在操作的过程中也会产生一些临时性的数据(这些临时数据有的可以放到服务器中方便下次直接获取到,即使换了一台电脑依然有效;有的一些不是很重要的临时数据就会放到浏览器中存储,下次再次使用时可以直接用但是换一台电脑之后就没有了)。举个例子:比如我们平时看视频中可以设置循环释放、声音设置、亮度设置等,当下次再次打开这个视频的时候,当前设置和上次设置就是相同的。

更进一步:我们拿循环播放来进行举例,当我们在视频中勾选了循环播放选项后,这个操作相当于在Cookie中写入数据循环播放=true,浏览器就会自动存储这个数据到硬盘中,后续再次观看此视频的时候,浏览器就能自动的把这个数据读出来并写到http请求中。此时该视频网站就知道用户是否开启了循环播放设置了。

为什么浏览器保存数据要放到Cookie中而不是硬盘中(比如写到文件中):因为有的网站是有病毒的,可以入侵我们文件系统,这是非常危险的。为了保证安全,浏览器对网页的功能做出了一些设置,比如禁止直接访问硬盘。而Cookie是浏览器存储数据的一个功能(在存储数据这一方面后来有了其它的一些功能,比如当你在视频中勾选循环播放选项时,浏览器不会将此信息直接存储到Cookie中,而是将该设置保存在浏览器的本地存储中)

Cookie中存储的是什么:按照键值对的方式来存储字符串,这些键值对往往是从服务器返回回来的,浏览器把这些键值对按照域名维度进行分类存储。
这里什么叫按照域名维度:不同的网站的Cookie是不同的,这些Cookie中的内容是开发者自定义的。

Cookie中一个典型的使用场景:在Cookie存储的中众多键值对中有一个重要的键值对就是用来表示用户的身份信息(表示当前请求是来自哪个用户)。举个栗子:登录一个网站之后再次访问该网站的其它页面则不需要重新登录;关闭电脑之后后续再访问该网站仍然不需要重新登录。

总结一下Cookie:Cookie是从服务器返还给客户端(浏览器)的,在客户端(浏览器)进行保存。Cookie中的内容是键值对(开发者自己定义)形式的数据,每个域名都会有自己的一组Cookie。Cookie中的内容用来做什么:后续我们再次访问相同的网站时,就会在请求中带上Cookie(浏览器会自动的把相应的Cookie包包含在请求中),服务器就会使用Cookie来识别客户端并获取客户端的详情信息。

请求“正文”(body)

正文中的内容格式和header中的Content-Type密切相关。通常用于传输一些附加的、非必要的数据,例如表单数据、JSON数据或者上传的文件等。

请求体的常见格式如下:

  • 表单数据:使用"application/x-www-form-urlencoded"或"multipart/form-data"格式。表单数据可以通过键值对的形式包含在请求体中。
  • JSON数据:使用"application/json"格式。请求体中的数据以JSON格式进行编码,用于传输结构化的数据。
  • 文件上传:使用"multipart/form-data"格式。请求体中可以包含文件数据,用于文件上传。
  • 自定义格式:开发人员可以定义自己的格式,例如XML格式等。

在HTTP请求过程中,请求体的使用是完全可选的,并不是所有的请求都需要请求体。具体是否需要请求体以及请求体的内容和格式,取决于服务端的要求和开发人员的需求。

本文到这里就结束了,希望友友们可以支持一下一键三连哈。嗯,就到这里吧,再见啦!!!

在这里插入图片描述

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

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

相关文章

MySQL-查询SQL语句

阅读目录 1.基础查询2.高级多表查询 回到顶部 1.基础查询 范围查询 在范围in select 字段 from 表名 where 字段 in (值,值); select id from stu where id in (2,3); 不在范围not in select 字段 from 表名 where 字段 in (值,值); select id from stu where id not in…

初识人工智能,一文读懂机器学习之逻辑回归知识文集(1)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

LLM:PI - 位置插值

标题:EXTENDING CONTEXT WINDOW OF LARGE LANGUAGE MODELS VIA POSITION INTERPOLATION 论文:https://arxiv.org/pdf/2306.15595.pdf 发表:2023 ​ Transformer的长度外推技术分为两类: 1:修改推理:比如PI、NTK-RoPE、YaRN、ReRoPE等。 优点:可直接修改推理模型,无…

Linux设备树中的 gpio 信息

一. 简介 前面几篇文章讲解了 pinctrl 子系统&#xff0c; pinctrl 子系统重点是设置 PIN( 有的 SOC 叫做 PAD) 的复用 和电气属性。 注意&#xff1a;如果 pinctrl 子系统将一个 PIN 复用为 GPIO 的话&#xff0c;那么接下来就要用到 gpio 子系统了。如果 PIN用作其他…

【Web前端开发基础】CSS的定位和装饰

CSS的定位和装饰 目录 CSS的定位和装饰一、学习目标二、文章内容2.1 定位2.1.1 定位的基本介绍2.1.2 定位的基本使用2.1.3 静态定位2.1.4 相对定位2.1.5 绝对定位2.1.6 子绝父相2.1.7 固定定位2.1.8元素的层级关系 2.2 装饰2.2.1 垂直对齐方式2.2.2 光标类型2.2.3 边框圆角2.2.…

Midjourney在线绘画及提示词精选库

网址:https://chat.xutongbao.top/ 一碗面粉&#xff1a; Self-Rising Flour in a 50s colourful bowl. professional photograph --ar 720:1170 --v 6 烟花古建筑&#xff1a; At night, with the snow-covered scenery of the Beijing Forbidden City as the backdrop, brill…

【Linux C | 进程】进程终止、等待 | exit、_exit、wait、waitpid

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【网站项目】基于SSM的263货物进销管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

超融合基础架构理解

1 超融合基础架构 1.1 定义 超融合基础架构&#xff08;Hyper-converged infrastructure&#xff0c;缩写为HCI&#xff09;&#xff0c;是一种集成了存储设备及虚拟运算的信息基础架构框架。在这样的架构环境中&#xff0c;同一厂商的服务器与存储等硬件单元&#xff0c;搭配…

MySQL数据库查询语句之组函数,子查询语句

组函数 以组为操作单位&#xff0c;一组数据得到一个结果。 在没有手动分组的前提下&#xff0c;整张表默认为一组数据 max(列名)&#xff1a;获取最大值 min(列名)&#xff1a;获取最小值 sum(列名)&#xff1a;获取总和 avg(列名)&#xff1a;获取平均值 count(列名)&a…

R303 指纹识别模块功能实现流程

1 基本通信流程 1.1 UART 命令包的处理过程 1.2 UART 数据包的发送过程 UART 传输数据包前&#xff0c;首先要接收到传输数据包的指令包&#xff0c;做好传输准备后发送成功应答包&#xff0c;最后才开始传输数据包。数据包主要包括&#xff1a;包头、设备地址、包标识、包长…

画眉(京东科技设计稿转代码平台)介绍

前言 随着金融App业务的不断发展&#xff0c;为了满足不同场景下的用户体验及丰富的业务诉求&#xff0c;业务产品层面最直接体现就是大量新功能的上线及老业务的升级&#xff0c;随之也给研发带来了巨大的压力&#xff0c;所以研发效率的提升就是当前亟需解决的问题&#xff…

加速社区数字化转型:物业app开发的最新趋势

在当今数字化时代&#xff0c;社区数字化转型已经成为业界焦点。特别是在物业管理领域&#xff0c;物业app开发正成为加速社区数字化转型的关键趋势。本文将探讨物业app开发的最新趋势&#xff0c;以及如何通过这些趋势推动社区数字化转型。 物业app开发的关键趋势 随着智能手…

分享150套简洁漂亮的html个人简历源码 /个人主页源码 /个人简介网页版(无加密打包)

这里打包分享150套简洁漂亮的html个人简历源码&#xff0c;个人主页源码&#xff0c;作为个人简介网页版&#xff0c;它的风格是简约大气的&#xff0c;扁平化的个人主页网站模板。 如果有用请点赞收藏&#xff0c;无加密源码&#xff0c;直接拿来就可以用的。它是htmlcss网页…

E. Increasing Subsequences

Part1 寒假思维训练之每日一道构造题&#xff08;思维 构造 数学&#xff09;题目链接&#xff1a; Problem - E - Codeforces 题意&#xff1a; 给定一个整数&#xff0c;数字n的范围是&#xff0c;闭区间&#xff0c;要求构造一个递增子序列&#xff08;可以不连续&…

平复一下心情 愉快一下 部署一款在线图书馆

注意:国内不让随便搞线上图书馆 注意:国内不让随便搞线上图书馆 注意:国内不让随便搞线上图书馆 1安装 1.1.拉取镜像 docker pull talebook/talebook 1.2.创建目录 mkdir -p /opt/talebook 1.3.创建并启动容器 docker run -d --name talebook -p 10015:80 -v /opt/taleb…

分布式深度学习中的数据并行和模型并行

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

vue3+Element plus实现登录功能

一、想要实现的效果 二、搭建登录静态 1、实现左边背景和右边登录栏的总体布局布局&#xff1a; <el-row class"content"><!--el-col 列&#xff1a; --><el-col :span"16" :xs"0" class"content-left"></el-c…

“智汇语言·驭领未来”——系列特辑:LLM大模型信息获取与企业应用变革

“智汇语言驭领未来”——系列特辑&#xff1a;LLM大模型信息获取与企业应用变革 原创 认真的飞速小软 飞速创软 2024-01-16 09:30 发表于新加坡 本期引言 LLM&#xff08;Large Language Model&#xff09;大型语言模型以其自然语言理解和生成能力&#xff0c;正以前所未有的…

day01 深度学习介绍

目录 1.1深度学习介绍 1.2神经网络NN 1、概念&#xff1a; 2、神经元 3、&#xff08;单层&#xff09;神经网络 4、感知机&#xff08;两层&#xff09; 5、多层神经网络 6、激活函数 &#xff08;1&#xff09;饱和与非饱和激活函数 &#xff08;2&#xff09;饱和激活…