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

【网络原理】深入理解关于HTTP协议和报文的格式以及重要的属性

前言

🌟🌟本期讲解关于HTTP协议的重要的机制~~~

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

🔥 你的点赞就是小编不断更新的最大动力                                       

🎆那么废话不多说直接开整吧~~

 

目录

​编辑

1.HTTP协议

1.1HTTP介绍

1.2HTTP的工作

1.3HTTP的抓包

1.4HTTP的报文

2.HTTP 请求

2.1认识URL

2.2认识URL encode

2.3认识方法(method)

 2.4认识请求 "报头" (header)

1.HOST

2.Content-Length

3.Content-type

4.User-Agent (简称 UA)

5.Referer

 6.cookie

 3.总结


 

1.HTTP协议

1.1HTTP介绍

http:全称超文本传输协议,是在应用层使用广泛的一种协议;

具体的关于http的发展时间如下:

http最早出现是在1991年,⽬前已经发展为最主流使⽤的⼀种应⽤层协议;

最近版本的HTTP:后面出现的HTTP2.0与HTTP3.0引入了更多的特性: 

1.提高了传输的效率

2.提高了传输的安全性

 并且在HTTP3.0之前都是使用的传输层协议就是TCP,我们知道TCP具有可靠性,但是效率比较低,所以在HTTP3.0时传输层使用就是UDP,并实现了一些列复杂的机制,实现可靠性~~~

问题1:什么是超文本传输协议?

我们知道文本就是字符串,就是能在utf8码表上找到合法的字符,但是超文本不仅仅是字符串而且还包括了图片,特殊的格式; 

1.2HTTP的工作

用处:HTTP主要的使用场景就是浏览器网站对于服务器之间的数据传输;

补充:这里的网页是由HTML来进行构建的,但是一个好的网页还需要CSS与Javascript来进行公共的实现(前段的三剑客) 

解释:当我们使用浏览器对一个网页进行访问的时候,浏览器就会给服务器发起一个http请求,然后服务器进行计算后通过http响应返回~~~

注意: HTTP的交互过程中,是非常典型的“一问一答”过程,但是在网站的开发中这也是够用了,并且在服务器自动给浏览器发送消息,应用层还提供了websocket搭配http来进行使用

1.3HTTP的抓包

抓包工具:这里就涉及到一个重要的工具“抓包工具”,这里抓http的报文所以使用的就是fiddler

问题2:什么是抓包工具?

抓包工具本质上是一个代理程序,能够获取到网络上传输的数据,他是工作在应用层上面的,这里可以理解为一个中间商,对于浏览器对于服务器数据的传输,他是十分清楚的; 

大概的流程就是如下:

问题3:如何下载fiddler? 

具体步骤如下:

1.先搜索fiddler的官网,注意不要点击到盗版的了:

2.然后再点击进入页面后,然后点击经典版本的fiddler:

 3.点击尝试下载按键:

 4.安装完成后,进入页面点击tool的option:

5.最后点击http中所有的选项进行勾选:

 最后如果跳出安全许可,这个一定要点击yes,一定一定要点击yes~~~

1.4HTTP的报文

打开一个网站,浏览器和这个服务器之间的http交互不是只有一次的,是很多次的第一次交互就是拿到这个页面的html,还有css与js,并且html被加载后还会触发http的请求,然后又是js等又触发http~~~

所以我们直接进行一次抓包,我们进行百度的抓包进行举例:

可以看到此时蓝色部分就是html,他往往是一个网站的入口;

接下来我们点击raw然后点击用记事本打开即可看到其内部http的报文结构:

在右下角点击用记事本打开: 

 

最后可以看到此时的报文结构就是如下所示的:

那么这个只是一小部分,所以接下来的将进行具体的讲解;

1.HTTP的请求结构

1.首行:这里包含了三个部分,如下图示所示:

GET https://www.baidu.com/ HTTP/1.1

GET:这里表示就是方法;

中间部分:这里即是URL;

HTTP/1.1:这里就是HTTP的版本号

2.请求头:请求的属性, 冒号分割的键值对;每组属性之间使⽤\n分隔;遇到空⾏表⽰Header部分结束

Host: www.baidu.com
Connection: keep-alive
sec-ch-ua: "Chromium";v="130", "Microsoft Edge";v="130", "Not?A_Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"

 这里只截取了一小部分

3.空行:这里表示的就是请求头的结束,最为一个标记

4.正文(body):http的载荷部分 Body允许为空字符串. 如果Body存在, 则在Header中会有⼀个 Content-Length属性来标识Body的⻓度;

2.HTTP的响应结构

1.首行 :这里也是包含了三个部分,如下:

HTTP/1.1 200 OK

HTTP/1.1:代表的就是版本号

200:状态码

OK:状态码的描述

2.响应头:响应的属性,这里和上面的请求是一致的 

Connection: keep-alive
Content-Security-Policy: frame-ancestors 'self' https://chat.baidu.com http://mirror-chat.baidu.com https://fj-chat.baidu.com https://hba-chat.baidu.com https://hbe-chat.baidu.com https://njjs-chat.baidu.com https://nj-chat.baidu.com https://hna-chat.baidu.com https://hnb-chat.baidu.com http://debug.baidu-int.com;
Content-Type: text/html; charset=utf-8
Date: Fri, 01 Nov 2024 13:29:43 GMT

 这里小编只截取了一小部分;

3.空行:这里也是进行响应头的结束标记

4.响应正文: 这里就是载荷,并且这里的响应载荷就是html

具体如下:

<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" 

 问题4:为啥http报文存在空格这种结构?

1.HTTP 协议并没有规定报头部分的键值对有多少个. 空⾏就相当于是 "报头的结束标记" 

2.HTTP 在传输层依赖 TCP 协议, TCP 是⾯向字节流的. 如果没有这个空⾏, 就会出现 "粘包问题"

这里的使用TCP协议是在HTTP3.0之前哦,现在主流不是这个~~~

2.HTTP 请求

2.1认识URL

URL基本格式:平时我们俗称的 "⽹址" 其实就是说的 URL (Uniform Resource Locator 统⼀资源定位符)(即描述一个网络上的资源的位置

1.简单URL

我们最常见的最简单的URL就是:https://www.baidu.com;分解一下就是:协议名称+域名

2.基本的URL

就拿我们一个csdn的网址为例:

https://mp.csdn.net/mp_blog/creation/editor?spm=1010.2135.3001.4503

内容解释: 

此时就明显多了很多的内容,问号之前就是一个路径(带有层次结构的路径),后面的就是查询字符串,这里的意思是编写的程序员知道的,我们不知道~~

3.完整的URL

具体样式如下:

小编就讲解几个比较重要的;

1.服务器地址与服务器端口号:

这里代表就是域名或者IP地址,后面带有的端口号表示访问服务器那个端口

2.查询字符串:

就是代表的是对于请求进行补充,键值对的格式,键和值用“=”,键值对用&符号进行分割;

3.登录信息:

现在都是通过单独的登录页面进行身份的验证 

4.片段标识符:

表示当前某页的某个部分,不同片段标识可以完成页面内的跳转

总结:这个URL就是代表的一个在网络上的资源位置,通过IP地址知道服务器在哪里,端口号就知道是哪一个程序,文件路径就知道访问的那个资源;

2.2认识URL encode

1.问题的提出

我们在上面的介绍中了解到查询字符串(query string)是自定义的键值对,那么在URL本身中有些特殊符号具有特定的意义,如果当query string包含了与URL特殊的符号,此时就会导致浏览器或者服务器解析失败

那么此时对这个特殊符号进行转义,这个过程就叫做URL encode

2.解析过程

这里的解析过程就是将特殊符号的ascii码值拿出来,进行十六进制的转化,最后在前面加上“%”;

例如:这里的++就是解析后16进制为2B,2B然后再这两个字符之前加上“%”就实现了转义~~~

2.3认识方法(method)

且看下面的一张图:

这里主要使用的就是前面两个就是我们经常使用的,但是这里的GET与POST的方法是可以相互替换使用的,这上面的表只是一厢情愿,我们一般不会按照这里说明进行编写;

GET:GET 是最常⽤的 HTTP ⽅法. 常⽤于获取服务器上的某个资源. 在浏览器中直接输⼊ URL, 此时浏览器就会发送出⼀个 GET 请求;
一般情况下在登录的时候我们可以进行抓包;

我们可以看到此时就是一个GET;

当此时还有POST的一个方法:

 

一般来说:GET是没有body的,然后POST是存在body的,GET通常会把补充信息存在查询字符串里,然后POST是存在body里,当然这只是常见的情况; 

 在POST的body中我们常使用就是base64进行编码,通过四个字节来表示三个字节,主要是为了去掉原始是数据的二进制数据;(有些场合只适用于文本)

可以看到这里body的base64编码:

{"username":"18582914619","password":"QTQ0s88XKlMuE7C0/s30OQ==","uuid":"a142cb0d852f4d53ba570922b34e7dc3","status":0}

GET与POST的区别:

在本质上,这两个其实并没有区别,但是在习惯上这里还是存在区别的

1、GET通常把数据放在URL的查询字符串里,POST主要把数据放在body里;

2、GET通常表示的是拿到数据,而POST主要表示的是传输数据给服务器;

3、在标准文档中GET是被要求设计成幂等的,而POST无这个要求;

4、GET可以被浏览器收藏但是POST不可以

所谓的幂等:就是输入的内容是一定的,多次输出的结果不是一定的,那么就叫做不是幂等的相反多次输出的结果是一定的,那么就叫做幂等的;

 2.4认识请求 "报头" (header)

1.HOST

表示服务器的IP地址以及端口;

2.Content-Length

表示body中的数据的长度

由于HTTP底层也是基于tcp进行,连续传输多个http数据报,应用程序读这些数据的时候就要明确包与包之间的分界;

3.Content-type

表示body中数据的格式;

可以看到此时这里的格式就是json的格式,即描述body中数据的格式;

除此之外还有xml的格式,当然这里还有x-www-form-urlencoded,即from表单,表示的就是通过HTML中的from标签表示出来一种格式;

补充:由于服务器与浏览器之间的交互是非常低效的,所以会把固定不变的内容缓存到硬盘上,那后序的读取直接从硬盘上读取,提升效率;所以这里抓包的时候有些就是灰色的;

4.User-Agent (简称 UA)

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0

可以看到这里主要描述了,操作系统的信息,以及浏览器的信息;

所以UA:主要描述了用户使用的设备信息;

解决问题:

若存在开发中的新特性,存在新老设备的兼容问题,那么使用UA就可以根据这里的用户使用的设备信息,来决定设否使用新的特性;例如我们现在的pc端和手机端,这里的UA就保存这里的信息,来判断用户设备是什么来决定这里的展示页面是横屏还是竖屏的;

后来有了响应式的布局,那么此时就是通过css3的媒体查询来进行当前用户的屏幕尺寸,来进行应用对应的样式; 

5.Referer

所谓的referer主要是描述了当前的页面是从哪里来的;

Referer: https://cn.bing.com/search?q=%E6%AF%94%E7%89%B9%E6%95%99%E5%8A%A1%E7%B3%BB%E7%BB%9F&gs_lcrp=EgRlZGdlKgcIARBFGMIDMgcIABBFGMIDMgcIARBFGMIDMgcIAhBFGMIDMgcIAxBFGMIDMgcIBBBFGMIDMgcIBRBFGMIDMgcIBhBFGMIDMgcIBxBFGMID0gEKNTk2NTM0ajBqMagCCLACAQ&FORM=ANNTA1&PC=CNNDDB 

 6.cookie

 本质上就是:在浏览器上本地持久化存储数据的机制,一般用于访问服务的身份标识;

来源:我们浏览器是可以访问我们硬盘文件,但是网页不行,所以浏览器给网页提供了API来有限度的存储一定的数据,不能随意访问文件系统;

所以就有cookie这样的存储系统,还有Lockstorage和indexDB,但是cookie仍然是主流;

过程:HTTP中的cookie字段就会把本地存储的信息发送给服务器1,然后服务器就会就会通过HTTP中set-cookie字段给浏览器反馈保存哪些数据;

重要的结论:

cookie从哪里来:即服务器返回给浏览器的,每次登录成功后

cookie去哪里:cookie会存储在浏览器本地的磁盘上,每次访问服务器都会带上cookie

cookie的存储格式:这里的数据是以键值对的形式进行存储的,具体内容是程序员自定义的

cookie的作用:作为身份标识,每次访问服务器带上cookie就是告诉服务器自己是谁

cookie浏览器中如何进行存储:即通过访问的不同域名的维度进行存储,并且是硬盘本地保存

 3.总结

本期由于篇幅太长,http的相关的内容还没有完全介绍,主要是讲解了HTTP的报文简单介绍,以及UPL的认识,URL encode,以及比较常见的方法和比较重要的报头结构中的一些重要的概念;小编会在下期进行剩下的HTTP的知识讲解,以及HTTPS的开头;

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                 😊😊  期待你的关注~~~


http://www.kler.cn/a/381535.html

相关文章:

  • 架构系列---高并发
  • [vulnhub]DC: 1
  • 流畅!HTMLCSS打造网格方块加载动画
  • 保研考研机试攻略:python笔记(2)
  • 241029 网鼎杯青龙组 Crypto2
  • javascript-Web APLs (三)
  • web信息收集
  • FlaskFastAPIgunicornunicorn并发调用
  • 提高交换网络可靠性之链路聚合
  • RK3568开发板静态IP地址配置
  • oracle常用查询sql
  • EtherCAT转ModbusTCP相关技术
  • uniapp中echarts的正确集成方式:Vue2与Vue3组合式API双重视角
  • VMware虚拟机-Ubuntu设置共享文件夹
  • 若Git子模块的远端地址发生了变化本地应该怎么调整
  • OpenAI大事记;GPT到ChatGPT参数量进化
  • 第三十章 章节练习商品列表组件封装
  • 面试题分享11月5日
  • 034_Structural_Transient_In_Matlab结构动力学问题求解
  • Spring学习笔记_25——@DeclareParents
  • 【设计模式系列】建造者模式(十)
  • JAVA基础:单元测试;注解;枚举;网络编程 (学习笔记)
  • @Async注解提升Spring Boot项目中API接口并发能力
  • ElasticSearch备考 -- Manage the index lifecycle (ILM)
  • 微信小程序 高校教材征订系统
  • [C++]——哈希(附源码)