HTTP(上) - 认识HTTP报文的格式及内容

目录

一、HTTP是什么?

二、认识HTTP报文

📌第一部分:使用工具fiddler抓包

1. 安装工具

2. fiddler原理

3. 尝试抓包

3.1 查看请求数据         3.2 查看响应数据

📌第二部分:分析报文内容

1. 请求报文

1.1 首行   1.2 报头   1.3 空行   1.4 正文

2. 响应报文

2.1 首行   2.2 报头   2.3 空行   2.3 正文

、框图总结​编辑


一、HTTP是什么?

HTTP是客户端服务器进行交互的协议,采用一问一答的方式。

二、认识HTTP报文

在认识HTTP报文之前,我们来学习使用一个抓包工具fiddler,这有助于我们分析HTTP报文。

📌第一部分:使用工具fiddler抓包

1. 安装工具

2. fiddler原理

3. 尝试抓包

不成功:抓不到包的异常分析

成功:可查看所抓的请求数据与响应数据

3.1 查看请求数据

① 找到要查看的网址

② 双击蓝色抓包网址 -> 在右侧的显示内容中点击raw -> view in notepad在记事本打开

③ 请求报文协议如下

3.2 查看响应数据

① Raw -> Response... -> View in Notepad

②查看响应协议

 注意:点击的Response..意思是解压,如果不进行解压查看到的响应内容将会有乱码。

下图则是未解压前显示的内容:

📌第二部分:分析报文内容

既然学会了如何利用工具抓包观察协议格式,现在我们分别啦分析一下请求与响应数据的详细内容

1. 请求报文

1.1 首行

1.1.1 URL

平时我们俗称的 "网址" 其实就是说的 URL (Uniform Resource Locator 统一资源定位符)。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。URL 的详细规则由 因特网标准RFC1738 进行了约定.(https://datatracker.ietf.org/doc/html/rfc1738)

该文件中明确写出了HTTP的URL格式以及相关解释:

我们还是来看看中文版本的吧 ~ 相比之下有些不同,英文格式中省略了可省略的一部分

① 协议方案名:常见的有 http 和 https, 也有其他的类型例如访问 mysql 时用的jdbc:mysql。

② 登录信息:现在的网站进行身份认证一般不再通过 URL 进行了. 一般都会省略。

③ 服务器地址host:明确IP地址才能找到对应的服务器。此处是一个 "域名",域名会通过 DNS 系统解析成一个具体的 IP 地址。

④ 服务器端口号port:端口号可以区分是哪个应用程序。如果没有指定将会使用默认端口号,例如 http 协议默认使用 80 端口, https 协议默认使用 443 端口。

明确了IP地址还不够,还必须确定是服务器的哪个应用程序在工作,所以需要明确服务器端口号。

⑤ 文件路径path:确定访问的资源。一个应用程序可能管理多个资源,一次请求访问一个资源,到底要访问哪一个就需要通过文件路径来确定。

⏳ 请求资源的过程:

ip地址(找到服务器) -> 端口地址(找到应用程序) -> 文件路径(找到要访问的资源)

⏳ 看看三个URL的文件路径

应用程序管理的资源可能有很多个,如果需要访问L,文件路径可能就是A/D/L

第一个地址:访问的就是搜狗浏览器的首页

第二个地址:sddn网址/博客目录/创作目录/编辑页面,访问到csdn的编辑博客页面

第三个地址:qq邮箱/cgi-bin目录/frame_html/查询字符串,访问到的是qq邮箱下的某个页面,这里涉及到querystring,接下来会讲到...

⑥ 查询字符串searchpart/query string:

请求中可以带一些参数,本质是一个键值对结构;

‘?' 作为查询字符串的起始标志,'?' 后面的就是查询字符串本体;

键值对之间使用 & 分隔;

键和值之间使用 = 分隔;

其中的 key 和 value 的取值和个数, 完全都是程序员自己约定的. 我们可以通过这样的方式来自定制传输我们需要的信息给服务器。

其实就相当于:计算机系/计科xx班/同学?性别=男&年龄=21&身高=180&电话号码=111...

⑦ 片段标识符(锚点):只要用于页面内跳转。

常见于文档型网页,点击某个锚点可以定位到相关联系或者其他位置

🚩🚩🚩URL的省略

  • 协议名: 可以省略, 省略后默认为 http://
  • ip 地址 / 域名: 在 HTML 中可以省略(比如 img, link, script, a 标签的 src 或者 href 属性). 省略后表示服务器的 ip / 域名与当前 HTML 所属的 ip / 域名一致.
  • 端口号: 可以省略. 省略后如果是 http 协议, 端口号自动设为 80; 如果是 https 协议, 端口号自动设为 443.
  • 带层次的文件路径: 可以省略. 省略后相当于 / . 有些服务器会在发现 / 路径的时候自动访问/index.html
  • 查询字符串: 可以省略
  • 片段标识: 可以省略

🚩🚩🚩关于 URL encode

像 / ? : 等这样的字符,已经被url当做特殊意义理解了。因此这些字符不能随意出现。比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义。一个中文字符由 UTF-8 或者 GBK 这样的编码方式构成, 虽然在 URL 中没有特殊含义,但是仍然需要进行转义,否则浏览器可能把 UTF-8/GBK 编码中的某个字节当做 URL 中的特殊符号。

转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式

下图在搜狗浏览器中搜索c++,"+" 被转义成了 "%2B"

1.1.2 方法

① 关于GET方法

GET 方法的原始语义常用于获取服务器上的某个请求。不过实际使用的时候可以不完全遵守,也可以使用它来让服务器新增/删除/修改一个数据...

🌊 哪些场景会触发一个GET请求呢?

  • 浏览器输入一个URL,直接回车 / 点击收藏夹里收藏的网址
  • 很多HTML标签例如a,img,link,script
  • form标签
  • ajax

🌊 GET典型特点

  • 首行的第一部分为 GET
  • URL 的 query string 可以为空, 也可以不为空.
  • header 部分有若干个键值对结构.
  • body 部分通常为空

🌊 关于 GET 请求的 URL 长度问题

网上有些资料上描述: get请求长度最多1024kb 这样的说法是错误的!

HTTP 协议由 RFC 2616 标准定义, 标准原文中明确说明 does not specify any requirement for URL length - 没有对 URL 的长度有任何的限制。实际 URL 的长度取决于浏览器的实现和 HTTP 服务器端的实现。在浏览器端,不同的浏览器最大长度是不同的,但是现代浏览器支持的长度一般都很长;在服务器端, 一般这个长度是可以配置的。

② 关于POST方法

多用于提交用户输入的数据给服务器(例如登陆页面/上传文件),不过实际开发的过程中也可以使用它来获取/删除/修改数据

下面是用fiddler抓包显示的一个POST请求:

注意:浏览器和服务器交互的时候,总是需要提交一些数据给服务器,提交的过程中相关的信息可以放到query string中,也可以放到body中。query string的格式比较固定,body则可以使用更多的格式来组织。无论是GET还是POST或者其他方法,请求报文的格式都由首行、报头、空行、正文四个部分组成。

🌊 哪些场景会触发一个POST请求呢?

  • 通过 HTML 中的 form 标签可以构造 POST 请求
  • 或者使用 JavaScript 的 ajax 也可以构造 POST 请求

🌊POST的特点

  • 首行的第一部分为POST
  • URL通常没有 query string
  • header 部分有若干个键值对结构.
  • 通常有 body

🚩🚩🚩 GET与POST的区别

首先这两者可以互相替代,没有本质区别。不过使用习惯/内部结构还是有点区别的!

  • GET一般用于请求数据,POST一般用于提交数据

       (不过GET 完全可以用于提交数据, POST 也完全可以用于获取数据)

  • GET一般通过query string来传递数据,body通常为空;POST一般通过body传递数据,query string通常为空。

       (这也是一般情况,不是必须情况)

  • GET 请求一般是幂等的,POST 请求一般是不幂等的 (如果多次请求得到的结果一样, 就视为
    请求是幂等的)

       (GET请求常见的场景是获取网页内容,每次获取的网页内容需要保持一致;

          POST请求常见场景是登录,替提交的登录密码或者id可能会变化)

  • GET请求一般是可缓存的(可放到收藏夹),POST请求一般是不可缓存的(不可放到收藏夹)

       (有其他情况:GET请求中有广告型的网页,这类网页也是不可被收藏的,不可缓存)

1.1.3 版本号

目前我们主要使用的还是 HTTP1.1 和 HTTP2.0 . 当前博客讨论的 HTTP 以 1.1 版本为主
 

1.2 报头

header 的整体的格式也是 "键值对" 结构;每个键值对占一行;键和值之间使用分号分割。

GET方法的报头(访问搜狗浏览器主页)

POST方法的报头(访问网易云音乐网址的登陆界面)

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

② Content-Length:表示 body 中的数据长度;

    Content-Type:表示请求的 body 中的数据格式

 (Content-Length与Content-Type配合body使用,有body的时候才会有)

    HTTP请求中常见的数据格式:

  •  application/json: 数据为 json 格式

body格式形如:{"username":"123456789","code":"jw7l"}

  •  urlencoded(全称application/x-www-form-urlencoded): form 表单提交的数据格式

此时 body 的格式形如:title=test&content=hello

  • form-data:form 表单提交的数据格式(在 form 标签中加上 

Content-Type:multipart/form-data; boundary=----webKitFormBoundaryrGKCBY7qhFd3TrwA

------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"

③ User-Agent(简称UA):表示浏览器/操作系统的属性,描述了你在用什么设备上网

User-Agent其实是一个历史遗留问题。多年前浏览器更新迭代比较迅速,同一时间点上浏览器的种类很多,有些人用的的浏览器可以看到视频了,有些人的还只能看文字。为了兼容性,让用户使用到适合自己浏览器版本的内容,就用了User-Agent(浏览器访问服务器的时候,告诉服务器自己用的是什么高端或者低端客户端,浏览器有什么功能。服务器根据用户的User-Agent返回相应的页面)

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

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

某广告主可能会在某平台上投放广告,用户点击一次,广告主就需要支付平台一些费用。运营商/广告主就是通过reference计算跳转次数,从而计算出支付费用的。

有意思的是,所有的网络访问操作都需要经过运营商。运营商也会投放自己的广告,如果它动歪心思,劫持并破解人家的网站内容,改变其reference成自己的广告平台,就能从中获利 - 这叫做"运营商劫持"。不过各大平台也不等着人家占自己的资源,就会进行相应的防劫持操作,例如使用HTTPS加密(后续会讲HTTPS)。

⑤ Cookie

1.3 空行

空行是用来进行界定的

1.4 正文

正文有时候为空有时不为空。一般情况下GET为空,POST不为空。

正文中的内容格式和 header 中的 Content-Type 密切相关
 

2. 响应报文

2.1 首行

① 版本号

② 状态码 200 ok :这是一个最常见的状态码, 表示访问成功

其他状态码:

  • 404 Not Found 没有找到资源

浏览器输入一个 URL, 目的就是为了访问对方服务器上的一个资源. 如果这个 URL 标识的资源不存
在, 那么就会出现 404

  • 403 Forbidden 表示访问被拒绝

有的页面通常需要用户具有一定的权限才能访问(登陆后才能访问). 如果用户没有登陆就直接访问, 就容易见到 403

  • 405 Method Not Allowed 方法不被允许

前面我们已经学习了 HTTP 中所支持的方法, 有 GET, POST, PUT, DELETE 等。但是对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法)

  • 500 Internal Server Error 服务器出现内部错误 

一般是服务器的代码执行过程中遇到了一些特殊情况(服务器异常崩溃)会产生这个状态码

  • 504 Gateway Timeout

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

  • 302 Move temporarily 临时重定向

 "重定向"就相当于手机号码中的 "呼叫转移" 功能。比如我本来的手机号是000, 后来换了个新号码111,那么不需要让我的朋友知道新号码,只要我去办理一个呼叫转移业务, 其他人拨打000,就会自动转移到111上。在登陆页面中经常会见到 302. 用于实现登陆成功后自动跳转到主页。响应报文的 header 部分会包含一个 Location 字段,表示要跳转到哪个页面。

  • 301 Moved Permanently 永久重定向

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

🌊 状态码小结:

2.2 报头

响应报头的基本格式和请求报头的格式基本一致。类似于 Content-Type , Content-Length 等属性的含义也和请求中的含义一致

不过响应报文的Content-Type取值与请求报文的不一样,响应中的 Content-Type 常见取值有以下几种:

  • text/html : body 数据格式是 HTML
  • text/css : body 数据格式是 CSS
  • application/javascript : body 数据格式是 JavaScript
  • application/json : body 数据格式是 JSON

2.3 空行

2.3 正文

正文的具体格式取决于 Content-Type

三、框图总结

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值