「计算机网络」初识http协议

news2024/11/30 6:56:42
在这里插入图片描述

前言

HTTP协议——互联网发展的基石,从一个最简单的“helloworld”网页,到现在博客平台、视频网站都离不开HTTP协议的存在。随着互联网的发展,Web网页的设计也越发复杂,前后端开发的分工也越发明确,HTTP作为连接前后端的桥梁,只有掌握它才能更好地实现前后端数据交接。

HTTP协议基础

概念

HTTP(HyperText Transfer Protocol,超文本传输协议),工作于TCP/IP协议族中的应用层,基于TCP协议来提供服务,是互联网发展基石般的存在,用于浏览器与远端服务器的通信,并获取其内部资源,如:网页html、图片等。

HTTP是无状态协议,也就是说服务器不会保存每次请求的信息。对于服务器来讲,每次连接都是独立的,所有连接一视同仁。这样设计简化了服务器的设计与压力,但在需要保存状态的情况(如登录信息、历史记录等),则需要使用cookie、session等手段来实现个性化服务。

image.png

HTTP的工作流程

HTTP是基于CS模型的一种通信协议,通信过程中必定由客户端(浏览器)先发起请求,服务器进行响应(返回网页信息)。

image.png

HTTP协议在通信时的流程

  1. 发起DNS请求:HTTP协议在向远端服务器发起请求前,会先向DNS服务器请求域名所对应的IP地址。

  2. 建立TCP连接:获取到IP地址后,与远端服务器建立连接(三次握手)。

  3. 客户端发送请求:建立好连接后,客户端向服务器发送一个HTTP请求。

  4. 服务器响应请求:服务器收到请求后,根据请求内容发送响应报文

  5. 显示网页:客户端收到响应报文,解析数据,显示到网页当中。

HTTP协议格式

HTTP协议中报文分为两类:请求报文与响应报文,但他们的报文格式都是通用的,即报头首行 + 头部字段 + 空行 + 报文数据(可选)。

image.png

报文格式:

  • 请求报文

    • 请求行:包含请求方法,HTTP版本。

    • 头部字段:包含通用字段 + 请求字段。

    • 空行:固定格式,用于区分报头与报文。

    • 报文数据(可选):请求报文一般没有报文数据。

  • 响应报文

    • 状态行:包含请求的状态码、原因,HTTP版本。

    • 头部字段:包含通用字段 + 响应字段。

    • 空行:固定格式。

    • 报文数据(可选):返回请求的资源,可以是html、图片、js等。

报头首行

请求行

请求行包含请求方法、请求URI与HTTP版本,例如:

GET / HTTP/1.1    # 请求行
User-Agent: PostmanRuntime/7.39.0
Accept: */*
Postman-Token: bf247d0a-a311-41c1-a739-29bdeb43d0fb
Host: localhost:8080
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

常用请求首部方法

请求方法描述
GET请求指定资源的表示形式。GET请求应当只用于获取数据,而不应对服务器产生任何副作用。
POST向指定资源提交数据进行处理。数据包含在请求体中。POST请求可能会导致服务器状态的改变或者副作用。
PUT向指定资源位置上传其最新内容。PUT请求会用请求中的数据替换目标资源的全部内容。
DELETE请求服务器删除请求的指定资源。
HEAD类似于GET请求,但只请求资源的首部信息,不返回具体内容。通常用于检查资源的有效性或获取资源的元数据。
OPTIONS请求指定资源的通信选项和可用方法。可以用于检查服务器支持哪些HTTP方法。
PATCH对资源进行部分修改。PATCH请求包含的实体中,通常只包括修改的部分,而不是资源的全部内容。

状态行

状态行包含HTTP版本、状态码、原因,例如:

HTTP/1.1 200 OK       #状态行
Date: Fri, 14 Jun 2024 13:04:10 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sat, 15 Jun 2024 13:04:10 GMT
Connection: Keep-Alive
Content-Type: text/html

状态码类别

状态码类别含义
1xx 信息性状态码接收的请求正在处理。
2xx 成功状态码请求已被成功接收、理解和处理。
3xx 重定向状态码需要进一步操作以完成请求。
4xx 客户端错误状态码客户端存在问题。
5xx 服务器错误状态码服务器在处理请求时遇到错误。

常见状态码

状态码原因描述
200OK请求被正确处理
201Created请求成功并创建了新的资源
204No Content请求成功但没有内容返回
301Moved Permanently永久重定向,资源已永久移动到新URL
302Found资源暂时位于不同的URL
400Bad Request请求由于语法错误无法被理解
401Unauthorized客户端必须进行身份验证才能获得请求的响应
403Forbidden客户端无权访问内容
404Not Found服务器找不到请求的资源
500Internal Server Error服务器遇到无法处理的情况
502Bad Gateway服务器作为网关时收到无效响应
503Service Unavailable服务器无法处理请求
504Gateway Timeout服务器作为网关时没有及时收到响应

首部字段

首部字段是HTTP协议用于控制HTTP运作方式的要素之一,可以将其当成HTTP的额外选项。

首部字段分为三类

  • 通用首部字段:无论是响应报文还是请求报文都可以使用的选项。

  • 响应/请求首部字段:仅可以在响应/请求报文中使用的字段。

  • 实体首部字段:实体首部字段虽然可以在HTTP请求和响应中使用,但其专注于为报文的消息体提供服务。

通用首部字段

首部字段描述
Cache-Control指示请求或响应的缓存机制,用于控制缓存的存储和检索方式。
Connection控制当前连接的选项。常用值包括 keep-alive(保持连接)和 close(关闭连接)。
Date指示消息发送的日期和时间,格式为RFC 1123日期格式。
Pragma包含实现特定的指令,主要用于向后兼容HTTP/1.0。常见值为 no-cache,用于防止缓存。
Trailer指定在消息末尾可能出现的字段,用于分块传输编码。
Transfer-Encoding指示传输消息体的编码方式,例如 chunked(分块传输编码)。
Upgrade用于向服务器或客户端发出协议升级请求,通常用于HTTPS或HTTP/2升级。
Via显示报文经过的中间节点(代理服务器或网关),用于追踪请求或响应的路径。
Warning传达与缓存相关的警告信息,告知客户端可能存在的缓存问题。

请求/响应首部字段

响应首部字段

首部字段描述
Accept-Ranges指示服务器是否支持字节范围请求(partial requests),如bytes
Age响应在缓存中存储的时间,以秒为单位。
ETag资源的实体标签,服务器用来标识资源的特定版本。
Location指示客户端重定向到的URL,用于3xx状态码的响应。
Proxy-Authenticate指示客户端需要进行代理身份验证的信息。
Retry-After指示客户端应在多长时间后再次尝试请求,用于5xx状态码的响应。
Server包含服务器软件的信息。
Vary指示缓存服务器使用的请求头,以区分不同的响应。
WWW-Authenticate指示客户端如何进行身份验证,以便访问资源。
Set-Cookie发送会话cookie到客户端。
Content-Location给出实际访问的资源的URL。

请求首部字段

首部字段描述
Accept指定客户端能够处理的内容类型。
Accept-Charset指定客户端能够接收的字符集。
Accept-Encoding指定客户端能够处理的内容编码。
Accept-Language指定客户端能够处理的自然语言。
Host指定请求的目标主机名和端口号,必须包含在HTTP/1.1请求中。
User-Agent包含发出请求的用户代理信息(如浏览器类型、版本等)。
Authorization包含客户端为获取资源进行身份验证的信息。
Cache-Control用于指定请求和响应遵循的缓存机制。
Connection控制当前连接的选项,例如 keep-aliveclose
Cookie包含客户端之前收到的并存储在客户端上的Cookie。
Content-Length在POST请求中,表示请求体的长度(以字节为单位)。
Content-Type在POST请求中,表示请求体的媒体类型。
Date发送请求的日期和时间。
Expect指定客户端要求服务器满足的特定行为。
If-Match仅在客户端提供的ETag值与资源的ETag值匹配时才执行请求。
If-Modified-Since仅在请求的资源自指定日期后被修改过时才返回资源。
If-None-Match仅在请求的资源的ETag值与客户端提供的不匹配时才返回资源。
If-Range仅在请求的资源自指定日期后被修改过时才返回部分资源。
If-Unmodified-Since仅在请求的资源自指定日期后未被修改过时才执行请求。
Range请求返回资源的部分内容,指定字节范围。
Referer指定请求资源的来源页面。

实体首部字段

首部字段描述
Allow列出资源支持的HTTP请求方法。
Content-Encoding指示对实体进行的编码类型,用于标识实体数据被压缩的方式。
Content-Language描述资源的自然语言,例如 en 表示英语。
Content-Length指定实体主体的大小,以字节为单位。
Content-Location给出请求资源的替代位置,通常是一个URL。
Content-MD5包含实体主体的MD5校验和,用于检查数据完整性。
Content-Range指示实体主体中部分内容的位置,用于部分请求。
Content-Type指定实体主体的媒体类型,例如 text/html
Expires指定实体主体过期的日期和时间,用于缓存控制。
Last-Modified指示资源最后修改的日期和时间。

HTTP状态管理

HTTP是无状态的协议,这意味这服务器无法区分每个连接之间的区别,但实际上的网页服务上总是能见到用户登录、购物车等需要状态管理的内容。于是HTTP引入cookie、session等功能来实现数据的持久化状态管理。

Cookie与session

Cookie

Cookie 是一种存储在客户端中的小型数据文件,由服务器生成并发送给客户端。客户端每次访问该服务器时,都会自动携带相应的Cookie信息。服务器通过检索Cookie信息,从而给拥有不同Cookie的请求提供不同的服务。

image.png
工作流程

  1. 客户端发送请求(无Cookie)。

  2. 服务器设置Cookie信息。

  3. 客户端接收并存储Cookie信息。

  4. 客户端发送含有Cookie的报文。

cookie的结构

字段名称描述
NameCookie的名称,唯一标识这个Cookie。
ValueCookie的值,与名称一起构成键值对。
Domain指定Cookie适用的域。浏览器将只发送此Cookie到该域名或其子域名。
Path指定Cookie适用的路径。浏览器将只发送此Cookie到该路径及其子路径。
Expires/Max-Age指定Cookie的过期时间。Expires使用具体的日期和时间表示,而Max-Age使用相对时间(以秒为单位)表示。
Secure指定Cookie仅通过HTTPS连接发送,增加了Cookie的安全性。
HttpOnly指定Cookie不能被JavaScript访问,减少XSS攻击的风险。
SameSite控制Cookie在跨站请求时的行为,有三个值:StrictLaxNone,用于防范CSRF攻击。

Session

Session 是存储于服务器中的数据,用于保持用户的会话状态。每个Session都有一个唯一的Session ID,服务器通过这个ID来识别和管理用户的会话信息。

image.png

工作流程

  1. 客户端通过POST方法发送用户信息(username + passwd)给服务器。

  2. 服务器检查信息,创建一个SessionID,并使用Set-Cookie字段发送给客户端

  3. 客户端存储Cookie信息,在之后的请求中,于报头增添Cookie信息。

总结

HTTP是基于CS模型的无状态传输协议,拥有两种报文格式——请求报文/响应报文,其通过报头的首部字段来进行额外配置,能够通过配合Cookie、Session等方式实现持久化状态管理。

📜博客主页:主页
📫我的专栏:C++
📱我的github:github

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

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

相关文章

扣子arixv论文检索工作流开源(Sam老师作品)

因为在扣子上找不到好用的AI论文检索Bot,之前借助工作流和arxiv.org API开发了一个工具,当时写了一篇介绍。 核心流程比较简单,但有很多同学咨询了解,今天抽了点时间把工作流完全开源了。为了方便对比,在公共Team中通过…

pytest + yaml 框架 - 65.Pycharm 设置 yaml 格式用例模板,高效写用例

前言 初学者对yaml 格式不太熟悉,自己写yaml用例的时候,总是格式对不齐,或者有些关键字会忘记。 于是我们可以在pycharm上设置用例模块,通过快捷方式调用出对应的模块,达到高效写用例的目的。 pycharm设置用例模板 File - Settings Live Templates - python 点 + 号…

RabbitMQ实践——交换器(Exchange)绑定交换器

在《RabbitMQ实践——交换器(Exchange)和绑定(Banding)》一文中,我们实验了各种交换器。我们可以把交换器看成消息发布的入口,而消息路由规则则是由“绑定关系”(Banding)来定义&…

中国姓名学十大权威专家颜廷利:全国排名第一的起名大师

颜廷利教授,是济南市历城区唐王镇的名人,位居2023年中国当代十大国学大师排行榜之首。全国排名第一的起名大师颜廷利教授以其深厚的学术造诣和卓越的贡献赢得了名誉和尊重,成为当代国学界的翘楚。他从事国学研究已有数十年,对经史子集的研究融会贯通,展现出了非凡的学术造诣。中…

springboot宠物医院信息管理系统-计算机毕业设计源码04164

摘 要 现如今在中国,随着人民生活质量的逐渐提高,以及人民群众消费能力的日渐增长,各种各样的家养小动物,已经逐渐成为人类越来越亲密的生活伴侣。并且,现如今社会竞争及其激烈,人们的生活节奏越发急促、紧…

FreeRTOS:4.内存管理

FreeRTOS内存管理 目录 FreeRTOS内存管理1. 为什么不直接使用C库函数的malloc和free函数2. FreeRTOS的五种内存管理方式3. heap4源码分析3.1 堆内存池3.2 内存块的链表数据结构3.3 堆的初始化3.4 堆的内存分配3.5 堆的内存释放 4. 总结 1. 为什么不直接使用C库函数的malloc和fr…

【已解决】引用官网的 Element-Message 消息框居然报错为什么呢?

vue 版本 : vue3 编程语言:JavaScript os: macos13 组件 :element-plus 问题组件: Message 信息框 问题:想学习使用 element 官网里的组件,我找到了message 消息提示,然后我就把代码复制下来放到…

日历选择组件(打卡,日期计划,日期选择,特别日期标志)-VUE3

自己封装的目的&#xff1a; 使用场景&#xff1a;打卡&#xff0c;日期计划&#xff0c;日期选择&#xff0c;特别日期标志 根据自己的需求可以定制化何样式 不依赖任何第三方插件或者组件&#xff0c; 效果图&#xff1a; 1、日历组件封装 <template><div clas…

把Vue项目从Window系统迁移到Mac系统的方案

不能启动vue ui 直接运行&#xff0c;会报错如下&#xff1a; failed to load config from /Users/xiaochen/IdeaProjects/ChatViewer-frontend/vite.config.tserror when starting dev server: Error: You installed esbuild for another platform than the one youre curre…

关于LLM:揭秘token与embedding的机制

「GPT4 Turbo 的上下文长度为 128K token」 「Claude 2.1 的上下文长度为 200K token」 听起来像是一些重要的细节&#xff0c;那么token到底是什么&#xff1f; 请看一句话——It’s over 9000&#xff01; 我们可以将其表示为 [“It’s”, “over”, “9000!”] 每个数组…

救命!接手了一个老项目,见到了从业10年以来最烂的代码!

后台回复“书籍”&#xff0c;免费领取《程序员书籍资料一份》 后台回复“5000”&#xff0c;免费领取面试技术学习资料一份 在程序员这个行业从业快10年了&#xff0c;每过几个月回头看看自己写的代码&#xff0c;都会觉得写的也太烂了&#xff0c;不敢想象是自己之前写的。…

CorelDRAW2024破解版看这里!免费分享

亲爱的设计爱好者们&#xff0c;你们好呀&#xff01;今天我要给大家种草一款神奇的软件——CorelDRAW 2024&#xff01;&#x1f929;&#x1f389; 作为一位软件技术爱好者&#xff0c;我一直在寻找那些能让我们事半功倍的工具。最近&#xff0c;我在数字设计领域发现了一个…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 目录管理器(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 目录管理器(200分) 🌍 评测功能需要订阅专栏后私信联系清隆…

QShop商城-短信通知配置

QShop商城-短信通知配置 本系统短信通知配置可选阿里云/腾讯云,二者二选一即可. 阿里云短信 一、登录阿里云短信平台 阿里云短信平台管理地址&#xff1a;https://dysms.console.aliyun.com/dysms.html 二、账户ID和秘钥&#xff08;AccessKeyId 和 AccessKeySecret&#x…

认识一些分布函数-Frechet分布及其应用

1. 何为Frechet分布 Frechet分布也称为极值分布(EVD)类型II,用于对数据集中的最大值进行建模。它是四种常用极值分布之一。另外三种是古贝尔分布、威布尔分布和广义极值分布(Gumbel Distribution, the Weibull Distribution and the Generalized Extreme Value Distributi…

3D 图片悬停效果

3D 图片悬停效果 效果展示 CSS 知识点 background 属性的综合运用transform 属性的综合运用 页面整体布局 <div class"box"><span style"--i: 0"></span><span style"--i: 1"></span><span style"--i…

数据资产管理的未来趋势:洞察技术前沿,探讨数据资产管理在云计算、大数据、区块链等新技术下的发展趋势

一、引言 随着信息技术的飞速发展&#xff0c;数据已成为企业最重要的资产之一。数据资产管理作为企业核心竞争力的关键组成部分&#xff0c;其发展趋势和技术创新受到了广泛关注。特别是在云计算、大数据、区块链等新技术不断涌现的背景下&#xff0c;数据资产管理面临着前所…

常用的JDK调优监控工具整理

JVM 调优首先要做的就是监控 JVM 的运行状态&#xff0c;这就需要用到各种官方和第三方的工具包了 一、 JDK 工具包 JDK 自带的 JVM 工具可以分为命令行工具和可视化工具 命令行工具 jps: JVM Process status tool&#xff1a;JVM进程状态工具&#xff0c;查看进程基本信息j…

阻塞IO、非阻塞IO、IO复用的区别 ?(非常详细)零基础入门到精通,收藏这一篇就够了

前言 在《Unix网络编程》一书中提到了五种IO模型&#xff0c;分别是&#xff1a;阻塞IO、非阻塞IO、IO复用、信号驱动IO以及异步IO。本篇文章主要介绍IO的基本概念以及阻塞IO、非阻塞IO、IO复用三种模型&#xff0c;供大家参考学习。 一、什么是IO 计算机视角理解IO: 对于计…

关闭kylin(麒麟)系统的安全认证(烦人的安全认证)

打开grub sudo vim /etc/default/grup修改安全认证选项 增加12行&#xff0c;把13行注释掉 保存更改, 然后执行下面的命令&#xff1a; sudo sync sudo reboot重启成功后&#xff0c;就关闭了安全认证了~~~~~。 总体来讲&#xff0c;kylin还是基于ubuntu的内核的&#xff0c;…