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

HTTP 协议格式大揭秘:Fiddler 助阵,网络交互全掌握!

HTTP介绍

HTTP是超文本传输协议(Hypertext Transfer Protocol)的缩写,是一种应用非常广泛的应用层协议

我们平时打开一个网站,就是通过HTTP协议来传输数据的.

HTTP不仅能传输文本,还能传输图片,视频,音频.......

当我们在浏览器中输入小米的"URL"(即网址),浏览器就给小米的服务器发送了一个http请求,小米的服务器返回了一个http响应, 这个响应结果被浏览器解析了以后,就展示成了我们看到的页面的内容(这个过程中浏览器就会给小米服务器发送多个HTTP请求, 服务器也会相应的返回请求,这些相应里面就包含了HTML,CSS,JacaScript,图像,字体等信息)

可以看到页面上方多出来了个 "https://" ,(HTTPS是HTTP协议的安全版本,主要目的是保护用户数据在网络传输过程中的安全性,防止数据被窃取、篡改或中间人攻击。(可以理解为HTTPS是HTTP的plus版本)).

理解-应用层协议

例一

假设你在一个购物网站(比如淘宝)上购物,这其中就涉及到应用层协议。

你在手机或电脑上打开淘宝应用(就相当于一个客户端),然后你搜索一个商品,比如 “运动鞋”。当你点击搜索按钮时,你的客户端就会按照一种事先约定好的规则(这就是应用层协议,比如 HTTP 协议)来构建一个请求。这个请求有点像你写了一张纸条给商店的店员,纸条上写着 “我想要查找运动鞋相关的商品”。

然后这个请求通过网络传输到淘宝的服务器上。服务器收到这个按照协议发来的请求后,就知道你想要搜索运动鞋。服务器根据自己的数据库查找相关商品的信息,之后它又按照协议(HTTP 协议)把搜索到的运动鞋的商品信息(比如图片、价格、描述等)构建成一个响应,就像店员把你要的商品清单写在一张纸上。

最后,这个响应再通过网络传输回你的客户端,你的淘宝应用接收到这个按照协议传输回来的响应后,就能够正确地解析这些信息,然后把运动鞋的商品列表展示在你的屏幕上。

在这个过程中,如果没有 HTTP 这种应用层协议规定好客户端和服务器之间如何构建请求、传输数据、解析响应等规则的话,你的客户端和淘宝服务器之间就无法准确地进行这样的交互,就像你和店员没有共同的语言(交流规则),你就没办法顺利买到东西一样。

例二

就像世界上不同国家的人如果没有统一的语言(比如英语作为一种国际交流语言),就很难进行交流一样。不同的应用程序如果没有应用层协议,就不知道如何互相发送和接收信息。应用层协议为所有的应用程序提供了一个统一的标准,这样不管是哪个公司开发的浏览器、邮件客户端或者文件传输软件,只要遵循相应的应用层协议,就能够在网络上进行有效的信息传递。

理解HTTP协议工作过程

HTTP协议,是一种典型的"一问一答"式协议;

当我们在浏览器中输⼊⼀个 "⽹址", 此时浏览器就会给对应的服务器发送⼀个 HTTP 请求. 对⽅服务器 收到这个请求之后, 经过计算处理, 就会返回⼀个 HTTP 响应.
事实上, 当我们访问⼀个⽹站的时候, 可能涉及不⽌⼀次的 HTTP 请求/响应 的交互过程.

我们可以通过浏览器的开发者工具观察到这个过程;

打开浏览器    按 F12 键进入开发者工具,切换到NetWork标签页,刷新即可看到下图的效果,每条记录都是HTTP响应

HTTP协议格式

借助抓包工具,可以观察到 HTTP请求/响应 的具体情况(抓包:获取通过网卡的数据并解析显示出来)

Fiddler抓包

这里我们使用Fiddler,官网链接如下:

Web Debugging Proxy and Troubleshooting Tools|Fiddler (telerik.com)icon-default.png?t=O83Ahttps://www.telerik.com/fiddler

1.首先,要确保电脑中退出了其他的代理类软件(vpn/浏览器插件)

2.开启Fiddler的HTTPS功能

点击 Tools ,然后点击Options...

点击HTTPS, 然后把没勾选的都勾选上,最后点击OK

首次使用会弹出一个框,点击 "是" 就可以了

只要启动Fiddler,抓包工作就开始了

左侧是抓到的http数据报的列表

点击其中某一项,右侧就会显示出请求和响应的基本情况

右上方,是请求的详情

右下方,是相应的详情(下方响应乱码是二进制,原本响应也是文本,此处二进制是压缩后的)

点击上方的 Raw 标签,就能显示出http请求和响应的原始模样

HTTP协议格式

HTTP请求:

  • 首行: 方法 + URL + 版本
  • 请求头:由一系列的键值对构成,键和值之间使用 ": " 分割; 每组属性之间使用\n分隔; 遇到空行表示结束
  • 空行: 请求头结束标记
  • 正文(body):有的请求有body,有的没有(比如,GET往往不带body,POST往往带body)

HTTP响应:

  • 首行: 版本号 + 状态码 + 状态码解释
  • 响应头: 每一行是一个键值对,不确定几行,以空行结尾,键和值之间用 ": " 分割
  • 空行:响应头结束标记
  • 正文(body) : 对于响应来说,正文通常是HTML/CSS/JavaScript/JSON/图片/英文/字体

为什么 HTTP 报文中要存在 "空行" ?

        因为HTTP协议没有规定报头部分的键值对有多少个,空行就相当于是报头结束的标志(或者是报头和正文之间的 "分割符")

        HTTP协议在传输层依赖于 TCP 协议,而 TCP 是面向字节流的,没有空行就可能出现"粘包问题"

URL

URL(Uniform Resource Locator),统一资源定位符,也是我们常说的 "网址",用于在互联网上标识和定位地址

URL组成

  • 协议方案名: 用于访问资源的协议类型,常见的有 HTTP 和 HTTPS
    • 例如,在 “https://www.example.com” 中,“https” 就是协议部分。
  • 登录信息: (已过时)现在网站一般不会使用URL进行身份认证了
  • 服务器地址: 可以是 IP,也可以是 域名(域名会通过DNS解析成IP)
  • 服务器端口号: IP确定唯一的主机,端口号确定主机上的程序(端口号省略时,浏览器会通过协议类型自动分配端口号(HTTP协议,浏览器自动加上 80 端口号,HTTPS 协议,浏览器自动加上 443 端口号)
    • 例如,“https://www.example.com:8080” 中的 “8080” 就是端口号。
  • 带层次的文件路径: 确定服务器上的具体资源(包含很多网页,图片....)
    • 例如,在 “https://www.example.com/somepage.html” 中,“/somepage.html” 就是路径部分。
  • 查询字符串(Query string): 键值对结构,针对要访问的资源进补充说明
    • 键值对之间,使用 "&" 分割
    • 键和值之间,使用 "=" 分割
    • 例如,“https://www.example.com/search?q=keyword&page=2” 中的 “q=keyword&page=2” 就是查询字符串。( "?" 后面的就是查询字符串)
    • query string中的内容,一般是程序员自定义的
  • 片段标识符: 表示一个页面中某个部分的,常见于文档类网站
    • 例如,在 “https://www.example.com/page.html#section2” 中,“#section2” 就是片段标识符,它可以用于在页面加载后直接定位到特定的章节或部分。

URL中可以省略的部分

  • 协议名:省略后默认为 https://
  • IP地址/域名: 在HTML中可以省略, 省略后表示服务器的 ip/域名 与当前 HTML 所属的 ip/域名 一致
  • 端口号: 根据协议自动添加端口号. HTTP协议通常为 80 端口号,HTTPS协议通常为 443 端口号
  • 带层次的文件路径: 省略后相当于 /.  对于一些网站,当只输入域名而不指定具体路径时,服务器可能会默认返回一个特定的页面,通常是网站的首页
  • 查询字符串
  • 片段标识符

URL encode

query string 键值对结构值,可以包含各种内容, 万一值里面出现一些特殊的符号,可能是URL解析出现问题(URL中某些符号有特殊含义:例如: ":"   "="   "&"    "/"   "@"   "?"......)

URL encode 本质上就是把这些特殊含义的符号经过一些特定的规则给替换掉

转义规则:把要转义的字符/汉字,每个字节用 十六进制 的方式表示出来,给每个字节前面加上 % 

例如: 我们在浏览器搜索一下 c++

 + 字符就被转义成了 %2B

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何使用 Python 发送带附件的电子邮件
  • 阿里云AI基础设施全面升级,模型算力利用率提升超20%
  • html 与 md 文件数据格式转换
  • Java反序列化利用链篇 | URLDNS链
  • 现代前端构建工具对比:Vue CLI、Webpack 和 Vite
  • C++【类和对象】(一)
  • Linux实用操作
  • OpenCV库学习之cv2.VideoWriter(函数)
  • 掌握 Spring:从新手到高手的常见问题汇总
  • OpenCV特征检测(2)边缘检测函数Canny()的使用
  • Spring在不同类型之间也能相互拷贝?
  • 【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL77
  • Linux 生成 git ssh 公钥
  • Linux 内核的版本控制
  • linux-系统备份与恢复-系统恢复
  • [译]Python中的类属性与实例属性的区别
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • jdbc就是这么简单
  • leetcode388. Longest Absolute File Path
  • PHP 7 修改了什么呢 -- 2
  • Puppeteer:浏览器控制器
  • react 代码优化(一) ——事件处理
  • 安卓应用性能调试和优化经验分享
  • 初探 Vue 生命周期和钩子函数
  • 创建一个Struts2项目maven 方式
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 力扣(LeetCode)965
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 软件开发学习的5大技巧,你知道吗?
  • 使用putty远程连接linux
  • 一天一个设计模式之JS实现——适配器模式
  • 运行时添加log4j2的appender
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • Spring第一个helloWorld
  • 进程与线程(三)——进程/线程间通信
  • 容器镜像
  • ​Linux·i2c驱动架构​
  • (C#)获取字符编码的类
  • (C++哈希表01)
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转) ns2/nam与nam实现相关的文件
  • (转)iOS字体
  • (转)visual stdio 书签功能介绍
  • (转载)hibernate缓存
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • **python多态
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET delegate 委托 、 Event 事件
  • .NET Remoting学习笔记(三)信道
  • .NET 表达式计算:Expression Evaluator
  • .NET 中什么样的类是可使用 await 异步等待的?