HTTP_day03

news2024/12/23 15:21:11

当键入网址后,到网页显示,其间发生了什么(下)

掘金地址
键入 localhost ,通过 Wireshark 抓包分析,抓包结果如下图所示

抓包结果

image.png
我们知道 HTTP 协议是运行在 TCP/IP 基础 之上的。 浏览器 通过 HTTP 接收和发送数据,要通过 TCP 建立 可靠连接。

抓包分析

对开始的三个包进行分析 , web 服务器的端口号是 80 ,从 浏览器的端口号 56996
80按照 TCP 协议 , 要进行三次握手与Web 服务器进行连接。从抓包结果来看,浏览器到服务器经过三个包 SYN``````SYN/ACK``````ACK之后,浏览器与web服务器建立连接。 出现 56997 是因为长连接的特性。

建立连接之后,浏览器按照HTTP协议制定的规范通过 TCP 协议发送了一个GET HTTP/1.1 的请求报文。之后,80端口—>56996 端口 发送了一个应答ACK(确认已经收到了这个请求报文)这个 ACK在 TCP 层面,所以 浏览器所在的层面 http协议是看不到的。

之后 WEB服务器会根据 HTTP协议 去解析这个请求报文,明白浏览器此时想要进行什么操作。

例如这里 是要获取一个HTML 页面 ,web 服务器 会从 磁盘里 将这个 html 页面读取出来,再拼成 HTTP 报文的格式,相应给 浏览器。返回 HTTP/1.1 200 OK的报文。之后 浏览器 再发送一个ACK应答给服务器,向服务器确认,响应报文收到了。

至此,浏览器收到了响应数据,也就是解析报文。这里服务器返回了一个 html 文件,浏览器就会调用排版引擎处理这个响应数据,展示出相应的页面。

image.png

之后 浏览器 会自动请求 favicoon.ico (网站logo)的资源文件,我们没有设置这个图标 , 返回一个 404 Not Found。

由于 长连接 的特性 这里的四次挥手 并没有发生
image.png

小结 浏览器 HTTP 请求过程

  • 从地址栏 输入获得 服务器的 IP地址 和端口号 (通常我们使用域名)
  • TCP 三次握手 与 服务器建立连接
  • 浏览器发送报文给 服务器 ,告诉服务器他想要干啥
  • 服务器收到报文后处理该请求,拼接好报文后返回给浏览器。
  • 浏览器解析响应数据。

HTTP 报文结构 (HTTP 协议的核心部分)

HTTP 协议在规范文档里详细定义了报文的格式,规定了组成部分,解析规则,还有处理策略,所以可以在 TCP/IP 层之上实现更灵活丰富的功能,例如连接控制,缓存管理、数据编码、内容协商等等

HTTP 协议 是一个 纯文本 的协议,所以头数据都是ASCII 码的文本,可以很容易地用肉眼阅读,不用借助程序解析也能够看懂。

HTTP 协议规定报文必须有 header,但可以没有 body,而且在 header 之后必须要有一个“空行”,也就是“CRLF”。

HTTP 请求报文结构图 即 解释

image.png

解释 :

  • 起始行: 表示 请求或响应的基本信息。
  • 头部 : key-value 的请示更详细的说明报文
  • 空行 : 在 头部 和消息实体之间 规定必须要有一个空行(CRLF “\r\n”)
  • 实体 : 实际传输的数据,可以是纯文本,图片,视频等二进制的数据。

抓包 HTTP 请求报文结构示例

image.png

这里的 请求头正确来讲 应该是 消息头

请求行 解释

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HoyXLsnc-1673014149574)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2a7ca441f87d405ba678125ae0f78ac3~tplv-k3u1fbpfcp-watermark.image?)]

三部分组成 :

  • 请求方法 (Method): GET/POST/PUT/DELETE ····· , 表示对资源进行的操作
  • 请求目标(URI) : 一个 URI , 标记请求方法要操作的资源 ;
  • 版本号 (Version) : 请求所使用的 HTTP 协议版本。

请求行结构 :

image.png

三部分连接起来就是(结合上面例子解释) : 浏览器使用 GET方法请求 服务器/ 这个目录下的文件,使用的是 HTTP/1.1版本号 请求,请服务器也用 HTTP/1.1恢复我的请求。

状态行(响应过来的报文的header)解释

抓包结构示意

image.png

状态行 : 服务器响应的状态

三部分组成 :

  • 请求版本号 : 响应所使用的 HTTP 协议版本。
  • 状态码 : 一个三位数 , 表示处理的结果。在 HTTP_DAY01 说明了各种常见状态码的解释。
  • 原因 : 数字状态码的补充说明,翻译前面的数字,帮助我们理解状态码的含义。

三部分连接起来就是(结合上面例子解释) : 这个请求我收到了,使用的HTTP协议号是 HTTP/1.1 , 状态码是 304 ,自你上次访问以来,你所请求的资源在我的缓存区并未修改,你到本地所保存的网页里找吧☺。

头部字段

头部字段 加上 请求行/状态行 就形成了 请求头/响应头

抓包示例

image.png

特点 :

  • 由 key - value 组成 最后用 CRLF 结束
  • 非常灵活,可以任意添加自定义头,可扩展性强。

注意点 :

  • key 不区分大小写
  • key 写的时候 不能用 _或者 space字符
  • key 后必须紧跟 :,不能有 space(如果出现 space, 会出现400 Bad Request),而 value 前的 space可以任意多
  • key 顺序无意义
  • key 理论来讲不能重复

HTTP 头部重复了,会怎么样?

这种情况在规范内尚未明确,根据浏览器内部处理逻辑的不同,结果可能并不一致。
有些浏览器会优先处理第一次出现的首部字段,而有的浏览器则会优先处理最后出现的首部字段。

HTTP 常用的 key
  • 通用 key : 请求头 、 响应头 都可以有。
  • 请求 key : 只能出现在请求头中,对请求信息的补充。
  • 响应 key : 只能出现在响应头中,对响应数据的补充。
  • 实体 key :专门描述 body 的 额外信息。

HTTP 对报文的解析,实际上就是对头字段进行处理。

最基本的头部字段

  • HOST : 请求key 必须出现,没有他 就会 bad request. 相当于 路由重定向。
  • User-Agent : 请求key,服务器可以根据他返回最合适的页面。但由于历史原因,变得毫无意义。可以实现简单的返爬虫策略。

image.png

  • Date : 通用key, 但通常只出现在 响应头中,表示HTTP 报文创建的时间,客户端通过使用这个时间,搭配其他头部字段,决定缓存策略。
  • Server : 响应 key ,告诉客户端 是谁在给你提供web 服务。 不必要出现 , 可能导致安全隐患,通常 不要这个字段 , 或者 给他一个 垃圾信息 。
  • Content-Length : 通用key,body的长度(请求头或者响应头CRLF后面数据的长度),服务器看到这个字段,知道数据长度,可以直接接收,如果没有,就是不定长, 就要 开启 chunked 方式分段传输。

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

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

相关文章

怎么才能写出好的代码

前言这是一篇如何写好代码的水文,因为最近输出了不少干货,但是大家点赞太少,我越来越没有激情了,那就放放水啦。所以如果大家觉得我的分享对你有用,动动发财小手,赞起来吧!虽然是一篇水文&#…

谷粒学苑项目-第一章数据库设计与项目结构-1.1

一、数据库设计 1、数据库 guli2、数据表 CREATE TABLE edu_teacher (id char(19) NOT NULL COMMENT 讲师ID,name varchar(20) NOT NULL COMMENT 讲师姓名,intro varchar(500) NOT NULL DEFAULT COMMENT 讲师简介,career varchar(500) DEFAULT NULL COMMENT 讲师资历,一句话说…

Java--经典九道练习题

文章内容 一、用户登录 二、遍历字符串 三、统计字符个数 四、拼接字符串 五、字符串反转 六、金额转换(较难) 七、手机号屏蔽 八、身份证号码信息查看 九、游戏骂人敏感词替换 一、用户登录 一直正确的用户名和密码,请用程序实现模…

获取当前进程的启动程序

本文迁移自本人网易博客,写于2012年3月23日,获取当前进程的启动程序 - lysygyy的日志 - 网易博客 (163.com)1.获取当前进程的启动程序CString sFile;GetModuleFileName(NULL, sFile.GetBuffer(), 255);2.获取文件类型3.Autocad文档交互时,使用…

Camera | 1.Camera基础知识

一口君最近在玩瑞芯微的板子,之前写了几篇基于瑞芯微的文章,大家可以学习一下。 《瑞芯微rk356x板子快速上手》 《Linux驱动|rtc-hym8563移植笔记》 《Linux驱动 | Linux内核 RTC时间架构》 《瑞芯微 | 摄像头ov13850移植笔记》 《rk3568 | 瑞芯微平…

图的生成树与生成森林

文章目录连通图与连通分量强连通图与强连通分量图的连通性判断生成树深度优先生成树邻接表邻接矩阵广度优先生成树邻接表邻接矩阵生成森林获取边弧的权值源代码连通图与连通分量 在无向图中, 若从顶点v到顶点w有路径存在, 则称v和w是连通的. 若图G中任意两个顶点都是连通的, 则…

动态规划--矩阵链相乘问题

明确原始问题A[1:n]:计算矩阵链 所需的最小乘法次数。 (1)是否满足最优子结构,问题的解是否包含子问题的优化解? 若计算A[1:n]的优化顺序在k处断开矩阵链,即A[1:n]A[1:k]A[k1:n],则在A[1:n]的优化顺序中&a…

ReFactor GNN:从消息传递角度重新审视FMs

分享嘉宾 | 陈艺虹 文稿整理 | William Knowledge Graph Completion(KGC) 知识图谱一般会有多个节点,包括性别、国家等各种各样的节点(也可理解为实体),节点之间会有不同的关系,可以通过其他的一些节点预测出当前节点的其他信息。恢复这些信…

2023/1/6 Vue学习笔记-1

尝试 Vue.js 最简单的方法是使用 Hello World 例子。你可以在浏览器新标签页中打开它&#xff0c;跟着例子学习一些基础用法。或者你也可以创建一个 .html 文件&#xff0c;然后通过如下方式引入 Vue&#xff1a; <!-- 开发环境版本&#xff0c;包含了有帮助的命令行警告 -…

设计模式——建造者模式

文章目录模式理解基本概念使用示例建造者模式延展模式理解 建造者模式&#xff08;Builder Pattern&#xff09;&#xff1a;建造者模式是一种对象创建型模式。将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。这句话理解起来太抽象了&…

B. Dima and a Bad XOR(构造 + 异或性质)

Problem - 1151B - Codeforces 来自Kremland的学生Dima有一个大小为nm的非负整数矩阵a。 他希望从矩阵的每一行中选择一个整数&#xff0c;以便所选整数的按位互斥或严格大于0。帮助他! 形式上&#xff0c;他想选择一个整数序列c1,c2&#xff0c;…&#xff0c;cn(1≤cj≤m)&am…

Integer包装类详解(java)

文章目录&#x1f4d6;前言&#xff1a;&#x1f380;包装类概念&#xff1a;&#x1f380;包装类分类&#xff1a;&#x1f380;包装类integer介绍&#xff1a;&#x1f387;自动装箱和自动拆箱问题【⚠注意面试常考点】&#x1f387;Integer常用方法&#xff1a;&#x1f4d6…

2023真无线蓝牙耳机推荐:高性价比真无线蓝牙耳机各价位蓝牙耳机推荐!

2023年了&#xff0c;蓝牙耳机赛道依然很卷&#xff01;性价比是反映物品可买程度的一种量化的计量方式。现如今&#xff0c;蓝牙耳机市场上主打高性价比的不在少数&#xff0c;而高性价比的东西往往更能精准抓住用户“痛点”&#xff0c;从而受到了不少用户的欢迎。 既然高性…

面试20分钟就完事了,问的实在是太......

干了两年外包&#xff0c;本来想出来正儿八经找个互联网公司上班&#xff0c;没想到算法死在另一家厂子。 自从加入这家外包公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到11月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资…

Spring Boot整合Junit

系列文章目录 Spring Boot[概述、功能、快速入门]_心态还需努力呀的博客-CSDN博客 Spring Boot读取配置文件内容的三种方式_心态还需努力呀的博客-CSDN博客 该系列文章持续更新中~ 目录 系列文章目录 前言 一、搭建SpringBoot工程 二、引入starter-test起步依赖 三、编…

2022年全国研究生数学建模竞赛华为杯F题COVID-19疫情期间生活物资的科学管理问题求解全过程文档及程序

2022年全国研究生数学建模竞赛华为杯 F题 COVID-19疫情期间生活物资的科学管理问题 原题再现&#xff1a; 一、背景介绍   进入2022年以来全国范围内陆续出现了多次较大规模疫情爆发事件[1-2]。在大规模疫情爆发期间由于我国采用封闭式管理方式来实现疫情的快速清零&#x…

Vue组件之间的通信(组件之间的数据传递)

一、Vue组件之间的关系 父子关系&#xff1a;A组件和B组件、B组件和C组件、B组件和D组件​ 兄弟关系&#xff1a;C组件和D组件​ 隔代关系&#xff1a;A组件和C组件、A组件和D组件 二、父组件向子组件传递数据 通过props方式向子组件传递数据&#xff08;在子组件中添加props属…

为什么选型低代码平台时,需要注重私有化部署能力?

编者按&#xff1a;低代码平台&#xff0c;目前分为私有化部署和公有化部署&#xff0c;企业为什么倾向于选择私有化部署的低代码平台&#xff1f;本文从私有化部署的概念出发&#xff0c;分析了私有化部署的优势&#xff0c;并进一步介绍了支持私有化部署的老牌低代码平台。关…

工控安全-使用Metasploit攻击Modbus设备

文章目录实验内容环境介绍实验开始开启Modbus从站主机和从站服务利用Metasploit工具扫描Modbus从站中的ID访问从站2的寄存器数据修改从站4线圈值可选择的action实验内容 利用Metasploit工具针对Modbus协议进行攻击&#xff0c;读取Modbus从站寄存器数值以及修改Modbus从站寄存…

应届生学习Java八个月,offer年薪28W,这一年我经历了什么?

自我介绍 首页和大家介绍一下我&#xff0c;我叫 阿杆&#xff08;笔名及游戏名&#x1f923;&#xff09;&#xff0c;19级本科在读&#xff0c;双非院校&#xff0c;主修软件工程&#xff0c;学习方向是后端开发&#xff0c;主要语言Java、Python&#xff0c;今年秋招拿到了…