当前位置: 首页 > news >正文

【Linux】HTTP协议

之前,我们已经做过了自定义协议,事实上,已经有很多现成已经做好又非常好用的协议,它们都是相同的,比如HTTP协议。所谓HTTP协议,就是超文本传输协议,定义了客户端和服务器之间是如何通信的,以及交换和传输超文本(超文本,就是超过文本,视频、音频、图片等)。HTTP协议是一个无连接、无状态的协议,每次请求都要建立新的链接,且服务器不会保存客户端的状态信息。

URL

URL,俗称网址,我们找一个URL看看,

https://blog.csdn.net/qq_48460693?type=blog

https表示协议(先认为https和http差不多),://是要求的字符,blog.csdn.net是域名,会被客户端自动转换为IP地址,也就是地址转换(DNS)。我们知道,在进行通信时,必须知道对方的IP和端口号,也要把自己的IP和端口号给对方,那端口号在哪里呢?因为协议名称和端口号是强关联的,HTTP的server绑定的必须是80号端口(知名端口号,再比如ssh绑定22号端口,fdp绑定23号端口),不能改变。所以,URL没有给出端口号是因为默认被忽略了。在浏览器真正发起请求时,会自动拼接端口号80,后面的一串表示路径,表示特定的资源在主机上的哪里。

在进行网络通信时,客户端要么是获取信息,要么是推送信息。在客户端没有获取资源之前,所有的资源都在服务器端。客户端通过URL标识出来想要的资源,使用HTTP协议把对应的资源找到,把资源打开,通过HTTP网络推送给客户端。这些资源一般都在Linux服务器上,所以在OS看来,这些资源都是文件。所以未来要求服务器把OS上的一个文件打开然后发送到客户端。发送的前提是在本主机内找到对应的资源,这就转换成怎么在Linux中标识特定的文件,即使用路径标识!而URL后半部分就是对应的路径!路径中的第一个"/"不一定是根目录,而是web根目录(服务端上任何一个目录都可以是)。这个路径在当前机器上,可以表示文件的唯一性!

到现在,我们就可以认识到,URL前一部分IP地址可以表示唯一一台主机,省略了端口号,端口号表明该主机上唯一的一个服务进程,后半部分表明该主机上唯一的文件资源。把域名和路径结合在一起,就表示互联网中唯一的一个文件资源。所以,URL叫“统一资源定位符”

再比如我们在有这样的URL:

https://www.baidu.com/s?wd=hello&rsv_spt=1&rsv_iqid=0xa90544ec02adcea9&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=62095104_29_oem_dg&rsv_dl=tb&rsv_enter=1&rsv_sug3=6&rsv_sug1=3&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=1619&rsv_sug4=2351

/s表示要访问的资源,?是要提交的参数,?后面的所有内容都是要提交的参数。wd是变量名,=后面的是变量内容,后面是要求提交的一系列参数,参数与参数之间使用&关联起来。

我们发现,URL之间是用一些特殊符号隔开,那如果搜索内容本身就是包含特殊符号呢?

我们发现,这些被搜索的特殊符号被进行了编码,然后拼接到了URL中。编码也有规则,每一个特殊字符都有自己的ASCII码,只需要把ASCII码转化成16进制,前面加%。这个工作叫做urlencode。从这些16进制转化为ASCII码,这个工作叫做urldecode

HTTP协议请求与响应格式

HTTP请求

上面是一个HTTP请求,我们先来从宏观上认识一下,一个完整的HTTP请求的格式如下:

除了正文外,HTTP请求按行为单位陈列,所以在每行后面加上了换行符。把第一行成为HTTP的请求行。下面的第二大区域一共n行请求报头,全部是Key:[空格]Value格式,表明发起请求方本次请求的一些属性。下面的空行是为了把上下两部分隔开,空行以前叫报头,空行以后叫正文。


对于请求行,请求方法主要有GET、POST、HEAD、DELETE等,但是最重要的是GET和POST方法。URI是我们要访问资源的路径,即URL的后半部分。HTTP版本主要有http/1.0、http/1.1、http/2.0等,目前主流的是http/1.1。

HTTP应答

HTTP应答的格式和HTTP请求的格式很像,都是按行为单位,第一行是状态行,下面是响应报头(和请求报头很多是重叠的)。响应正文就是我们要的资源内容(html、图片)。

我们知道,必须将报头和有效载荷进行分离,区分报头和有效载荷的方法就是通过换行符,通过判断有没有一个空的换行符来判断请求报头部分是否完整。那如何确定正文部分有多长呢?实际上,在请求和应答报头中,有一个公共属性Content-Length:xxxx,进而就知道了正文有多长,就能读到一个完整的报文了,应答同样如此。


实际上,HTTP请求就是一个长长的字符串,

之所以看起来有很多行,是因为中间被\r\n分隔开了。我们得到一个长长的字符串,注定要把它转化为结构化字段才能被我们使用。

获得一个完整的网页,浏览器先要得到html,根据html的标签,检测出我们还要获取其他资源,浏览器会继续发起http请求!

HTTP常见Header

Content-Type:数据类型(text/html等)

Content-Length: Body的长度

Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口上

User-Agent:声明用户的操作系统和浏览器版本信息

referer:当前页面是从哪个页面跳转过来的

Location:搭配3xx状态码使用,告诉客户端接下来要去哪里访问

Cookie:用于在客户端存储少量信息,通常用于实现会话功能 

关于connection报头

HTTP中的connection字段是HTTP报头的一部分,它主要用于控制和管理客户端和服务器之间的连接状态。

核心作用

  • 管理持久连接:也叫长连接,持久连接支持客户端和服务器在请求/响应完成后不立即关闭TCP连接,以便在同一个连接上发送多个请求和接受多个响应。

持久连接(长连接)

  • HTTP/1.1:默认使用持久连接,当客户端和服务器都不明确指定关闭连接时,连接保持打开状态,以便后续的请求和响应可以复用同一个连接。
  • HTTP/1.0:默认连接是非持久的。

语法格式:

  • Connection:keep-alive,表示希望保持连接以复用TCP连接。
  • Connection:close,表示请求/响应完成后,应该关闭TCP连接。

关于Cookie

 我们在登录某些网站时,可能遇到如下情况:

  1. 必须登录,不登录只能试看5min。
  2. 必须是会员,否则只能看vip视频5分钟。

问题是,服务器端怎么知道我是不是会员?服务器怎么知道我有没有登录?所以,我们需要有一种策略,用来标识用户身份以及对用户的登录状态进行保持,方便随时验证用户身份。我们把这种称为网站的会话管理。说一个例子,现在想访问爱奇艺上一个VIP电影,已经办了VIP,看到了第6集突然不想看了,向挑另一个VIP去看,http无状态就决定了我在看另一份资源时,http就不应该认识我了,就应该要求我再登录验证是不是VIP。可事实上并不是这样子,事实上我想看哪一个就看哪一个,只有第一次登录不认识后面都认识我了,为什么呢?为了支持让http状态保持,于是http就提供了cookie的功能,cookie是http的一个报头属性,通常在响应报头中添加,cookie可以向客户端浏览器写入一部分信息,只要写入成功,往后的客户端发起任何请求,都会自动把曾经写入的cookie信息全都携带上,方便服务器端随时验证。

下面举一个例子说明:比如你去上班了,第一天去上班的时候,门口的保安当然不认识你,这时候就把你拦住了,问你哪个部门叫什么名字,并且拿报到证给保安看,保安一看就让你进去了,那明天后天再来的时候,保安仍然会拦你(默认保安脸盲)。所以你第一天入职见到了hr,给了你一个工牌,让你把工牌挂在脖子上以方便出入园区。第二天你把工牌挂在脖子上来上班了,保安一看脖子上有工牌,就不拦你了,这就叫你进行了会话保持。在保安的眼里这个人是合法用户(登录状态),cookie就是工牌,浏览器就是打工人,cookie向浏览器写入的值就是把工牌交给浏览器,浏览器每次请求时都要把工牌(cookie)带上

HTTP状态码

状态码含义
200OK
404Not Found

我们看一下3开头(重定向相关,以301、302为例)的状态码:

我们先来看一下永久重定向临时重定向的区别,它们都是重定向,重定向什么意思呢?我们在用客户端在访问服务器时,服务器出于一些原因给客户端返回应答,在应答里包含了Location:www.qq.com,客户端识别到响应回来的状态码可能是301/302,并且Location字段被设置了,此时客户端转而向目标服务器www.qq.com发起请求,由目标服务器来给我们提供应答,这个工作就称之为重定向,要重定向的地址就在Location中。

我们再通过一个例子来理解,在学校的北门有一家餐厅,由于修路搬到了南门,一些老顾客并不知道已经搬到南门了,他们去的时候依旧去北门那里,于是老板在上面贴了张告示,本店临时搬到南门。下次你和你的朋友先跑到北门看见了告示,所以跑到了南门去这家餐馆吃饭,这叫做重定向。过了俩月,你和你的朋友又要去吃饺子,你去老的这家店还是新的这家店呢?由于是临时搬到南门,所以依旧去老的店,这就是临时重定向。同样的故事,老板考虑到这条路一时半会修不好,就决定永久搬到南门,告示上写上永久搬到南门,你和你的朋友去北门,发现告示写着永久搬到南门,就跑到南门去了。再过两个月,你和你的朋友又想去吃,就直接去南门,不用去北门了。

以上是一个通俗的例子,我们再通过一个技术的例子来理解,我们有一个域名www.hello.com,由于公司认为这个域名不能体现出公司的特点,于是把公司域名更改为www.world.com,公司更改域名是一个比较大的事情。但是老客户只认识www.hello.com,此时可以当老客户访问时做一个重定向,即老客户先去请求www.hello.com,转而去请求www.world.com,然后老用户在书签内把旧网站改了,这就是永久重定向。临时重定向是干什么的呢?进行站内跳转,比如登录成功了就跳转到网站首页,注册完成就跳转到登录,就可以采用临时重定向。

实际上,永久重定向是给搜索引擎去看的!假设国内有1E个网站,百度搜索引擎公司会有一些爬虫信息不断把全国的网站把信息抓取下来,并获取链接,并在后端建立查找的索引。某一天域名www.abc.com更改为www.xyz.com,而百度搜索引擎公司里存的是旧的域名www.abc.com,如果做一个永久重定向,就可以让用户通过www.abc.com转而访问www.xyz.com,但是不想一直这样,而是想让用户直接到www.xyz.com。某一天百度这家搜索引擎公司又去爬网站信息了,告诉这家要做重定向了,百度就发觉你要变域名了,就把自己后端的索引改为了www.xyz.com,把老的域名替换了来做书签更新,把和这个域名相关的都更换成新的域名了,从此往后别人在搜的时候就看到了新域名。所以,永久重定向的意义是给搜索引擎去看,让搜索引擎及时更新自己链接的

HTTP方法

其中,最常用的是GET和POST方法。从网上获取资源用到的是GET方法。可以使用POST方法让浏览器向服务器发起POST请求,向服务器上传数据。GET一般用来获取静态资源,也可以通过url向服务器传递参数,POST可以通过http request正文来进行参数传递。实际上,我们需要结合form表单完成get or post请求。我们通过下图来看一下请求、表单、浏览器渲染之后的结果之间的关系:

此时我们可以明显看到,POST方法可以通过http request正文来向服务器进行传参。同样,如果把表单里的method改为GET,发现GET方法可以通过url来传参。

我们再来总结一下这两种方法的区别,一、如果想获取静态资源,就使用GET方法;二、GET通过url向服务器传递参数,POST通过http request的正文来进行参数传递;三、url传递参数,参数的体量不一定大,正文可以很大。POST方法比GET方法(会回显到url)传参更私密,但是都不安全。因此,需要对http的参数部分进行加密(https)!

相关文章:

【Linux】HTTP协议

之前,我们已经做过了自定义协议,事实上,已经有很多现成已经做好又非常好用的协议,它们都是相同的,比如HTTP协议。所谓HTTP协议,就是超文本传输协议,定义了客户端和服务器之间是如何通信的&#…...

计算机网络 (14)数字传输系统

一、定义与原理 数字传输系统,顾名思义,是一种将连续变化的模拟信号转换为离散的数字信号,并通过适当的传输媒介进行传递的系统。在数字传输系统中,信息被编码成一系列的二进制数字,即0和1,这些数字序列能够…...

《向量数据库指南》——Milvus Cloud 2.5:Sparse-BM25引领全文检索新时代

Milvus Cloud BM25:重塑全文检索的未来 在最新的Milvus Cloud 2.5版本中,我们自豪地引入了“全新”的全文检索能力,这一创新不仅巩固了Milvus Cloud在向量数据库领域的领先地位,更为用户提供了前所未有的灵活性和效率。作为大禹智库的向量数据库高级研究员,以及《向量数据…...

Unity3D 网络框架设计详解

前言 Unity3D是一款强大的跨平台游戏开发引擎,网络框架的设计对于实现客户端与服务器之间的稳定通信至关重要。本文将详细介绍Unity3D网络框架的设计原理、技术要点以及代码实现。 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一…...

网络渗透测试实验四:CTF实践

1.实验目的和要求 实验目的:通过对目标靶机的渗透过程,了解CTF竞赛模式,理解CTF涵盖的知识范围,如MISC、PPC、WEB等,通过实践,加强团队协作能力,掌握初步CTF实战能力及信息收集能力。熟悉网络扫描、探测HTTP web服务、目录枚举、提权、图像信息提取、密码破解等相关工具…...

Wend看源码-Java-Collections 工具集学习

摘要 java.util.Collections它提供了一系列静态方法,用于对集合(如List、Set、Map等)进行操作。这些操作包括排序、查找、替换、同步等多种功能,帮助开发者更方便地处理集合数据。以下是Collections 提供的一些主要方法的总结。…...

[JAVA]MyLogger

import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.logging.*;/*** 可以自已定义日志打印格式,这样看起来比较方便些**/ class MyFormatter extends Formatter {Overridepublic String format(LogRecord ar…...

玩转OCR | 腾讯云智能结构化OCR初次体验

目录 一、什么是OCR(需要了解) 二、产品概述与核心优势 产品概述 智能结构化能做什么 举例说明(选看) 1、物流单据识别 2、常见证件识别 3、票据单据识别 4、行业材料识别 三、产品特性 高精度 泛化性 易用性 四、…...

记一次 dockerfile 的循环依赖错误

文章目录 1. 写在最前面1.1 具体循环依赖的例子 2. 报错的位置2.1 代码快速分析2.2 代码总结2.3 关于 parser 的记录 3. 碎碎念 1. 写在最前面 笔者在使用 dockerfile 多阶段构建的功能时,写出了一个「circular dependency detected on stage: xx」的错误。 解决方…...

Trimble天宝X9三维扫描仪为建筑外墙检测提供了全新的解决方案【沪敖3D】

随着城市化进程的快速推进,城市高层建筑不断增多,对建筑质量的要求也在不断提高。建筑外墙检测,如平整度和垂直度检测,是衡量建筑质量的重要指标之一。传统人工检测方法不仅操作繁琐、效率低下,还难以全面反映墙体的真…...

【MySQL】深度学习数据库开发技术:使用CC++语言访问数据库

**前言:**本节内容介绍使用C/C访问数据库, 包括对数据库的增删查改操作。 主要是学习一些接口的调用, 废话不多说, 开始我们的学习吧! ps:本节内容比较容易, 友友们放心观看哦! 目录 准备mysql…...

LabVIEW化工实验室设备故障实时监测

化工实验室中,各类设备的运行状态直接影响实验的精度与安全性。特别是重要分析仪器的突发故障,可能导致实验中断或数据失效。为了实现设备运行状态的实时监控与故障快速响应,本文提出了一套基于LabVIEW的解决方案,通过多参数采集、…...

单例模式懒汉式、饿汉式(线程安全)

饿汉式单线程安全吗 饿汉式单例(Eager Singleton)是线程安全的。这种实现方式在类加载时就创建了单例实例,因此在多线程环境中,不存在多个线程同时创建实例的问题。 饿汉式单例的实现 以下是一个饿汉式单例的示例: …...

Cursor登录按钮点击没反应

问题 系统:Windows11 Cursor:Cursor 0.44.9 当安装Cursor打开进行登录时,点击Sign in没反应 解决方案 1.打开window11的设置 2.点击应用中的默认应用 3.在设置应用程序的默认值中搜索Google(没有Google浏览器的尝试下载一个&a…...

论文实现:Reactive Nonholonomic Trajectory Generation via Parametric Optimal Control

1. 多项式螺旋 曲率: κ ( s ) a 0 a 1 s a 2 s 2 a 3 s 3 a 4 s 4 a 5 s 5 \begin{align} \kappa(s) a_0 a_1s a_2s^2 a_3s^3 a_4s^4 a_5s^5 \end{align} κ(s)a0​a1​sa2​s2a3​s3a4​s4a5​s5​​ 机器人朝向: θ ( s ) a 0 s a 1 …...

基于单片机中药存放环境监测系统的实现

基于单片机中药存放环境监测系统的实现 项目开发背景 随着现代中药的广泛应用,中药材的存储环境对其质量有着至关重要的影响。温湿度、烟雾、火灾等环境因素,若不加以控制,将会导致中药材失效或变质。因此,设计一个基于单片机的…...

九垠赢+商业管理系统 Common.ashx 文件上传致RCE漏洞复现

0x01 产品简介 九垠赢+商业管理系统是基于互联网技术的进销存管理软件,适用于新零售背景下各种业态的线上线下一体化的商超经营管理。赢+ERP以商业管理系统为底座,融合了多种软、硬件解决方案,实现了从企业、供应商、三方平台到顾客等日常管理的全线数字化、智能化和移动化…...

速盾:服务器CDN加速解析的好处有哪些呢?

随着互联网应用的普及,越来越多的企业开始关注如何提升网站的访问速度和用户体验。为了实现这一目标,许多企业选择使用CDN(内容分发网络)来加速网站的内容分发。CDN通过在全球范围内分布多个节点,将内容缓存到离用户最…...

C++ 设计模式:备忘录模式(Memento Pattern)

链接:C 设计模式 链接:C 设计模式 - 状态模式 备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下捕获和恢复对象的内部状态。这个模式在需要保存和恢复对象状态的场景中非常有用&#xff…...

Android 系统 Activity 系统层深度定制的方法、常见问题以及解决办法

Android 系统 Activity 系统层深度定制的方法、常见问题以及解决办法 目录 引言Activity 系统层概述Activity 系统架构图Activity 系统层深度定制的方法 4.1 自定义 Activity 生命周期4.2 自定义 Activity 启动流程4.3 自定义 Activity 转场动画4.4 自定义 Activity 窗口管理4…...

PDF怎么压缩得又小又清晰?5种PDF压缩方法

PDF 文件在日常办公与学习中使用极为频繁,可想要把它压缩得又小又清晰却困难重重。一方面,PDF 格式本身具有高度兼容性,集成了文字、图像、矢量图等多样元素,压缩时难以兼顾不同元素特性,稍不注意,文字就会…...

YK人工智能(三)——万字长文学会torch深度学习

2.1 张量 本节主要内容: 张量的简介PyTorch如何创建张量PyTorch中张量的操作PyTorch中张量的广播机制 2.1.1 简介 几何代数中定义的张量是基于向量和矩阵的推广,比如我们可以将标量视为零阶张量,矢量可以视为一阶张量,矩阵就是…...

关于CISP报名费用详情

CISP即“注册信息安全专业人员”,是中国信息安全测评中心实施的国家认证项目,旨在培养信息安全领域的专业人才。对于有意报考CISP的考生而言,了解报名考试费用是备考过程中不可或缺的一环。 CISP的报名考试费用主要包括培训费用、考试费用、…...

vim 按下esc后取消高亮

配置 ideavimrc文件 " 按下 Esc 键时自动取消高亮 " 在普通模式下按下 Esc 键取消高亮 nnoremap <Esc> :nohlsearch<CR> " 在插入模式下按下 Esc 键取消高亮 inoremap <Esc> <Esc>:nohlsearch<CR>" 额外&#xff1a;当退出…...

SwiftUI:多语言实现富文本插值

实现的UI需求&#xff1a; 要求&#xff1a; 英文显示&#xff1a;3068 people have joined this plan today! 中文显示&#xff1a;今日有 3068 人已加入此计划&#xff01; 实现代码&#xff1a; Text(AttributedString(localized:"**\(payPeoples)** people have joi…...

操作系统基础

概念 控制和管理操作系统软件和硬件 用户观点&#xff1a;用户和计算机之间的接口 基本概念 特征 并发&#xff0c;共享&#xff0c;虚拟&#xff0c;异步 功能 处理机管理&#xff0c;存储器管理&#xff0c;文件管理&#xff0c;设备管理 作为用户和硬件接口 命令接口&am…...

函数调用流程可用工具

方法 1、gdb&#xff0c;这个网上很多找找就有 2、tcmalloc&#xff0c;直接在调用的地方调一个malloc就可以看到调用的流程&#xff0c;具体见tcmalloc 3、backtrace&#xff0c;个人感觉这么最方便&#xff0c;具体见backtrace...

UniApp 页面布局基础

一、UniApp 页面布局简介 在当今的移动应用开发领域&#xff0c;跨平台开发已成为一种主流趋势。UniApp作为一款极具影响力的跨平台开发框架&#xff0c;凭借其“一套代码&#xff0c;多端运行”的特性&#xff0c;为开发者们提供了极大的便利&#xff0c;显著提升了开发效率。…...

2D图像测量到3D点云之物体三维尺寸测量!!!!

0&#xff0c;引言 本文将从双目采集的2D图像到3D点云进行转化&#xff0c;并进行物体尺寸测量&#xff0c;旨在为读者展示2D图像如何关联3D点云&#xff0c;并进行相关工业应用。 将2D图像转化为3D点云&#xff0c;并进行物体尺寸测量的技术&#xff0c;在工业领域有着广泛的…...

[TOTP]android kotlin实现 totp身份验证器 类似Google身份验证器

背景&#xff1a;自己或者公司用一些谷歌身份验证器或者microsoft身份验证器&#xff0c;下载来源不明&#xff0c;或者有广告&#xff0c;使用不安全。于是自己写一个&#xff0c;安全放心使用。 代码已开源&#xff1a;shixiaotian/sxt-android-totp: android totp authenti…...