网络原理 - 10(HTTP/HTTPS - 1)

前面的网络原理 1 - 9,按照 TCP/IP 五层协议栈,介绍了各个层次的核心协议。

应用层:自定义协议(xml,json....)

传输层:UDP/TCP

网络层:IP

数据链路层:以太网

我们这里还要返回头,再重新谈一谈应用层的一个协议 --- HTTP 协议~~(HTTP 也是基于 TCP 来实现的~~)

目录

HTTP是什么

理解"应用层协议"

[HTTP 协议的工作流程](#HTTP 协议的工作流程)

[HTTP 协议格式](#HTTP 协议格式)

抓包工具

原理

使用

抓包结果

[HTTP 请求的基本格式](#HTTP 请求的基本格式)

[HTTP 响应的基本格式](#HTTP 响应的基本格式)

协议格式总结:

完!


HTTP是什么

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

文本 ==》 字符串(能在 UTF8/GBK 等等码表上找到的合法字符)

超文本 ==》不仅仅是字符串,还可以携带一些图片,视频,音频,特殊的格式等等 ---- HTML等等...

富文本 ==》 word(可以设置行高什么什么的,在记事本中打开 word 文件会显示乱码~~)

HTTP 诞生于 1991年,已经发展为现如今最主流使用的一种应用层协议了

最新的 HTTP 3 版本也正在完善推出中~~

HTTP 往往是基于传输层的 TCP 协议实现的(1.0,1.1,2.0 版本均为 TCP,HTTP 3是基于 UDP 实现的)。目前我们主流仍然是 HTTP1.1 版本,我们此处也重点也该版本为主进行讨论~~

HTTP 协议最主要的应用场景,就是网站,浏览器和服务器之间进行传输数据。客户端(手机,PC)和服务器之间的数据交互,也很可能是 HTTP。

举个栗子:

当我们在浏览器中输入一个"百度搜索"的网址(URL)的时候,浏览器就会给百度的服务器发送一个 HTTP 请求,百度的服务器就会返回一个 HTTP 响应。

这个响应结果被浏览器进行解析之后,就展示成我们所看到的页面内容(这个过程中,浏览器就可能给服务器发送多个 HTTP 请求,服务器也会对应的返回多个响应,这些响应里面就包含了页面 HTML,CSS,JavaScript,图片,字体等等信息~)

理解"应用层协议"

我们前面已经研究了 TCP/IP,已经知道了数据能从客户端进程,经过路径的选择,跨网络传输到服务器端进程(IP + Port)

但是,仅仅只是把数据从 A 点送到 B 点就 OK 了吗???

举个栗子:

我们在 🐕东 上下单了一台笔记本,卖家[客户端] 把笔记本通过顺丰快递[传输 + 路径选择]送到买家[服务器] 就完了吗??

当然不是,买家要对产品进行使用,并且在使用完时候,对卖家进行一个打分评论~~

我们把数据从 A 端传送到 B 端,TCP/IP 解决的是顺丰的功能,而两端还要对数据进行加工处理或者使用,所以,我们还需要一层协议,不关心通信的细节,关心的是应用细节!!!

这层协议就叫做应用层协议。而应用程序是会有不同的业务场景的,所以应用层协议是有不同种类的,其中经典协议之一的 HTTP 就是其中的代表作~~

在我们刚刚举的例子中,顺丰快递相当于 TCP/IP 的功能,那么买回来的笔记本,都会附带说明书,说明书就是用来指导用户该如何使用笔记本~~此时的说明书就可以理解为用户层协议~~

HTTP 协议的工作流程

上面,我们在举了浏览器和百度的栗子~~~我们在浏览器中输入一个"网址",此时浏览器就会给对应的服务器发送一个 HTTP 请求,对方服务器接收到请求,经过处理,就会返回一个 HTTP 响应。

HTTP 协议的交互过程,是非常经典的"一问一答",但事实上,当我们访问一个网站的时候,一般涉及不止一次 HTTP 请求/响应的交互过程~~

HTTP 协议格式

HTTP 是超文本传输协议,但其仍然是一个文本格式的协议,我们可以通过 FIddler 进行抓包,分析 HTTP 请求 / 响应的细节~~

抓包工具

我们这里以 Fiddler 为例(官网地址:https://www.telerik.com/fiddler/)(安装一路 next 即可)

下载之后,在抓包前还需要一个简单的设置:

全部勾选上~~ 会提示下载一个认证证书,一定要下载~~

完成上面的操作,如果我们的电脑本身还有其他的代理程序,fq 的代理程序什么的,都要关闭,代理程序之间可能会有冲突~~

原理

Fiddler 相当于是一个 "代理",浏览器在访问 www.baidu.com 的时候,就会把 HTTP 请求先发给 Fiddler ,Fiddler 再把请求转发给百度的服务器。当百度服务器返回数据的时候,Fiddler 拿到返回数据,再把数据提交给浏览器。

因此,Fiddler 对于浏览器和百度服务器之间的交互的数据细节,是十分清楚的~~

注意:这个代理,是一个程序,而不是设备,是工作在应用层的,上述的转发,都是站在应用层的角度上的~

使用

如果我们上述的安装配置操作完全 ok,此时 fiddler,就能够抓到很多的数据包~~

左侧窗口显示了所有的 HTTP 请求/响应,我们可以选中某个请求查看详情

右侧上方显示了HTTP 请求的报文内容(我们切换到 Raw 标签页可以看到详细的数据格式)

右侧下方显示了HTTP 响应的报文内容(我们切换到 Raw 表爱你也可以看到详细的数据格式)

当我们需要查看请求和响应的详细数据时候,可以通过 View in Notepad 通过记事本打开~~

(可以使用 ctrl + a 全选左侧的抓包结果,然后 delete 键清除所有被选中的结果~)

补充:我们的系统上有任何一个程序(不一定是浏览器)此时使用了 HTTP/HTTPS,此时,都能被 fiddler 给获取到~~(我们电脑上的很多程序在我们感知不到的情况下会在后台偷偷的做很多事情~~)

打开一个网站,其实浏览器和服务器之间进行的 HTTP 交互不只是只有一次,而是通常有很多次,第一次交互是拿到这个页面的 HTML,HTML 还会依赖其他的 CSS 和 JS 图片等等,HTML 被浏览器加载之后,又会触发一些其他的 HTTP 请求,获取到 CSS JS 等等,当执行到 JS 的时候,JS 里面的代码可能又要触发很多的 HTTP 请求~~~

字体为蓝色的表示返回的是一个 HTML,往往是访问一个网站的入口请求,我们就以百度来看一下看抓包结果~~

抓包结果

我们将右侧 HTTP 请求的内容,在记事本打开,是下面的结果

但是,当我们如法炮制对下面响应进行记事本打开的时候,咦,发现是乱码呀,如下:

这个情况,是因为,当前响应数据被进行压缩了。在网络传输中,带宽是一个比较贵的硬件资源,为了节省带宽,就可以把响应进行压缩(一般是对响应进行压缩,请求不太需要)。

我们可以点击这个按钮进行解压缩

这样就 OK 啦~~

HTTP 请求的基本格式

我们此处以 百度 的搜索页面为栗子:

HTTP 请求包含 4 部分

  1. 首行

首行又包含了 3 个部分:[方法] + [URL] + [版本],三个部分使用空格来进行分割~

GET 为方法,https://www.baidu.com/ 为 URL, HTTP/1.1 为版本

  1. 请求头(Header)

从第二行,一直到最后,都是请求头,(这个请求没有正文)。里面是类似 TCP 报头/IP 报头,包含一些重要的属性信息,以文本的方式进行组织~~

报头中包含了很多键值对,每个键值对占一行,键和值之间使用 : 和 空格 来分割

此处的键值对都有那些,有什么含义,都是 HTTP 协议所规定的~~

  1. 空行

请求头最下面会有一个空行,这个空行就可以表示结束标记~

  1. 正文(body):HTTP 的载荷部分。有的 HTTP 请求有 body,有的就没有 body~~

HTTP 响应的基本格式

  1. 首行

首行也是包含 3 个部分:[版本号] + [状态码] + [状态码解释],3 个部分之间使用空格来进行分割。

HTTP/1.1 为版本号,200 为状态码,OK 为状态码描述

这里可以对状态码描述进行一点小补充:

我们在 C 语言中曾经学习了一个函数是 strerror,该函数可以把 C 语言中的 erno 翻译成一个错误信息(字符串),此处的状态码描述也是,将 200 翻译成一个字符串信息描述~~

  1. 响应头(Header):

同样的表示一些属性,用冒号分割的键值对,每组属性之间使用 \n 进行分割。

  1. 空行

遇到空行则表示 Header 部分结束

  1. 正文(Body):

空行后面的内容都是 Body,Body 允许为空字符串。如果 Body 存在,则在 Header 中会有一个 Content - Length 属性来标识 Body 的长度,如果服务器返回了一个 HTML 页面,那么 HTML 页面内容就是在 body 中~~

协议格式总结:

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

答:HTTP 协议中,并没有具体规定报头部分的键值对有多少个,空行就相当于是"报头的结束标志",或者说空行是"报头和正文之间的分隔符"。HTTP 在传输层是依赖 TCP 协议的,TCP 是面向字节流的,如果没有这个空行,就会出现"粘包问题"~~

完!

相关推荐
潘yi.29 分钟前
web技术与nginx网站环境部署
服务器·网络·nginx
whoarethenext1 小时前
初始https附带c/c++源码使用curl库调用
服务器·c++·qt·https·curl
Jtti1 小时前
Jtti:nginx服务器如何限制访问频率
服务器·网络·nginx
视觉&物联智能2 小时前
【杂谈】-人工智能驱动的网络安全威胁:新一代网络钓鱼
网络·人工智能·web安全·网络安全·安全威胁分析
学习溢出3 小时前
【网络安全】网络钓鱼的类型
网络·安全·网络安全·网络钓鱼·社会工程
KAXA_4 小时前
智能电网第5期 | 老旧电力设备智能化改造:协议转换与边缘计算
网络·硬件工程·信息与通信·智能电网
mxbb.5 小时前
我的HTTP和HTTPS
网络协议·http·https
Blossom.1185 小时前
量子网络:构建未来通信的超高速“高速公路”
网络·opencv·算法·安全·机器学习·密码学·量子计算
洁✘6 小时前
web基础与http协议
网络·网络协议·http