网络原理(HTTP篇)

news2025/1/24 17:46:38

网络原理HTTP

    • 前言
    • HTTP
      • HTTP的工作流程
      • 抓包工具
      • 抓取HTTP报文
        • HTTP报文格式
      • 请求报文具体细节
        • 首行
          • URL
            • URL的基本格式
            • URL encode
          • 方法
        • 报头(header)
          • Host
          • Content-Length 和 Content-Type
          • User-Agent(UA)
          • Referer
          • Cookie(重要)

前言

如图:HTTP/3.0之前 是基于TCP实现的。到了HTTP3.0版本,则是基于UDP实现的

![[Pasted image 20240203093906.png]]


HTTP

HTTP,全称为 “超文本传输协议”,现在最新版本为 HTTP/3.0,但主流使用的仍然是HTTP/1.1版本。

什么叫超文本?
我们知道,文本文件其实就是字符串文件(即能在 UTF8/GBK 等码表上找到合法字符的字符串)

超文本文件,就不仅仅是字符串,还能携带一些图片(如HTTP、HTML)

超文本之后,还有富文本(Word文档),能够支持的格式更多了~


HTTP的工作流程

HTTP/1.1 采用 持续连接 方式。服务器在发送响应后,仍然保持这条连接,使同一个客户端(浏览器)和该服务器可以继续在这条连接上传输后续的HTTP请求报文和响应报文。

HTTP还使用了 流水线 工作方式以提高效率。即浏览器在收到HTTP响应报文之前就能够连续发送多个请求报文。这样就能节省很多个RTT时间,使得TCP连接中的空闲时间很少。

HTTP的交互是非常经典的 “一问一答” 模式:


抓包工具

借助一个抓包工具fiddler 来学习HTTP的报文格式

wireshark:功能很全,可以抓各种协议数据包,但使用起来也相对复杂

fiddler:专注于抓取 HTTP 的包

注:使用fiddler时,需要进行设置:因为网络上大部分的请求都是基于 HTTPS(HTTPS在HTTP基础上进行了加密,安装证书就可以让fiddler对HTTPS的报文进行解密)。
![[Pasted image 20240203115455.png]]

注:打开一个网站,浏览器和服务器之间的 HTTP 交互并不是只有一次,通常会有很多次。第一次交互是拿到这个页面的 HTML,HTML还会依赖CSS和JS等,HTML被浏览器加载后,又会触发一些其他的http请求,获取到CSS、js等,当执行js时,js代码里又可能触发很多的http请求。经过多次这样拉扯之后,才会呈现浏览器里所看到的内容。


抓取HTTP报文

随便进入一个网站:
蓝色的表示返回的是一个 html,这个往往是访问一个网站的入口请求,选中这个请求并双击

![[Pasted image 20240203130905.png]]

这个是HTTP请求
![[Pasted image 20240203131041.png]]

这是请求的响应报文
![[Pasted image 20240203131100.png]]

用记事本打卡响应报文内容:会看到乱码

这里的数据被压缩成乱码。因为网络传输中,带宽是一个比较贵的硬件资源,为了节省带宽,就可以把响应数据进行压缩(一般都是压缩响应,请求报文不太需要),压缩和解压缩的过程是需要消耗时间和CPU的
![[Pasted image 20240203131115.png]]

![[Pasted image 20240203131218.png]]

解压缩之后就能看到正常的响应内容数据了
![[Pasted image 20240203131230.png]]

注:这种灰色的请求与响应,是由于浏览器和服务器之间要进行多次网络交互,为了提升效率,就会把一些固定不变的内容在浏览器本地的硬盘上进行缓存(如css、图片、js很少发生改变的数据)。保存到硬盘上后,后续再请求,就可以直接从硬盘上读取数据,减少了网络交互的开销。(可以使用 ctrl + F5 强制刷新,强制读取服务器数据)
![[Pasted image 20240204123611.png]]


HTTP报文格式

HTTP请求报文格式,包含4个部分:

  1. 首行。首行分为三个部分:方法(method)、URL、HTTP的版本号,三者用空格分割
    ![[Pasted image 20240203131937.png]]

  2. 请求头(Header)
    从第二行开始,红框圈住部分就叫请求头。类似于TCP报头/IP报头,携带了重要的属性信息(只不过TCP/IP是以二进制携带的,HTTP是以文本内容携带
    HTTP的请求头部分是通过键值对来组织的Key-Value),每个键值对占一行。键和值之间使用 : 加上 (空格) 来分割的。键值对有哪些,分别是什么含义,都是HTTP协议规定的,后续详解。
    ![[Pasted image 20240203132051.png]]

    ![[Pasted image 20240203132521.png]]

  3. 空行:表示一个报文的结束标记
    ![[Pasted image 20240203132716.png]]

  4. 正文(body)http的载荷部分(有的http请求有body,有些则没有,这很正常)


HTTP响应报文格式,包含4个部分:

  1. 首行:三个部分(版本号状态码状态码描述

    状态码表示这一次请求是成功还是失败失败的原因是什么
    就像卸载Python不开管理员权限就会出现2503/2502状态码

    ![[Pasted image 20240203133012.png]]

  2. 响应头。也是由键值对组成(Key-Value),通过冒号+空格来分割(:

    ![[Pasted image 20240203133937.png]]

  3. 空行:报文结束标记

    ![[Pasted image 20240203133923.png]]

  4. 正文(body):数据载荷部分
    可以看到响应的载荷是html
    ![[Pasted image 20240203134005.png]]


请求报文具体细节

首行
URL

URL(唯一资源定位符):描述一个网络上的资源位置

URI(唯一资源标识符):只是一个标识,用来区别于其他资源的标识。(角度不同,有时URI也可以表示URL)

这两个东西表示的含义是差不多的,严格说URI的范围比URL更广一些。URL特指你这个东西在网络的哪里。


URL的基本格式

![[Pasted image 20240203162244.png]]

协议方案名:顾名思义,指该网站所用的协议

登录信息(已弃用):毕竟将用户名、密码直接放在这上面是很不安全的操作

服务器地址:由于DNS域名解析系统,这里显示的是域名,用对应的IP地址也可以访问到

服务器端口号:可以指定,也可以不写。不带端口号,浏览器就会取默认值(因为这些服务器都很有名,http: 80;https: 443)

带层次的文件路径:标识资源在网络上的位置

想知道资源位置,要做的:

  1. 通过 IP地址 知道服务器在哪
  2. 通过 端口号 知道对应程序在哪
  3. 最后通过这个路径知道是访问哪个资源(这和之前章节说的 “文件” 又串起来了,绝对路径就是表示一个文件,知道那个文件在哪)

查询字符串:针对请求的内容做的补充说明

查询字符串,是客户端给服务器传递信息的重要途径,也是以键值对的方式来组织的。因为每个网站业务逻辑不同,需要补充的信息也是不同的,所以键值对的内容都是由程序员自定义

![[Pasted image 20240203163303.png]]

结合上述的 IP地址、端口号、路径、查询字符串,就可以 “精确” 描述出一个网络资源的位置了

片段标识符:标识当前页面的某个部分,通过不同的片段标识可以完成页面内的跳转。


URL encode

查询字符串(query string):是程序员自动义的键值对。但在URL中,本身有些符号具有特殊含义(如 /: 等),如果两者的符号冲突,就会导致一些很严重的bug(比如网页跳转失败!)

所以我们就需要对这类特殊符号,在自定义的时候,将其 “转义”

PS:对于汉字来说,也是要进行转义的!汉字的 UTF8/GBK 等编码值,可能其中某个字节恰好和某个符号的 ASCII 码值冲突!

给一个特殊符号的例子:打开包含 C++ 字样的网站,可以看到 %2B%2B,因为 + 在ASCII码表中,用 16进制 表示,就是 2B,并且加上 % 表示这是转义后的内容
![[Pasted image 20240203164332.png]]

再来看看汉字的情况:

注:网页中的URL看到的就是汉字本身,而不是转义后的内容,因为网页将它经过了处理,一旦将该URL复制粘贴出来,就不是汉字,而是转义后的内容了
![[Pasted image 20240203164809.png]]


方法

![[Pasted image 20240204111446.png]]

为什么说这些语义仅是作者的一厢情愿?
因为别忘了,HTTP协议是工作在应用层,这些方法的作用是可以由程序员自定义的。也就是说,完全可以用 GET 来上传数据,POST 来获取数据。怎么写,就靠程序员自行约定了。


报头(header)

header 的整体格式是 “键值对” 结构

Host

Host:表示服务器主机的地址和端口(URL里其实也已经有Host了)

![[Pasted image 20240204121412.png]]

这里的 Host 与 URL 中的 IP地址、端口等信息,绝大部分情况下都是一样的。

少数情况可能不同。

少数情况:如使用翻墙代理软件,URL中的IP和端口指向的是代理服务器,而Host中指向的则是最终服务器


Content-Length 和 Content-Type

Content-Length:表示 body 中的数据长度

通过这个长度,就可以处理 “粘包问题”,因为HTTP协议底层是基于TCP实现的!

如果是没有 body 的请求 / 响应,则直接使用 “空行” 作为数据包之间的分割符。
如果有 body,空行就不是结束标记了,而是从空行开始读取 body 数据,此时就以 Content-Length 来作为数据包之间的边界。

Content-Type:表示请求中的 body数据格式body 可以传输很多种格式,包括程序员也可以自己约定任意的格式,但有些格式是非常常见的,需要去了解。

请求中的常见格式:

  1. application/jsonbody 就是 json 格式的数据

  2. application/x-www-form-urlencoded:称为 “form表单”,通过 HTML 中的 form 标签构造出来的一种格式,这个格式的特点是把 query string 放到 body 中。(这个格式也可以用来上传文件)

  3. multipart/form-data:主要是上传文件时使用的。(这种form表单提交数据的方式越来越少了,现在还是 json 偏多)

响应中的常见格式:

  1. text/plain:纯文本

  2. text/html:html

  3. text/css:css

  4. application/javascript:js

  5. application/json

  6. image/png

  7. image/jpg

注:正常来说,响应报文只要有 body,都会有 Content-Type;但也有例外,如果响应报文确实没有 Content-Type,也没有 body,此时有些容错能力很强的浏览器,也能尽可能将这些数据正确显示出来(如 Chrome 浏览器)。


User-Agent(UA)

![[Pasted image 20240204132819.png]]

显而易见:UA描述了用户使用啥样的设备进行上网


Referer

Referer:描述了这个页面是从哪个页面跳转过来的。(也就是能知道当前页面的上一级页面是啥)


Cookie(重要)

Cookie:一种浏览器本地持久化存储数据的机制(即将数据存到硬盘里)

浏览器作为计算机应用层软件,能否直接读写本地硬盘文件?
当然可以,系统提供了 API 来操作文件,作为一个应用层程序,当然可以调用这些 API 了。

那么浏览器上运行的网页,能否通过浏览器提供的 API 来读写本地硬盘文件?
理论上是可以的,但是浏览器禁止了这种做法。因为要保障安全性,总不能点进一个网站,你的电脑就直接中病毒了吧。

但是,有些网站,将一些信息保存在浏览器,是一种刚需,比如登录网站的用户信息
所以浏览器提供了 Cookie 这样的 API,能够有限度地存储数据,而不是直接访问本地文件系统。(类似于 Cookie 的机制,还有 LocalStorage、IndexDB)

Cookie 也是按照键值对的格式来保存信息。

Cookie最大的作用,就是让服务器对这个客户端有一个清楚的认识。

关于 Cookie 的几个重要结论:

  1. Cookie 从哪里来?
    通常都是客户端首次访问服务器,服务器返回给浏览器的

  2. Cookie 到哪里去了?
    Cookie 会存储在浏览器本地主机的硬盘上,后续每次访问服务器都会带上 Cookie(让服务器对这个客户端的信息有个认识,从而返回这个客户端以前在这个页面存留的对应信息

  3. Cookie 中存的是什么?
    存的是键值对数据,同 query string 一样,这里的内容是由程序员自定义完成

  4. Cookie 在浏览器中是如何组织的?
    就跟给数据分目录一样,Cookie 是通过域名来分类的。(这也好理解,每个人在不同的网页上,肯定是用不同的账户)

  5. Cookie 的作用?
    用来在客户端保存数据,其中最主要的就是保存用户的身份标识
    上传数据给服务器,服务器就能返回这个用户对应的数据信息。

PS:浏览器中保存的账户密码,是另一个保存机制,并不是 Cookie。

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

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

相关文章

汽车金融市场研究:预计2029年将达到482亿美元

汽车金融公司作为汽车流通产业链的重要一环,认真贯彻落实国家有关政策,采取多种措施助力汽车产业发展,为促进推动汽车消费、助力畅通汽车产业链、支持稳定宏观经济大盘发挥了积极作用。 益于国内疫情得到有效控制,我国经济持续稳定…

TypeScript(一):TypeScript基本理解

TypeScript基本理解 为什么使用TS JavaScript发展至今,没有进行数据类型的验证而我们知道,在编程阶段,错误发现的越早越好而TS就解决了JS的这个问题 认识TypeScript TypeScript是拥有类型的JavaScript超级,它可以编译成普通、…

OpenAI发布Sora模型,可根据文字生成逼真AI视频

早在2022年11月30日,OpenAI第一次发布人工智能聊天机器人ChatGPT,随后在全世界掀起了人工智能狂潮,颠覆了一个又一个行业。在过去的一年多的时间里,chatGPT的强大功能改变了越来越多人的工作和生活方式,成为了世界上用…

达梦数据库——数据迁移sqlserver-dm报错问题整理

报错情况一:Sql server迁移达梦连接报错’驱动程序无法通过使用安全套接字Q层(SSL)加密与SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferencesITLS127‘ 原因:历史版本的SOL SERVER服务…

防御保护第五次作业

1,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) FW5: 2,分公司设备可以通过总公司的移动链路和电信链路访问到DMz区的http服务器 FW5: 注:记得通过安全策略放行 分公司FW3 注意&#xff1a…

用300万支电动牙刷发起DDoS攻击?假的!

近日国外“300万支电动牙刷被用于DDoS攻击”的安全事件引发广泛讨论。国外媒体发文称“300万支电动牙刷被黑客用恶意软件感染,以执行分布式拒绝服务(DDoS)攻击。”经Fortinet与媒体确认,这是一起虚假的新闻。 上周,瑞士…

【网络编程】ZeroMQ的网络通信

文章目录 1、概述2、通信效果2.1、Request-Reply(请求-响应模式)2.2、Publish-Subscribe(订阅-发布模式) 3、方式选择3.1、准备用 Visual Studio-C 方式3.1.1、找到 Builds 文件夹3.1.2、查看 deprecated-msvc 下的 libzmq.sln 文…

图像像素读写image.at、image.ptr、指针

image.at 在OpenCV中,使用Mat对象表示图像数据,在使用at方法时,需要确保使用正确的数据类型(如uchar或Vec3b),这取决于图像的通道数和数据深度。 单通道图像 对于单通道图像(如灰度图像&…

正信晟锦:借钱后不还算诈骗吗

在探讨“借钱后不还”这一行为是否构成诈骗时,我们应首先明确诈骗的法律定义。根据《中华人民共和国刑法》,诈骗是指以非法占有为目的,采用虚构事实或隐瞒真相的手段,骗取他人财物的行为。关键在于是否存在欺诈行为和非法占有的主…

12.QT文件对话框 文件的弹窗选择-QFileDialog

目录 前言: 技能: 内容: 1. 界面 2.信号槽 3.其他函数 参考: 前言: 通过按钮实现文件弹窗选择以及关联的操作 效果图就和平时用电脑弹出的选文件对话框一样 技能: QString filename QFileDialog::ge…

消毒柜行业分析:市场渗透率不足20%

目前消毒柜仍然属于“小众”品类,疫情前期市场渗透率也不足20%。有业内人士表示,多年来消毒柜零售量规模基本在400万台左右徘徊,这个角度看,消毒柜是具有自身的产品消费人群的,其市场相对稳定,而且消毒柜的…

【Java EE初阶十六】网络原理(一)

在网络原理中主要学习TCP/IP四层模型中的重点网络协议 1. 应用层 1.1 应用程序与协议 应用层是和程序员接触最密切的; 应用程序:在应用层这里,很多时候都是程序员自定义应用层协议(步骤:1、根据需求,明确…

前端工程化面试题 | 14.精选前端工程化高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

2974. 最小数字游戏【简单】

2974. 最小数字游戏 题目描述: 你有一个下标从 0 开始、长度为 偶数 的整数数组 nums ,同时还有一个空数组 arr 。Alice 和 Bob 决定玩一个游戏,游戏中每一轮 Alice 和 Bob 都会各自执行一次操作。游戏规则如下: 每一轮&#xf…

001kafka源码项目gradle报错UnsupportedClassVersionError-kafka-报错-大数据学习

1 报错提示 java.lang.UnsupportedClassVersionError: org/eclipse/jgit/lib/AnyObjectId has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0 如…

AI:131- 法律文件图像中的隐含信息挖掘与敲诈勒索检测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

2024最全的性能测试种类介绍,这6个种类特别重要!

系统的性能是一个很大的概念,覆盖面非常广泛,包括执行效率、资源占用、系统稳定性、安全性、兼容性、可靠性、可扩展性等,性能测试就是描述测试对象与性能相关的特征并对其进行评价而实施的一类测试。 性能测试是一个统称,它其实包…

Nginx高级课程扩容(四)

Brotli 安装 ● 官网 ● https://github.com/google/ngx_brotli ● https://codeload.github.com/google/brotli/tar.gz/refs/tags/v1.0.9 ● 下载 两个项目 ● 解压缩模块化编译 ./configure --with-compat --add-dynamic-module/root/ngx_brotli-1.0.0rc --prefix/usr/local…

[嵌入式系统-28]:开源的虚拟机监视器和仿真器:QEMU(Quick EMUlator)与VirtualBox、VMware Workstation的比较

目录 一、QEMU概述 1.1 QEMU架构 1.2 QEMU概述 1.3 什么时候需要QEMU 1.4 QEMU两种操作模式 1.5 QEMU模拟多种CPU架构 二、QEMU与其他虚拟机的比较 2.1 常见的虚拟化技术 2.1 Linux KVM 2.2 Windows VirtualBox 2.3 Windows VMware workstation 三、VirtualBox、VM…

【Java程序员面试专栏 Java领域】Java集合 核心面试指引

关于Java 集合部分的核心知识进行一网打尽,主要包括Java各类集合以及Java的HashMap底层原理,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 集合基本概念和比较 关于集合的基本分类和知识 Java集合有哪些种类 Java 集合, 也叫作容器…