【 初识 HTTP 协议 】

一、概念

HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的 应用层协议

在这里插入图片描述

二、发展历程

HTTP 诞生与1991年. 目前已经发展为最主流使用的一种应用层协议.

在这里插入图片描述

最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的产品已经支持了

HTTP 往往是基于传输层的 TCP 协议实现的. (HTTP1.0, HTTP1.1, HTTP2.0 均为TCP, HTTP3 基于 UDP实现)目前我们主要使用的还是 HTTP1.1 和 HTTP2.0

三、应用场景

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

在这里插入图片描述

当我们在浏览器中输入一个 搜狗搜索的 “网址” (URL) 时, 浏览器就给搜狗的服务器发送了一个 HTTP 请求, 搜狗的服务器返回了一个 HTTP 响应.这个响应结果被浏览器解析之后, 就展示成我们看到的页面内容. (这个过程中浏览器可能会给服务器发送多个 HTTP 请求, 服务器会对应返回多个响应, 这些响应里就包含了页面 HTML, CSS, JavaScript, 图片,字体等信息)

所谓 “超文本” 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是一些
其他的资源, 比如图片, 视频, 音频等二进制的数据

四、理解 “应用层协议”

我们已经学过 TCP/IP , 已经知道目前数据能从客户端进程经过路径选择跨网络传送到服务器端进程[ IP+Port ].

可是,仅仅把数据从A点传送到B点就完了吗?

我们把数据从A端传送到B端, TCP/IP 是运输数据的功能,而两端还要对数据进行加工处理或
者使用
,所以我们还需要一层协议,不关心通信细节,关心应用细节!这层协议叫做应用层协议。而应用是有不同的场景的,所以应用层协议是有不同种类的,其中经典协议之一的HTTP
是其中的佼佼者.

五、HTTP 协议的工作过程

当我们在浏览器中输入一个 “网址”, 此时浏览器就会给对应的服务器发送一个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就会返回一个 HTTP 响应.

在这里插入图片描述

事实上, 当我们访问一个网站的时候, 可能涉及不止一次的 HTTP 请求/响应 的交互过程

通过 F12 打开 chrome 的开发者工具, 切换到 Network 标签页. 然后刷新页面即可看到如下图效
果. 每一条记录都是一次 HTTP 请求/响应

在这里插入图片描述

六、HTTP 协议格式

HTTP 是一个文本格式的协议. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节

6.1 抓包工具的使用,以 Fiddler 为例. (下载地址: https://www.telerik.com/fiddler/)

在这里插入图片描述

注意:

  1. 左侧窗口显示了所有的 HTTP请求/响应, 可以双击选中某个请求查看详情.
  2. 右侧上方显示了 HTTP 请求的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
  3. 右侧下方显示了 HTTP 响应的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
  4. 请求和响应的详细数据, 可以通过右下角的 View in Notepad 通过记事本打开
  5. 可以使用 ctrl + a 全选左侧的抓包结果, delete 键清除所有被选中的结果

首次使用遇到的问题:

在这里插入图片描述

另外,作为一款代理是会和其他代理程序发生冲突的,所以当你使用抓包时要确保其他代理已经关闭.

6.2 抓包工具原理:

Fiddler 相当于一个 “代理”.浏览器访问 sogou.com 时, 就会把 HTTP 请求先发给 Fiddler, Fiddler 再把请求转发给 sogou 的服务器.当 sogou 服务器返回数据时, Fiddler 拿到返回数据, 再把数据交给浏览器.因此 Fiddler 对于浏览器和 sogou 服务器之间交互的数据细节, 都是非常清楚的

在这里插入图片描述

6.3 抓包结果

HTTP请求:
在这里插入图片描述

  1. 首行: [方法] + [url] + [版本]
  2. Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;
  3. 空行:遇到空行表示Header部分结束
  4. Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有
    一个Content-Length属性来标识Body的长度;

HTTP响应:
在这里插入图片描述

  1. 首行: [版本号] + [状态码] + [状态码解释]
  2. Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;
  3. 空行:遇到空行表示Header部分结束
  4. Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有
    一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页
    面内容就是在body中

6.4 协议格式总结

在这里插入图片描述

至于每个部分的属性细节,我们在后面会讲解!!

思考问题: 为什么 HTTP 报文中要存在 “空行”?

因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空行就相当于是 “报头的结束标记”, 或者
是 “报头和正文之间的分隔符”.HTTP 在传输层依赖 TCP 协议, TCP 是面向字节流的. 如果没有这个空行, 就会出现 “粘包问题”.


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值