🌈个人主页 :努力学编程'
⛅个人推荐 :
c语言从初阶到进阶
JavaEE详解
数据结构
⚡学好数据结构,刷题刻不容缓 :点击一起刷题
🌙心灵鸡汤 :总有人要赢,为什么不能是我呢
🔭🔭🔭HTTP协议
针对我们之前所说的 TCP/UDP-IP协议,总的来说都和程序员的距离比较远,而 HTTP 是针对应用层的协议,对于我们日常开发的场景非常重要,是需要我们重点掌握的. HTTP 又称为 "超文本传输协议" 我们在浏览器每打开一个网页,都是浏览器给服务器发送请求,然后服务器发送一个响应给浏览器其中就包含我们要进行访问的数据.
HTTP 往往是基于传输层TCP协议实现的,现在 HTTP 已经有了3.0,这个是基于UDP实现的(为了更高的传输效率),只不过是在应用层重新包装了一套可靠传输机制.
HTTP协议传输数据的特点:
HTTP 是典型的一问一答的模式
我们一共有4种典型的网络通信模式:
一问一答 ->HTTP协议
一问多答 ->下载容量较大的文件
多问一答 ->上传大文件的时候.
如果我们要深入了解HTTP协议的工作流程和数据报文格式,就得使用专门的抓包工具,去研究HTTP数据包~
📡📡📡代理程序
这里我们所说的抓包工具,其本质就是一个代理程序(跑腿的~).
举个例子:
如果我现在特别想吃汉堡~但是我又不想跑路,怎么办呢,我会给俺妹妹20元,告诉她给我买个汉堡包,于是她就去买汉堡.
此时如果俺妈问俺妹妹,今天你哥有没有买汉堡吃?
俺妹就会说:买了买了~
这里的代理,一共可以分为两种:
正向代理: 帮客户端跑腿的.
反向代理: 帮服务器跑腿的.
这里我们就看代理程序距离谁近,来判断是哪个代理.
此时我妹妹就相当于代理程序,本质上就是帮助通信跑腿的,她对于整个通信的过程和信息,一定是了解的.
🔭🔭🔭fidder 抓包工具的安装
其实对于HTTP的抓包工具,是有很多的,我们通过这些工具可以很详细的了解到HTTP数据包的完整的数据格式.
- chrome内置的抓包工具
按浏览器的 F12 开发者模式 可以查看转包情况:
这些都是我访问某个网站的时候,bing和服务器交互的请求和响应的数据.
但是由于这种查看方式非常不方便,所以并不推荐用这个来查看HTTP数据包的研究.
- wireshark
这是一个老牌的抓包工具,可以用来抓HTTP,UDP,TCP,IP,以太网数据帧等数据包,专业性非常强,使用的门槛较高,所以也不推荐使用这个.
- fidder
一个老牌的抓包工具,专门用来抓HTTP数据包的软件,使用起来也非常方便,推荐使用.这里最好使用 bing 来搜索下载,国内的搜索引擎你们懂得...
Fidder 官网地址:
注意:
可能你在后面使Fiddler的时候,可能抓到的吧=包非常少,可能是因选项:
注意:勾选的时候,可能会让你签一个安全证书,我们一定要同意,否则就得重新安装Fiddler了~.
📡📡📡Fiddler 抓包过程
这里我们以 bing 为例,我们先打开 Fiddler 其中可能会有很多的http数据包,我们点击其中一个,然后 Ctrl+A 全选点击 Delete.删除所有的数据包.然后我们在浏览器中点击一个新的窗口,就会有打开bing网页时,对 bing 服务器发送的请求,注意这里的请求数据不止有一个,这些众多的数据都是发送的请求,我们研究的是带有 蓝色的,body 这列数据比较大的请求.
如何研究这个请求呢,我们打开右边的选项卡,右上方是请求的数据的详细信息,右下方是响应的详细信息.
注意:这里选中 Raw 是因为我们要将数据按行排列,否则可能会导致长的数据自动换行,最后导致没办法辨别数据到底啥时候结束.
注意有可能在响应数据的时候,出现这种情况,其实点击Raw就好,那为什么出现这个情况呢,我们知道HTTP是文本协议,但是当数据量非常大的时候,如果直接进行传输,会消耗珍贵的网络带宽资源,于是在传输之前就会对数据进行压缩,这样其实使用CPU资源替换了网络带宽资源的消耗.对于浏览器来说,可以自动对数据解压缩,但是使用 Fiddler 抓包就需要手动解压缩.点击这个就行.
解压缩后的数据:
🔭🔭🔭HTTP协议请求构成
HTTP协议是一个文本协议,本质上一个HTTP数据包就是按照 HTTP 协议的格式,构成的文本,最后写入到 TCP socket 中.
一个 HTTP 协议,往往由四个部分组成:(这里说的是请求报文的格式)
- 首行
- 请求头 header
- 空行
- 正文 body
📡📡📡首行
对于首行,我们可以细分为三个部分:
请求的方法:表示某种行为,例如: GET 表示要从服务器中获取怎样的资源
请求的 url:表示要请求的对方的网址
版本号:HTTP 协议是哪个版本的.
📡📡📡请求头(header)
对于请求头,header中包含若干行数据
本质上其实就是 "键值对" 结构
每一行是一个键值对,键和值之间使用:分割
最后我们使用 空行 来作为请求头结束的标记
注意这里的 ?0 是一个整体,表示的是 value(这个其实就是encode可以使用在线网站查找).
📡📡📡空行
最后一个 header 的后面,有一个空行,类似于 null 作为结尾.
📡📡📡正文(body)
正文并非每个请求的数据都有,它的出现一般是以 json 结构的数据出现的.我们刚才访问的 bing 网页的时候,就没有正文,它的意义就是为了给服务器传递一些必要的数据.常常对于登录页面的时候,会将账号和密码的信息,传输给服务器,这种情况一般就有正文.这里使用 gitee 为例.
这里的密码,并非是正确的密码,这里是加密过后的密码,而且这个加密后的密码也是动态变化的过几分钟就会发生改变,所以大家不用试啦~
📡📡📡HTTP协议响应构成
响应的数据包也可以大致分为4个部分
📡📡📡首行
版本号,状态码,状态码描述
这里的 ok就代表请求的数据包成功发送.
📡📡📡响应的报头(header)
首行下面,空格之前都是header.
📡📡📡空行
这里的空行和请求的空行的作用一样的,都是作为正文结束的一个标记.
📡📡📡正文
这里正文就是根据请求的信息,发送的响应的数据,这里的数据格式可能有很多,图片,文本...,这里也可以有空格(没有特殊的含义,正文本来就可以啥都可以有).
🔭🔭🔭认识URL
URL其实就是我们平时所说网址,它的作用是用来标识互联网中一个资源的唯一地址.通过URL我们就可以找到对应的数据.对于URL的格式规则做了特定的规定,如下:
比如我们随便打开一个URL:
https://cn.bing.com/search?q=Java后端开发\&PC=U316\&FORM=CHROMNe
这里的 https 是协议方案名,登录信息省略了,现在基本用不上了,服务器地址:cn.bing.com这里给的是一个域名,我们可以通过DNS转换为地址使用ping命令即可.
端口号省略了,系统会自动分配,如果是HTTP协议分配的是80,如果是HTTPS分配的是443,带层次的文件路径 search ,查询字符串 q=Java%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91&PC=U316&FORM=CHROMNe 这里的&是分割键值对的,=左边是键右边是值.最后的片段标识符这里省略了.(注意这里的查询字符串是使用了 urencode 我们可以使用解码网站进行查看).