HTTP基本结构

目录

  • 前言
  • 1. 概念
  • 2. HTTP基本格式
    • 2.1 抓包原理
    • 2.2 抓包软件使用
    • 2.3 抓包结果
  • 3. HTTP请求
    • 3.1 URL
    • 3.2 方法
    • 3.3 版本号
    • 3.4 HTTP报头
    • 3.4 正文部分
  • 4. HTTP响应
    • 4.1 HTTP状态码
    • 4.2 其他部分
  • 总结

前言

本篇文章介绍HTTP的基本结构。

1. 概念

HTTP全称为超文本传输协议,是一种应用非常广泛的应用层协议。诞生于1991年,目前已经发展为最主流使用的应用层协议。超文本的意思是,文本中包含了更复杂的内容(例如图片、视频、音频、特殊字体、链接等)。

2. HTTP基本格式

HTTP是一种文本格式的协议,我们需要使用抓包软件来观察HTTP的协议格式。这里使用fiddler进行抓包。

2.1 抓包原理

抓包软件本质上是一个“代理程序”这里以fiddler为例,在浏览器访问界面时,就会把HTTP请求先发给Fiddler,Fiddler再把请求转发给对应的服务器,服务器返回数据时,Fiddler拿到返回数据,再把数据交给浏览器,所以Fiddler对于浏览器和服务器的交互细节是非常清楚的,所以抓包软件就可以监听网卡上通过的数据了。

2.2 抓包软件使用

以fiddler为例,在这个地址进行安装: fiddler安装。
在这里插入图片描述
左侧窗口显示了所有的HTTP请求/响应,可以选中某个请求来观看详细内容,右侧上方显示HTTP请求的报文内容,右下方显示了HTTP响应的报文内容。点击Raw可以看到详细的数据格式。

2.3 抓包结果

请求基本格式:
在这里插入图片描述

  1. 首行:请求中的第一行我们称为首行。
  2. 请求头:第二行开始往后若干行我们称为请求头。
  3. 空行:空行为请求头的结束标记
  4. 正文:空行之后的内容(这里的请求没有)

响应基本格式:
在这里插入图片描述

  1. 首行:请求中的第一行我们称为首行。
  2. 响应头:第二行后的若干行。
  3. 空行:空行为请求头的结束标记。
  4. 正文:空行之后的内容
    这里的正文可以看到是二进制内容,这是把文本压缩成二进制了,用来节省资源。
    解压缩后:
    在这里插入图片描述
    可以看到,正文部分包含了网页的HTML。

3. HTTP请求

先看请求的首行:
GET https://www.csdn.net/ HTTP/1.1
这里分成了三个部分,GET称为方法,HTTP/1.1这个部分称为版本号,中间这个部分我们称为URL。我们着重讲这三个部分。

3.1 URL

URL全称”唯一资源定位符“,描述了网络上某个资源的具体位置。互联网每个文件都有唯一的URL,它包含的信息指出了文件的位置以及浏览器对其的处理方式。
URL的完整结构:
在这里插入图片描述
协议方案名:常见的由http和https。
登录信息:这里登录信息(认证)的内容已经淘汰,现在已经没有网站采取URL进行认证了。
服务器地址:是IP地址,一般填的是域名,会通过DNS系统解析成一个具体的IP地址。
端口号:如果省略,会根据协议自动决定使用哪个端口。
带层次的文件路径:一个机器上的一个服务器程序可能管理者很多资源,可能是真实的文件,也可能是一些动态生成的资源(根据请求计算出来的响应)。
查询字符串:是键值对(query string)的格式,通过‘=”分割键和值。通过“&”分割多个键值对,这里键值对的含义由程序员来自定义。通过查询字符就可以让客户端给服务器传递一些参数。
片段标识符:标识网页的某个部分,实现“页面内跳转”功能,在一些文档类网站,会带有这个。

URL一些部分可以省略:
协议名:可以省略,省略后默认为http://
ip地址/域名:在HTML中可以省略。省略后标识服务器的ip/域名与当前HTML所属的ip/域名一致。
端口号:可以省略。省略后如果是http协议,自动设为80;如果是https协议,自动设置为443
带层次的文件路径:可以省略。省略后相当于/。一些服务器在发现“/”路径的时候自动访问/index.html。
查询字符串和片段标识也都可以省略。

关于URL encode
url的query string中的value部分可能需要进行转义。规则是把特殊符号的 ascii码取出来,按照字节维度插入一些“%”。
中文也需要转义,这是因为中文通过uft8/gbk之类的编码格式表示,可能某个汉字的utf8/gbk编码中的某个字节,恰好和某个特殊符号的ascii码相同了。
query string的内容,程序员可以自定义(尤其是value),如果value中包含特殊符号,就可能使url的解析出现错误。这是因为url中的特殊符号有特定含义。

3.2 方法

在这里插入图片描述
HTTP方法表达的是一种语义,介绍上图几个常用的:

  1. GET:从服务器获取某个资源。
    GET方法是HTTP中最常见的方法,很多操作都会触发HTTP的GET请求:
    直接在浏览器输入url;
    页面上点击一些跳转链接;
    HTML间接加载其他资源的时候(CSS,JS,图片等 );
    通过js/java/C++/Python等代码手动构造GET请求。
    GET请求特点:
    GET请求一般没有body;
    GET请求要给服务器传递数据,往往是通过路径/query string来进行传递。
  2. POST:向服务器上传一些资源。
    登录时或者上传资源/文件时会触发。登陆时提交填写的用户和密码。上传资源/文件时提交传输资源的内容。
    POST带有body,通过body给服务器传递数据,通常下不使用query string传递数据。
  3. PUT:向服务器上传某个资源(文件)。和POST差不多一样。
  4. DELETE:删除服务器的某个资源。和GET类似,也是一般不带有body,通过quert string传递参数。

3.3 版本号

HTTP1.1是目前最主流的HTTP版本号。与请求不同的是,响应的版本号在首行的前面。

3.4 HTTP报头

在这里插入图片描述
报头的形式是行文本,每一行是一个键值对,键和值之间用 “ :加一个空格"(: ) 来分割。
介绍简单一下header的一些key:

  1. Host:描述了访问的服务器的IP(域名)和端口 (可以省略)
  2. Content-Length和Content-Type:前一个描述了body的长度,后一个描述了body的数据格式,所以在请求/响应中包含body时才会有这两个key。Contet-Length这一个key解决了“粘包问题”。如果一个请求/响应,有body但没有这其中一个key,那么这就是一个非法的“请求/响应”。
  3. User-Agent:表示浏览器/操作系统的属性。
  4. Referer:表示这个界面是从哪个界面跳转过来的。内容是一个网址。
  5. Cookie:Cookie中的内容是键值对,使用分号(;)来分割多个键值对,使用等号(=)来分割键和值。Cookie本质是浏览器在本地存储数据的一种机制。此外,浏览器本地存储cookie时,按照域名维度进行管理。
    浏览器为了把控安全,浏览器会限制一个网站的权限,比如会禁止网站访问硬盘,禁止网站调用电脑上的其他应用程序。所以网站如果在电脑上存储一些数据,就需要用到Cookie,其中的内容是服务器返回给浏览器的,浏览器会把Cookie保存到本地,由于不允许网站随意访问硬盘,所以只能按照“键值对”形式来存储简单数据。
    在服务器响应header中可能会包含set-cookie这样的报头,每一个set-cookie就对应一个cookie键值对。
    Cookie键值对是自定义的,我们可以通过Cookie保存一些没那么重要但是有用的信息,如“上次访问时间”。

3.4 正文部分

请求的body部分,简单介绍一下一些常见的数据格式,有application/json,text/html,text/css,application/JavaScript,image/png。

4. HTTP响应

4.1 HTTP状态码

在响应的首行就是HTTP的状态码。
在这里插入图片描述
不同的状态码表示不同的含义,在官方文档中有很多状态码,下面介绍几种常用的:

  1. 200 OK:表示访问成功,这里的成功表示HTTP层的成功,不代表业务层面的成功,比如注册账号,提交用户名,由于用户名重复,导致注册失败,这就是业务失败,但也可以通过200这样的状态码表示。
  2. 404 Not Found:客户端要访问的资源不存在,即URL中层次结构的路径不存在。
  3. 403 Forbidden:访问被拒绝(没有权限访问)
  4. 500 Internal Server Error:服务器抛出异常,崩溃了
  5. 504 Gateway TimeOut:服务器负载大,处理请求超时。
  6. 302 Move temporarily:临时重定向,跳转到另一个界面,例如登录页面登录成功后自动跳转到主页。响应报文header部分会包含一个Location字段,表示要跳转到哪个界面。
  7. 301 Moved Permanently:永久重定向,浏览器收到这种响应时,后续的请求都会被自动改成新的地址。

4.2 其他部分

响应报头响应正文和上面请求对应的部分差不多,不再讲述。

总结

本篇文章较为详细的介绍了HTTP的基本结构,同时还顺带介绍了fiddle抓包工具,看完这篇文章后,希望你能对HTTP能够有较为深入的理解。

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

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

相关文章

CVPR优秀论文 | DashGaussian:在200秒内优化三维高斯点绘制

本文选自gongzhonghao【图灵学术SCI论文辅导】关注我们,掌握更多顶会顶刊发文资讯1.导读1.1 论文基本信息论文标题:DashGaussian: Optimizing 3D Gaussian Splatting in 200 Seconds作者:Youyu Chen、Junjun Jiang、Kui Jiang、Xiao Tang、Zh…

知识蒸馏 - 基于KL散度的知识蒸馏 HelloWorld 示例 采用PyTorch 内置函数F.kl_div的实现方式

知识蒸馏 - 基于KL散度的知识蒸馏 HelloWorld 示例 采用PyTorch 内置函数F.kl_div的实现方式 flyfish kl_div 是 Kullback-Leibler Divergence的英文缩写。 其中,KL 对应提出该概念的两位学者(Kullback 和 Leibler)的姓氏首字母“div”是 div…

C语言基础_补充知识、数据类型转换、选择结构

0、补充知识: 原码、反码、补码的知识: 计算机中原码转补码,正数不变,负数是符号位不变,其余各位取反码加一。负数的补码转原码应该是补码减一然后再取反,为什么负数的补码转原码是补码取反然后再加一&…

ubuntu自动重启BUG排查指南

当 Ubuntu 系统意外重启时,排查原因需要从系统日志、硬件状态和定时任务等多个方面入手。 示例:通过日志检查重启原因 last -x | head | tac 此命令显示最近的关机和重启记录。如果记录中包含 shutdown 或 crash,则可能是人为操作或系统故障导…

2. JS 有哪些数据类型

总结 基础类型(7 种):number, string, boolean, null, undefined, symbol, bigint引用类型(对象及其子类):object, array, function, date, regexp, map, set 等 判断方式推荐: 基础类型&#x…

pipeline方法关系抽取--课堂笔记

Pipeline方法课堂笔记 一、Pipeline方法原理 pipeline方法是指在实体识别已经完成的基础上再进行实体之间关系的抽取. pipeline方法流程: 先对输入的句子进行实体抽取,将识别出的实体分别组合;然后再进行关系分类. 注意:这两个子过…

linux系统离线环境安装clickhouse客户端

1、下载离线安装包: 方式1:网站直接下载 链接:https://packagecloud.io/altinity/clickhouse 注意要下载同一版本的四个包 方式2:夸克网盘分享 链接:https://pan.quark.cn/s/7e77e6a1bc5f 2、将本地下载的安装包上传…

GPT-5的诞生之痛:AI帝国的现实危机

目录 前言 一、“俄里翁”的陨落:一场梦碎的代际飞跃 二、扎克伯格的“抄家式”突袭 三、天才的诅咒:当AI聪明到无法与我们对话 四、烧钱的无底洞与微软的影子 结语:AI帝国的黄昏,还是黎明前的黑暗? &#x1f3a…

探索设计模式的宝库:Java-Design-Patterns

在软件开发领域,设计模式是解决常见问题的经典方案,它们如同建筑师的蓝图,为开发者提供了经过验证的最佳实践。今天我要向大家介绍一个GitHub上的明星项目——java-design-patterns,这是一个全面、实用且持续更新的设计模式宝藏项…

JavaScript中的作用域、闭包、定时器 由浅入深

1. JavaScript中的作用域是什么? 作用域(Scope)是程序中定义变量的区域,它决定了变量的可访问性(可见性)。在JavaScript中,作用域主要分为三种:全局作用域、函数作用域和块级作用域&…

仓库管理系统-11-前端之头部区域Header的用户登录和退出功能

文章目录 1 登录功能 1.1 登录页面(Login.vue) 1.1.1 页面布局 1.1.2 初始化数据 1.1.3 confirm方法 1.1.4 UserController.java(登录接口) 1.1.5 Login.vue 1.2 登录页面的路由 1.2.1 创建路由文件(router/index.js) 1.2.2 注册路由器(main.js) 1.2.3 路由视图(App.vue) 2 退出…

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…

飞算科技:以自主创新引领数字科技浪潮,飞算JavaAI赋能产业智能化升级

技术创新已成为企业突破瓶颈、实现跨越式发展的核心驱动力。作为国家级高新技术企业,飞算数智科技(深圳)有限公司(简称“飞算科技”)凭借其深厚的互联网科技、大数据与人工智能技术积淀,以及在民生产业、中…

51单片机按键复位电路电压随着电容放电升高的分析

一、引言在单片机系统中,复位电路是一个至关重要的组成部分,它确保了单片机在特定情况下能够恢复到初始状态,从而避免程序运行错误或系统崩溃。对于51单片机而言,按键复位电路是一种常用的复位方式,它通过手动按下复位…

JVM学习日记(十五)Day15——性能监控与调优(二)

好了我们这一篇继续来说命令行监控指令,上一篇说了4个比较重要的指令,其中用的比较多的也就是jstat和jmap了。 jhat:堆转储分析工具 他是JDK自带的分析工具,分析我们上一篇说的jmap转存的内存快照,​​内置了一个微型…

Docker国内镜像列表

Docker 镜像源列表(8月3日更新-长期&免费)_docker国内镜像源-CSDN博客

Orange AI 管理平台单体版安装教程(Docker Compose 部署)

Orange AI 管理平台单体版安装教程(Docker Compose 部署) 本文介绍如何通过 Docker Compose 快速安装 Orange AI 管理平台单体版,适用于本地开发和测试环境。步骤简单,适合初学者和有一定运维经验的用户。 一、环境准备 已安装 …

PHP的魔术方法

一、介绍 ‌PHP魔术方法是以双下划线__开头的一组特殊方法,用于在对象生命周期、属性访问、方法调用等场景中实现自动化操作。‌简化面向对象编程。 二、17个现有的魔术方法 (一)、对象生命周期相关 1、__construct() 类的构造函数方法&a…

vue2实现类似chatgpt和deepseek的AI对话流打字机效果,实现多模型同时对话

实现多模型同时对话功能特点:1、抽离对话框成单独组件ChatBox.vue,在新增模型对比窗口时可重复利用2、通过sse与后台实时数据流,通过定时器实现打字效果3、适应深度思考内容输出,可点击展开与闭合4、可配置模型参数,本…

电脑上不了网怎么办?【图文详解】wifi有网络但是电脑连不上网?网络设置

一、问题背景 你有没有遇到过这种情况:电脑右下角的网络图标明明显示连接正常,可打开浏览器就是加载不出网页,聊天软件也刷不出新消息? 这种 "网络已连接但无法上网" 的问题特别常见,既不是没插网线&#xf…