网络原理(一)—— http

news2024/11/29 19:02:20

什么是 http

http 是一个应用层协议,全称为“超文本传输协议”。

在这里插入图片描述

http 自 1991 年诞生,目前已经发展为最主流使用的一种应用层协议。

HTTP 往往基于传输层的 TCP 协议实现的,例如 http1.0,http1.0,http2.0

http3 是基于UDP 协议实现的,目前还在完善中,我们目前主要使用的还是 http1.1 和 http2.0 版本,本文章将以 http1.1 来进行展开。


http 的 工作流程:
在这里插入图片描述

抓包工具 Fiddler

Fiddler 主要用来抓取 http 和 https 的数据包,我们可以通过 fiddler 来进行抓包学习 http 和 https

使用也很简单,按住 ALT + A,全选然后可以使用 删除键来进行删除所有抓到的包

在这里插入图片描述

简单介绍一下,不同颜色对应的是什么数据报,红色说明发生了错误,蓝色表明一个包含 html 的数据包,绿色说明是包涵 js 的数据报,紫色则是包含 css 的数据包。

我们点击一下蓝色的数据包,会发现右边出现了两个面板,右上的面板是http 的 请求内容,右下的是 http 的响应内容。

选择 Raw ,然后点击 View in Notepad ,就可以在记事本查看请求的内容。

在这里插入图片描述

查看响应:先点击 Raw,然后点击上面的黄色的条进行解析,最后点击 View in Notepad 就可以查看响应的内容。

在这里插入图片描述

抓包工作原理:实际上 fiddler 相当于一个 “代理”,类似于中间商,浏览器的 http 请求的数据本来是发送给服务器的,因为我们开启了 fiddler ,在中间会多加一个停留点,也就是浏览器和服务器之间多了 fiddler,二者传输的数据都要通过 fiddler ,所以 fiddler 才能抓取 http 的数据包。
在这里插入图片描述

http 协议格式

请求包含:首行,请求头,空行和正文

请求的数据包不一定包含正文的:
在这里插入图片描述
在这里插入图片描述


响应包含:首行,响应头,空行和正文
在这里插入图片描述


协议格式总结:
在这里插入图片描述
右边的 Response 的请求正文是响应正文,打错字了。


http 请求的分析

在http 的请求的首行里,包含 请求方法 + url + http 的版本号
在这里插入图片描述

url

url 就是我们平时说的网址,URL(Uniform Resource Locator 唯一资源定位符

互联网上的每一个文件都有一个唯一的 URL,它包含的信息置出了文件的位置以及浏览器应该怎么处理它。

在这里插入图片描述

http 是我们使用的协议,现在大多数你看到的是 https 协议,这是后话了。url 不是只用 http 能使用,url 可以给各种协议提供支持的。

之后会跟上 IP 地址和端口号,一般来说这里的位置信息为了用户方便记忆,使用域名来充当,域名和 ip 是可以通过 DNS 域名解析系统来实现的(DNS 既是一套服务器系统,也是一种应用层协议)

在IP后面可能会跟上带层次的文件路径

?后面跟的是查询字符串(Query String) 对要访问的资源进行补充说明,使用的是键值对结构,键值对与键值对之间使用 & 来进行分割,键和值之间使用等号 = 来进行分割。

键值对是由程序员自主定义的。

片段标识符一般用于文档的阅读,就是你在网站访问官方网站,阅读官方手册的时候,会使用片段标识符说明你此时阅读的是哪一页的内容。

urlencode

由于 url 本身就携带特殊字符例如 / ? : & =

如果查询字符串 query string 的内容如果包含上面的特殊字符,就会导致 url 解析错误,为了防止这一现象的出现,这里使用了 urlencode 来进行转码,把每一个字节转为 16进制的数据,并且在前面使用 % 来进行分割

举个例子:在百度搜索 C++,会得到下面的 url
https://www.baidu.com/s?ie=UTF-8&wd=C%2B%2B&tn=15007414_dg

%2B 就是 + 转码而来的。


在百度搜索 “你好”,会发现 url 没有转码,但是我们通过 fiddler 抓包的时候确确实实是发生了转码的,为了方便用户观看,浏览器 url 显示的是没有进行转码的 “你好”,但是实际传输给服务器的 url 是发生过转码的

https://www.baidu.com/s?ie=UTF-8&wd=%E4%BD%A0%E5%A5%BD&tn=15007414_dg
在这里插入图片描述

但是在我们Java服务器写的时候,我们不需要进行转码的代码书写,因为 Spring 帮我们自动转码好了。

请求的方法

在这里插入图片描述

在开发中我们最常用的是 GET 和 POST 方法。其次是 PUT 和 DELETE 方法

GET 与 POST (重点)

GET 方法一般是向服务器发送请求使用的,一般使用 query string 来向服务器传输数据,GET 方法一般 body 部分为空(也可以不为空),GET 也不是完全不能带 body (有些客户端/浏览器不支持)。

POST 方法一般是服务器向客户端发送的响应数据包使用的方法,通过 body 来传输响应内容。

GET 和 POST 可以混用

GET请求通常建议设计成 幂等,POST 则没有要求,这是 HTTP 标准文档给出的建议,不是强制要求,幂等是指请求一定的等到的响应也是一定的,例如支付环节中,你付了多少钱,就会相应地扣除多少钱

GET 设计成 幂等,就可以 允许 GET 请求的结果被缓存,POST 由于不要求幂等,所以结果不能被缓存,但是现在开发中 GET 不幂等的情况很常见,GET 和 POST 方法也经常被混着用。


网上的一些错误的说法:
POST 比 GET 更安全,在登录场景中输入用户名和密码,使用 GET 方法,用户名和密码就会放到 url 的 query string 里面,也就是显示在浏览器的地址栏上。

POST 方法也就是把 用户名和密码放到了 body 里面,我随便抓个包不都看到了吗?安不安全这个问题考虑的是“加密传输”。如果POST 传输数据没有加密,这就不安全了。

GET 传输的数据是有长度限制的,在上古时期的 IE 浏览器时代,对 url 的长度是有限制的,但是限制主流的浏览器已经不存在这个问题了,比较长的 url 很多时候我们也能见到。

GET 只能传输文本,POST 可以传输二进制:GET 确实 url 只能放文本,但是可以将二进制 通过 base64 转码成文本。

请求报头(header)

header 的状体的格式是 “键值对” 结构,每个键值对占一行,键和值之间使用分号分割,报头的种类有很多,这里只介绍常见的几种。

Host

Host 表示服务器主机的地址和端口

在这里插入图片描述

Content-Length 与 Content-Type

Content-Length 表示 body 的数据长度,Content-Type 表示 body 的数据格式,这两个要么同时存在要么都不存在。如果 http 请求没有包含 body 就不会有这两个。如果有 body ,但是没有这两个 header (哪怕只有其中一个 header),都是错误的 / 非法的 http 报文。

在这里插入图片描述

在这里插入图片描述

User-Agent (UA)

UA 表示的是浏览器 / 操作系统的属性

在这里插入图片描述
在互联网发展早期的时候,有些浏览器只能显示文本,不支持更多的功能,后来网页引入了图片、样式、js…

在同一时间段内,有些用户的浏览器版本比较低,很多页面的功能不能支持,也有一些用户的浏览器更新过了,能支持更多的功能,因此为了区分不同用户使用的设备,通过 UA 就可以知道用户的设备最多支持哪些特性,到了今年浏览器已经大差不差了,现在 UA 的用途主要是区分用户使用的是 手机还是 PC 端,然后服务器根据不同的设备返回不同的网页。

Referer

表示这个页面是从哪个页面跳转过来的

如果直接咋爱浏览器输入 URL 或者通过收藏夹访问页面时是没有 Referer 的。

在这里插入图片描述

Cookie

Cookie 中存储了一个字符串,这个数据可能是客户端 (网页) 自行通过 JS 写入的,也可能来自于服务器
(服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据)

在这里插入图片描述

Cookie 的数据都是程序员自定义的内容。

Cookie 有一个经典的应用场景是登录和用户认证

http 响应解析

在 http 首行里包括了 http 版本号,状态码,以及状态码描述
在这里插入图片描述

状态码

状态码表示访问一个页面的结果. (是访问成功,还是失败,还是其他的一些情况…)

在这里插入图片描述

下面我们只介绍几种常见的状态码:

200 OK

表示访问正常。
在这里插入图片描述

404 Not Found

表示访问的资源没找到

在这里插入图片描述

403 Forbidden

访问被拒绝了(没有权限)
在这里插入图片描述

405 Method Not Allowed

说明客户端的请求的方法和服务器这边声明的注解不匹配。

在JavaEE部分 会给大家演示

500 Internal Server Error

服务器出现错误。

504 Gateway Timeout

Gateway 是网关的意思(也就是网络的入口)

当服务器负载比较大的时候,服务器处理单条请求的时候消耗的时间就会很长,就可能会导致出现超时的情况.

302 Move Temporarily

临时重定向

永久重定向. 当浏览器收到这种响应时,后续的请求都会被自动改成新的地址.
302 也是通过 Location 字段来表示要重定向到的新地址.

301 Moved Permanently

永久重定向

永久重定向. 当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址.
301 也是通过 Location 字段来表示要重定向到的新地址.

小结

2xx 表示成功
3xx 表示重定向
4xx 表示客户端出错,用户构造的请求有问题
5xx 表示服务器出错,Java程序员主要关注这个错误,修 bug

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

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

相关文章

Next.js-样式处理

#题引:我认为跟着官方文档学习不会走歪路 Next.js 支持多种为应用程序添加样式的方法,包括: CSS Modules:创建局部作用域的 CSS 类,避免命名冲突并提高可维护性。全局 CSS:使用简单,对于有传统…

navicat premium连接sqlserver

连接不上就双击安装图中的msi文件之后再连试试!

Axure RP教程:创建高效用户界面和交互

Axure RP是一款广受好评的软件,专门用于设计精致的用户界面和交互体验。这款软件提供了众多UI控件,并根据它们的用途进行了分类。与此同时,国产的即时设计软件作为Axure的替代品,支持在线协作和直接在浏览器中使用,无需…

Qt导出Excel图表

目的 就是利用Qt导出Excel图表,如果直接画Excel 图表,比较麻烦些,代码写得也复杂了;而直接利用Excel模块就简单了,图表在模块当中已经是现成的了,Qt程序只更改数据就可以了,这篇文章就是记录一下利用模块上…

DeSTSeg: Segmentation Guided Denoising Student-Teacher for Anomaly Detection

DeSTSeg: Segmentation Guided Denoising Student-Teacher for Anomaly Detection 清华、苹果 个人感觉 Introduction 很自然的让读者理解作者问题的提出,也有例子直接证明了这个问题的存在,值得借鉴!! Related work写的也很不…

Java设计模式 —— 【创建型模式】工厂模式(简单工厂、工厂方法模式、抽象工厂)详解

文章目录 前言一、简单工厂(静态工厂)1、概述2、代码实现3、优缺点 二、工厂方法模式1、概述2、代码实现3、优缺点 三、抽象工厂模式1、概述2、代码实现3、优缺点 四、总结 前言 先看个案例:【手机和手机店】在没有工厂的时候,手…

利用Java爬虫获取阿里巴巴中国站跨境属性的详细指南

在全球化贸易的浪潮中,跨境电商正成为连接全球买家和卖家的重要桥梁。阿里巴巴中国站作为全球领先的B2B电子商务平台,提供了海量的商品信息,其中跨境属性信息对于跨境电商尤为重要。本文将详细介绍如何使用Java编写爬虫,从阿里巴巴…

「Qt Widget中文示例指南」如何为窗口实现流程布局?(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文将展示如何为不…

鸿蒙学习使用模拟器运行应用(开发篇)

文章目录 1、系统类型和运行环境要求2、创建模拟器3、启动和关闭模拟器4、安装应用程序包和上传文件QA:在Windows电脑上启动模拟器,提示未开启Hyper-V 1、系统类型和运行环境要求 Windows 10 企业版、专业版或教育版及以上,且操作系统版本不低于10.0.18…

Java后端如何进行文件上传和下载 —— 本地版

简介: 本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。 大体思路 1、文件上传 …

SqlServer强制转换函数TRY_CONVERT和TRY_CAST

SqlServer强制转换函数TRY_CONVERT和TRY_CAST的介绍和案例分享 1、本节内容 CAST 和 CONVERT TRY_CAST TRY_CONVERT 适用于: SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics 分析平台系统 (PDW)Microsoft Fabric 中的 SQL 分析端点Micro…

透视投影(Perspective projection)与等距圆柱投影(Equirectangular projection)

一、透视投影 1.方法概述 Perspective projection(透视投影)是一种模拟人眼观察三维空间物体时的视觉效果的投影方法。它通过模拟观察者从一个特定视点观察三维场景的方式来创建二维图像。在透视投影中,远处的物体看起来比近处的物体小&…

linux 中后端jar包启动不起来怎么回事 -bash: java: 未找到命令

一、用以下命令检查jdk版本 输入:java -version,如果JDK 环境变量没有配置,你会看到如下提示 二、配置jdk环境 1.先找到/etc/profile文件,然后在该文件最后面加上以下配置 export JAVA_HOME/usr/local/jdk-21.0.1 export PATH$…

TDengine在debian安装

参考官网文档&#xff1a; 官网安装文档链接 从列表中下载获得 Deb 安装包&#xff1b; TDengine-server-3.3.4.3-Linux-x64.deb (61 M) 进入到安装包所在目录&#xff0c;执行如下的安装命令&#xff1a; sudo dpkg -i TDengine-server-<version>-Linux-x64.debNOTE 当…

Java开发工程师最新面试题库系列——Java基础部分(附答案)

如果你有更好的想法请在评论区留下您的答案&#xff0c;一起交流讨论# 面向对象有哪些特征&#xff1f; 答&#xff1a;继承、封装、多态 JDK与JRE的区别是什么&#xff1f; 答&#xff1a;JDK是java开发时所需环境&#xff0c;它包含了Java开发时需要用到的API&#xff0c;JRE…

linux系统下如何将xz及ISO\img等格式压缩包(系统)烧写到优盘(TF卡)

最近用树莓派做了个NAS&#xff0c;效果一般&#xff0c;缺少监控及UI等&#xff0c;详细见这篇文章&#xff1a; https://blog.csdn.net/bugsycrack/article/details/135344782?spm1001.2014.3001.5501 所以下载了专门的基于树莓派的NAS系统直接使用。这篇文章是顺便复习一…

计算机的错误计算(一百六十八)

摘要 算式“(5^25*(1/25)^(1/5)*3^25(1/25)^(1/5)*5^25*3^(251/5)-(9/25)^(1/5)*3^25*5^25-(1/25)^(1/5)*3^25*5.0^25*(13^(1/5)-3^(2/5.0)))”的值为0。但是&#xff0c;在 MATLAB 中计算它&#xff0c;则输出含有15位整数。 例1. 计算 直接贴图吧&#xff1a; 这样&#x…

Python学习------第十四天

匿名函数 1.函数作为参数来传递 &#xff08;函数的参数中调用另外一个函数&#xff09; #定义一个函数&#xff0c;接受另一个函数作为参数传入 #计算逻辑的传入 def test_func(compute):result compute(1,2)print(result)print(f"{type(result)}")print(f"…

【经典论文阅读】Transformer(多头注意力 编码器-解码器)

Transformer attention is all you need 摘要 完全舍弃循环 recurrence 和卷积 convolutions 只依赖于attention mechanisms 【1】Introduction 完全通过注意力机制&#xff0c;draw global dependencies between input and output 【2】Background 1&#xff1a;self-…

Java——多线程案例

目录 一、单例模式 1.饿汉模式 2.懒汉模式 3.线程安全问题 4.解决线程安全问题(懒汉模式) 二、阻塞式队列 1.什么是阻塞队列 2.生产者消费模型 生产者消费者模型意义&#xff1a; 1.解耦合 2.削峰填谷 3.标准库中的阻塞队列 三、定时器 1.定时器是什么 2.标准库中的…